Как получить список активных триггеров в базе данных?
мое приложение основано на БД 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
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
вы можете получить имя таблицы
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