Как я могу получить определение (тело) триггера в SQL Server?

StackOverflow https://stackoverflow.com/questions/44034

  •  09-06-2019
  •  | 
  •  

Вопрос

Не удается найти инструмент SQL diff, соответствующий моим потребностям, я пишу свой собственный.Между таблицами INFORMATION_SCHEMA и sys у меня есть практически полная рабочая версия.Но одна вещь, которую я не могу найти в метаданных, - это определение триггера, вы знаете, фактического SQL-кода.Я что-то упускаю из виду?

Спасибо.


Спасибо, Пит, я об этом не знал!

Скотт, я работаю с очень простыми пакетами хостинга, которые не допускают удаленных подключений к базе данных.Я не знаю из спецификаций RedGate (которые я все равно не могу себе позволить), предоставляют ли они обходной путь для этого, и хотя там также есть API (например, от Apex), я не видел смысла инвестировать в решение, которое все равно потребует большего программирования с моей стороны.:)

Мое решение состоит в том, чтобы разместить на сайте страницу ASPX, которая действует как своего рода "служба схемы", возвращая собранные метаданные в виде XML.Я настроил небольшое AJAX-приложение, которое сравнивает любое количество экземпляров каталога с основным и показывает различия.Это не идеально, но для меня это важный шаг вперед.

Еще раз спасибо!

Это было полезно?

Решение

sp_helptext работает для получения sql, который составляет триггер.

Текстовый столбец в представлении syscomments также содержит sql, используемый для создания объекта.

Другие советы

Для 2005 и 2008 годов вы можете использовать ОБЪЕКТ_ОПРЕДЕЛЕНИЕ() функция

SELECT     
    DB_NAME() AS DataBaseName,                  
    dbo.SysObjects.Name AS TriggerName,
    dbo.sysComments.Text AS SqlContent
FROM 
    dbo.SysObjects INNER JOIN 
        dbo.sysComments ON 
        dbo.SysObjects.ID = dbo.sysComments.ID
WHERE   
    (dbo.SysObjects.xType = 'TR') 
    AND 
    dbo.SysObjects.Name = '<YourTriggerName>'

Чтобы расширить ответ SQLMenace, вот простой запрос для возврата всех триггеров и их определений из базы данных:

SELECT 
    sysobjects.name AS trigger_name, 
    OBJECT_NAME(parent_obj) AS table_name,
    OBJECT_DEFINITION(id) AS trigger_definition
FROM sysobjects 
WHERE sysobjects.type = 'TR' 

этот запрос возвращает триггер с его именем и телом.

Select 
    [tgr].[name] as [trigger name], 
    [tbl].[name] as [table name] , 
    OBJECT_DEFINITION(tgr.id) body

    from sysobjects tgr 

    join sysobjects tbl
    on tgr.parent_obj = tbl.id

WHERE tgr.xtype = 'TR'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top