如何找到更改给定表中数据的所有存储过程和函数?

Ian*_*ose 1 sql-server sql-server-2008

通过使用Juneau(CTP3)或SQL依赖关系跟踪器(来自RedGate),很容易找到"依赖"给定表的所有存储过程.

但是,我们有100个存储过程只能从给定的表中进行选择,因此查看来自Juneau的结果非常耗时.

我需要找到从表中插入/更新/删除数据的过程.

(使用复杂的正则表达式搜索,不是一个可行的解决方案!)

Aar*_*and 5

与基督徒一样的警告,没有办法100%确定存储过程更新你的表而不是另一个,这种方法有一些改进:

  1. 它使用sys.sql_modules,因此没有机会因为边界而丢失命中,或者没有捕获所有文本,因为procs> 4k
  2. 它不解析表名的对象文本,这可能导致大量的误报(仅在注释中的表名,表名是更大名称的一部分)
  3. 它为每个可能的匹配生成一个sp_helptext命令,因此您可以将输出复制并粘贴到顶部窗格中,运行它,然后快速扫描以确定是否存在任何误报.

码:

SELECT 'EXEC sp_helptext ''' 
        + QUOTENAME(SCHEMA_NAME(p.[schema_id])) 
        + '.' + QUOTENAME(p.name) + ''';'
    FROM sys.procedures AS p
    INNER JOIN sys.sql_modules AS m
    ON p.[object_id] = m.[object_id]
    INNER JOIN sys.sql_expression_dependencies AS d
    ON p.[object_id] = d.referencing_id
    WHERE d.referenced_id = OBJECT_ID('dbo.your_table_name')
    AND 
    (
        LOWER(m.[definition]) LIKE '%update%'
        OR LOWER(m.[definition]) LIKE '%insert%'
        OR LOWER(m.[definition]) LIKE '%delete%'
    );
Run Code Online (Sandbox Code Playgroud)

现在的一个弱点是sys.sql_expression_dependencies不是100%可靠的 - 但出于上述原因,我仍然更喜欢这样做.

我写了一篇很长篇的关于维护依赖项的文章: