2017-02-13 59 views
1

有一天,我们发现一个表有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列的所有表格,但是当我在最后一个过滤器中添加AND tr.type = 'TR'时,它不会返回任何内容。我查了一下,里面有一些表格,它们都有我正在寻找的列和触发器,所以我希望能看到列表中的那些表格。

+0

您使用'WHERE'将'LEFT OUTER JOIN'转换为'INNER JOIN'。您必须允许“NULL”值或将适当的条件移至“ON”子句。 – HABO

+0

@HABO他加入错误专栏的事实......?他的查询,正确的列名(parent_id)执行他所需要的。 “首先,我想找到所有同时具有列和触发器的表。” –

回答

2
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' 

您的加入是错误的触发器

清理您的查询,发现那里有所有的表NO触发,他们也许应该是:

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'子句强制执行它。

+0

sys.triggers上的object_id是触发器的对象。要找到触发器附加到您的表需要parent_id –

+0

我试过这个查询,但只能得到一个表的结果。这似乎是左连接不起作用? –

+0

该查询完全符合您的要求。为具有触发器的所有表拉回值,其中表具有名为ModifiedDate的列。我刚刚测试了一下,第一次得到了一行,两次在我添加了一个带有相应列名和触发器的第二个表之后。你加入逻辑很时髦,它不会为下一步工作,但我的答案完全符合要求。 –

相关问题