有没有办法获得可以更新SQL中特定列的所有存储过程?

时间:2011-02-24 09:19:42

标签: sql-server ssms

我在表中有一个字段意外地改变了值。显然,存储过程导致了(我已经搜索了我们正在使用的几个触发器,并且没有登录在我们的数据库中的任何表上都有更新授权),并且我正在查找哪个触发器。

如果我在Visual Studio中说,我只会在该字段上执行“查找所有引用”,任务很简单。

是否有适用于SQL的工具?我知道SSMS的“查找对象依赖”功能,但这只会使用表而不是特定字段返回存储过程(和视图)。 (不幸的是,我的表加入了数以千计的SQL查询)

列名称为“活动”,因此对我的数据库架构进行文本搜索也不会有太大帮助(我有数百个带有这样字段的表)

基本上我看到的两个选项是:

  • 编写复杂的正则表达式以匹配更新。编写这样的正则表达式可能是一项艰巨的任务(因为SQL的所有syntaxix微妙之处)。
  • 使用这样做的工具。

你知道这样的工具(或者这样的正则表达式,还是其他方法)?

6 个答案:

答案 0 :(得分:2)

为什么您清楚存储过程会更改值?您是否拒绝直接访问所有数据库登录?您对数据库的所有访问权限是否仅限于存储过程?如果是这样,那么搜索依赖于该表并检查它们的存储过程应该是一个相对简单的事情。

您可以使用触发器来跟踪对列的更改。我使用AutoAudit生成的触发器来跟踪更改。

触发器的好处在于它位于表级并且是数据库模式的一部分,无论如何请求对表的修改以及无论连接机制如何 - ODBC / ADO / SP /代理作业/访问链接表等

答案 1 :(得分:2)

一个"穷人"解决这个问题的方法是从数据库副本中删除该列,然后尝试查找不再有效的存储过程。有code project article声称能够为您检查所有存储的过程,或者您可以采用那里解释的概念并将其完全构建为T-SQL脚本,该脚本会吐出T-然后在适当的位置出错的SQL脚本。


从评论中 - 在这种情况下,将Active列替换为计算列。 E.g:

ALTER TABLE TableName DROP COLUMN Active
GO
ALTER TABLE TableName ADD Active as CAST(1 as bit)

(或者任何适当的数据类型)。这将打破DML语句,而SELECT仍然有效。

答案 2 :(得分:1)

查看sys.sql_dependencies。像

这样的东西
select object_name(o.object_id)
from sys.sql_dependencies sd
inner join sys.objects o
   on sd.referenced_major_id = o.object_id
inner join sys.columns c
   on o.object_id = c.object_id
   and sd.referenced_minor_id = c.column_id
where o.name = 'your_table_here'
   and c.name = 'your_column_here'

在所有存储过程上调用sp_refreshsqlmodule可能是个好主意,以确保sys.sql_dependencies是最新的。另外,请注意此方法不会捕获任何动态sql,所以如果这是一个问题,你需要找到另一种方法。

答案 3 :(得分:1)

SQL Prompt 5有Column Dependencies feature可能适合您。

答案 4 :(得分:1)

试试这个:

SELECT DISTINCT so.name
FROM sys.syscomments sc
INNER JOIN sys.objects so on sc.id=so.object_id
WHERE sc.text LIKE '%colToSearchFor =%'

这假设列名和等号之间有一个空格,所以你还需要在没有空格或更多空格/制表符等的情况下运行它。仍然没有比什么更好

答案 5 :(得分:0)

Redgate提供了一个SQL搜索工具,因此您可以在数据库中搜索您的sql代码以获取列名,这可能是一个答案。或者右键单击并将整个数据库编写到文件中,然后在该文件中查找。

我也不会把它局限于SP。我遇到这个问题的次数和被遗忘的触发器(grr触发......)......