2009-11-26 63 views
0

我可以选择所有具有多个更新触发器的表格吗?以下代码选择具有多个触发器的所有表,但我只需要具有多个更新触发器的表。 该查询还返回带有一个插入触发器和一个更新的表,这不是我想要的。我可以使用多个更新触发器选择所有表格吗?

SELECT * FROM sys.triggers 
WHERE parent_id IN(SELECT parent_id 
FROM sys.triggers 
GROUP BY parent_id 
HAVING COUNT(*)>1) 

回答

3

您应该能够从sys.trigger_events告诉这点,例如:

SELECT * 
    FROM sys.trigger_events AS te 
    INNER JOIN sys.triggers AS t 
    ON t.[object_id] = te.[object_id] 
    WHERE te.[type] IN (1,2,3); 

因此,要获得表与多个更新触发:

SELECT OBJECT_NAME(parent_id) 
    FROM sys.triggers AS t 
    INNER JOIN sys.trigger_events AS te 
    ON t.[object_id] = te.[object_id] 
    WHERE te.type_desc = 'UPDATE' 
    GROUP BY OBJECT_NAME(parent_id) 
    HAVING COUNT(*) > 1; 
+0

这工作。谢谢Aaron! – 2009-11-26 23:55:59

0

不是很可靠,但它应该工作,如果你需要快速和肮脏的东西。

SELECT * FROM sys.triggers 
WHERE parent_id IN 
(SELECT parent_id 
FROM sys.triggers tt 
JOIN sys.syscomments sc on sc.id=tt.object_id 
WHERE sc.text LIKE '%AFTER UPDATE%' 
GROUP BY parent_id 
HAVING COUNT(*)>1) 
+0

这是不是很有效,依赖于“AFTER UPDATE”被使用(你也可以说“FOR UPDATE”),并且使用syscomments还引入了“AFTER UPDATE”或“FOR UPDATE”跨越8000字符标记并因此不会真正出现的风险这个 是不太可能的,因为它看起来非常接近对象定义的开始)。这些信息在元数据/目录视图中是可用的,允许您在不诉诸强力字符串解析的情况下确定这些内容。 – 2009-11-26 23:42:02

+0

PS为了避免sys.syscomments问题(它只提供向后兼容性并且有一天会被弃用),我建议您熟悉sys.sql_modules(其定义列不限于8KB)和函数OBJECT_DEFINITION。 – 2009-11-26 23:44:56

+0

我同意,如果您需要一次性使用的东西,这是快速和肮脏的。我更喜欢你的解决方案... – Sparky 2009-11-27 00:25:28

相关问题