Как я могу получить определение (тело) триггера в SQL Server? - PullRequest
20 голосов
/ 04 сентября 2008

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

Спасибо.


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

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

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

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

Ответы [ 5 ]

22 голосов
/ 04 сентября 2008

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

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

16 голосов
/ 04 сентября 2008

Для 2005 и 2008 вы можете использовать функцию OBJECT_DEFINITION ()

15 голосов
/ 03 февраля 2015
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>'
4 голосов
/ 24 марта 2017

Чтобы расширить ответ 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' 
0 голосов
/ 30 января 2018

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

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'
...