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

问题描述:

我的应用程序基于一个sql服务器数据库。如何获取数据库中活动触发器的列表?

除自定义以外,所有客户都拥有相同的分贝。

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

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

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

不是重新发明whell,怎么做?

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

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

DISABLE TRIGGER triggername ON TABLENAME 

ENABLE TRIGGER triggername ON TABLENAME 
+0

可能重复:检查是否触发是启用还是禁用?](http:// stackoverflow。com/questions/8136937/sql-server-check-a-trigger-is-enabled-or-disabled) – michaelAngelo 2014-12-10 09:26:16

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

1表示真,0表示假明显

使用杰夫·O公司查询和修改它有点

或将其添加为where子句。

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

我选择这个答案作为答案,即使所有的都是正确的,这只是简单的“完美”。 – LaBracca 2012-03-12 16:06:19

+1

注意:“数据库触发器”没有关联的表,因此其“parent_id”为0.因此上面的“内部连接”将不匹配。只为未来的读者,因为这是公认的答案。 – granadaCoder 2016-04-07 20:56:14

您可以查询sys.triggers视图。

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你可以得到表名

下面是当你这样做时查询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 

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

这对我2005年的数据库非常有用。谢谢。 – 2017-10-25 17:27:15

//使用数据库 使用[数据库名称]

选择sys.triggers *其中is_disaabled = 0

[SQL服务器的
+0

你能否详细说明你的答案? – 2017-09-14 07:02:28