我可以选择所有具有多个更新触发器的表格吗?以下代码选择具有多个触发器的所有表,但我只需要具有多个更新触发器的表。 该查询还返回带有一个插入触发器和一个更新的表,这不是我想要的。我可以使用多个更新触发器选择所有表格吗?
SELECT * FROM sys.triggers
WHERE parent_id IN(SELECT parent_id
FROM sys.triggers
GROUP BY parent_id
HAVING COUNT(*)>1)
我可以选择所有具有多个更新触发器的表格吗?以下代码选择具有多个触发器的所有表,但我只需要具有多个更新触发器的表。 该查询还返回带有一个插入触发器和一个更新的表,这不是我想要的。我可以使用多个更新触发器选择所有表格吗?
SELECT * FROM sys.triggers
WHERE parent_id IN(SELECT parent_id
FROM sys.triggers
GROUP BY parent_id
HAVING COUNT(*)>1)
您应该能够从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;
不是很可靠,但它应该工作,如果你需要快速和肮脏的东西。
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)
这是不是很有效,依赖于“AFTER UPDATE”被使用(你也可以说“FOR UPDATE”),并且使用syscomments还引入了“AFTER UPDATE”或“FOR UPDATE”跨越8000字符标记并因此不会真正出现的风险这个 是不太可能的,因为它看起来非常接近对象定义的开始)。这些信息在元数据/目录视图中是可用的,允许您在不诉诸强力字符串解析的情况下确定这些内容。 – 2009-11-26 23:42:02
PS为了避免sys.syscomments问题(它只提供向后兼容性并且有一天会被弃用),我建议您熟悉sys.sql_modules(其定义列不限于8KB)和函数OBJECT_DEFINITION。 – 2009-11-26 23:44:56
我同意,如果您需要一次性使用的东西,这是快速和肮脏的。我更喜欢你的解决方案... – Sparky 2009-11-27 00:25:28
这工作。谢谢Aaron! – 2009-11-26 23:55:59