如何查找所有不存在触发器的表

How to find all tables where trigger does not exist

前几天,我们发现一个 table 有一个 ModifiedDate 列,但发现没有适当的触发器来实际更新该列。现在我正在尝试编写一个脚本来查找所有具有 ModifiedDate 列但没有触发更新它的 table。

这是我目前的情况:

SELECT so.name AS 'TableName', sc.name AS 'ColumnName', tr.name AS 'Trigger'
FROM sys.objects so
INNER JOIN sys.columns sc ON sc.object_id = so.object_id
LEFT JOIN sys.triggers tr ON so.object_id=tr.object_id
WHERE so.type = 'U' AND sc.name LIKE '%ModifiedDate%' 
AND tr.type = 'TR'

首先,我想找到同时具有列和触发器的所有 table。我能够在 ModifiedDate 列中找到所有 table,但是当我在最后一个 where 过滤器 AND tr.type = 'TR' 中添加时,它 returns 什么也没有。我检查了一下,里面有 table 有我正在寻找的列和触发器,所以我希望在列表中看到它们。

SELECT so.name AS 'TableName', sc.name AS 'ColumnName', tr.name AS 'Trigger'
FROM sys.objects so
INNER JOIN sys.columns sc ON sc.object_id = so.object_id
LEFT JOIN sys.triggers tr ON so.object_id=tr.parent_id
WHERE so.type = 'U' AND sc.name LIKE '%ModifiedDate%' 
AND tr.type = 'TR'

你在触发器上的加入是错误的

正在清理您的查询,以查找所有没有触发器的表,而它们可能应该是:

Select  t.name As 'TableName'
       ,c.name As 'ColumnName'
       ,tr.name As 'Trigger'
From    sys.tables t
Join    sys.columns c On c.object_id = t.object_id
Left Join sys.triggers tr On t.object_id = tr.parent_id
Where   c.name Like '%ModifiedDate%'
        And tr.name Is Null

我去掉了一些多余的东西。针对表进行选择消除了查找 Type = 'U' 和 parent_id\object_id 关系的需要,因此您不需要使用 Type = 'TR' 子句强制执行它。