Как получить список активных триггеров в базе данных?

мое приложение основано на БД sql server.

все клиенты имеют одинаковую БД, за исключением настроек.

некоторые настройки включают: новые таблицы, измененные таблицы, пользовательские представления, пользовательские триггеры...

когда я запускаю обновление программного обеспечения некоторые скрипты выполняются. Теперь я вручную отключаю триггеры и восстанавливаю их после завершения скриптов.

в любом случае я хотел бы автоматически отключить все триггеры (которые включены, могут быть некоторые из они могут быть уже отключены), а затем повторно использовать их в конце.

не изобретать whell, как это сделать?

как получить только активные триггеры на текущую БД?

Как только я получил это я могу программно создать и запустить

DISABLE TRIGGER triggername ON TABLENAME

ENABLE TRIGGER triggername ON TABLENAME

9 ответов


select objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled') 

1 означает true, 0 означает false очевидно

используйте запрос Джеффа О и измените его немного

SELECT  
       TAB.name as Table_Name 
     , TRIG.name as Trigger_Name
     , TRIG.is_disabled  --or objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled')
FROM [sys].[triggers] as TRIG 
inner join sys.tables as TAB 
on TRIG.parent_id = TAB.object_id 

или добавьте его как предложение where.

where TRIG.is_disabled = 0 -- or 1 depends on what you want

SELECT *
FROM sys.triggers
WHERE is_disabled = 0

SELECT 
       TAB.name as Table_Name
     , TRIG.name as Trigger_Name  
FROM [sys].[triggers] as TRIG
inner join sys.tables as TAB
on TRIG.parent_id = TAB.object_id

SELECT 
    TAB.name as Table_Name,
    TRIG.name as Trigger_Name,
    Comments.Text TriggerText
FROM [sys].[triggers] as TRIG
    Inner Join sys.tables as TAB on TRIG.parent_id = TAB.object_id
    Inner Join syscomments Comments On TRIG.object_id = Comments.id
WHERE
    TRIG.is_disabled = 0;

является полным решением


select * from sys.triggers

здесь object_id для таблицы так от присоединения sys.table вы можете получить имя таблицы


вы можете запросить sys.триггеры вид.


select so.name, text
from sysobjects so, syscomments sc
where type = 'TR'
and so.id = sc.id
and text like '%related_table_name%'

вот запрос, который возникает при обновлении "триггеров базы данных" в SSMS.

SELECT
tr.name AS [Name],
'Server[@Name=' + quotename(CAST(
        serverproperty(N'Servername')
       AS sysname),'''') + ']' + '/Database[@Name=' + quotename(db_name(),'''') + ']' + '/DdlTrigger[@Name=' + quotename(tr.name,'''') + ']' AS [Urn],
tr.is_disabled AS [IsEnabled]
FROM
sys.triggers AS tr
WHERE
(tr.parent_class = 0)
ORDER BY
[Name] ASC

используя это, я создал версию (которая улучшает принятый ответ), чтобы включить триггеры базы данных.

обратите внимание на левое соединение и проверку объединения.

SELECT  
       COALESCE(TAB.name, 'DATABASE') as TargetObjectName
     , TRIG.name as Trigger_Name
     , TRIG.is_disabled  --or objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled')
     -- select *
FROM [sys].[triggers] as TRIG 
left join sys.tables as TAB 
on TRIG.parent_id = TAB.object_id 
WHERE
/* (TRIG.parent_class = 0) and */
TRIG.is_disabled = 0

/ / Используйте Свою Базу Данных использовать [имя базы данных]

выберите * из sys.триггеры, где is_disaabled=0