如何获取数据库上的活动触发器列表?

LaB*_*cca 13 sql-server triggers sql-server-2008-r2

我的应用程序基于sql server db.

除自定义外,所有客户都具有相同的数据库.

一些自定义包括:新表,修改表,自定义视图,自定义触发器......

当我运行软件更新时,会执行一些脚本.现在我在脚本完成后手动禁用触发器并重新启用.

无论如何,我想自动禁用所有触发器(已启用,可能已经禁用其中一些),然后在最后重新启用它们.

不要重新发明,怎么做?

如何只获取当前数据库上的活动触发器?

一旦我得到这个,我可以以编程方式创建和运行

DISABLE TRIGGER triggername ON TABLENAME

ENABLE TRIGGER triggername ON TABLENAME
Run Code Online (Sandbox Code Playgroud)

Jaq*_*ues 21

select objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled') 
Run Code Online (Sandbox Code Playgroud)

1表示真,0表示明显错误

使用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 
Run Code Online (Sandbox Code Playgroud)

或者将其添加为where子句.

where TRIG.is_disabled = 0 -- or 1 depends on what you want
Run Code Online (Sandbox Code Playgroud)

  • 注意:"数据库触发器"没有关联的表,因此其"parent_id"为0.因此上面的"内部连接"将不匹配.仅供未来的读者使用,因为这是公认的答案. (3认同)

Lam*_*mak 11

SELECT *
FROM sys.triggers
WHERE is_disabled = 0
Run Code Online (Sandbox Code Playgroud)


Jef*_*ffO 6

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
Run Code Online (Sandbox Code Playgroud)