2008-09-04 4 views
15

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

Спасибо.


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

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

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

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

+0

Чтобы расширить то, что написал Пит, `sp_helptext` очень полезно для выявления SQL позади любого триггера, представления, хранимые процедуры, функции и т.д. – 2008-09-04 16:04:09

ответ

15

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

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

14

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

+2

..work на 2005 - 2012 - https: // MSDN .microsoft.com/EN-US/библиотека/ms176090% 28В = sql.110% 29.aspx – Milan 2015-06-18 23:41:20

10
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>' 
1

Чтобы расширить ответ 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

это query return trigger с его именем и телом.

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' 
Смежные вопросы