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

Мое приложение основано на SQL-сервере db.

Все клиенты имеют тот же db, за исключением настроек.

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

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

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

Не изобретать игру, как это сделать?

Как получить только активные триггеры на текущем db?

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

DISABLE TRIGGER triggername ON TABLENAME

ENABLE TRIGGER triggername ON TABLENAME

Ответ 1

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

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

Используйте запрос Jeff O и немного измените его

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

Ответ 2

SELECT *
FROM sys.triggers
WHERE is_disabled = 0

Ответ 3

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

Ответ 4

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;

- полное решение

Ответ 5

select * from sys.triggers

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

Ответ 6

Вы можете запросить представление sys.triggers.

Ответ 7

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

Ответ 8

Вот запрос, который возникает, когда вы обновляете "Триггеры базы данных" в 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

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

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

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

Ответ 9

//Используем вашу базу данных

use [your_database_Name]

Select * from sys.triggers where is_disabled=0