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

Tsql 如何查找触发器不存在的所有表,tsql,ssms,sql-server-2016,Tsql,Ssms,Sql Server 2016,前几天,我们发现一个表有一个ModifiedDate列,但发现没有触发器来实际更新该列。现在我正试图编写一个脚本来查找所有具有ModifiedDate列但没有更新触发器的表 以下是我目前掌握的情况: 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

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

以下是我目前掌握的情况:

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'
首先,我想找到所有同时包含列和触发器的表。我能够找到包含
ModifiedDate
列的所有表,但是当我添加最后一个filter
和tr.type='tr'
时,它什么也不返回。我检查了一下,其中有一些表同时包含我要查找的列和触发器,所以我希望看到列表中的那些

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'的需要,并且父\U id\object\U id关系不需要也使用Type='TR'子句强制执行它。

sys.triggers上的object\U id是触发器的对象。要查找触发器附加到的表,您需要父项。idI尝试了此查询,但仅返回一个表的结果。似乎左连接不起作用?查询完全按照您的要求执行。为具有触发器的所有表回调值,其中该表具有名为ModifiedDate的列。我刚刚对它进行了测试,第一次得到了一行,在我添加了第二个具有相应列名和触发器的表之后得到了两行。You join logic很时髦,在下一步中不起作用,但是我的答案完全符合要求。我运行的每个测试都会得到预期的结果。您是否验证了您这边的列名等是否正确?谢谢您的帮助!您列出的第二个查询对我有效。您使用
WHERE
左侧外部联接
转换为
内部联接
。您必须允许
NULL
值,或者将适当的条件移动到
ON
子句。@HABO和他加入错误列的事实。。。?他的查询使用正确的列名(parent_id)执行他需要的操作。首先,我要查找同时包含列和触发器的所有表