如何查找所有不存在触发器的表
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' 子句强制执行它。
前几天,我们发现一个 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' 子句强制执行它。