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

时间:2011-09-13 12:38:30

标签: sql-server sql-server-2008

使用Juneau(CTP3)或SQL Dependency Tracker(来自RedGate)很容易找到“依赖”给定表的所有存储过程。

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

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

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

4 个答案:

答案 0 :(得分:5)

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

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

    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%'
        );
    

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

    我写了一篇非常冗长的关于维护依赖关系的文章:

答案 1 :(得分:0)

您可以查询系统视图。

Here is an example如何查找与某个表相关的所有SP 通过一些修改,您只能找到实际包含关键字deleteinsertupdate的那些:

SELECT DISTINCT so.name, sc.text
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE (sc.TEXT LIKE '%your_table%' AND sc.TEXT LIKE '%delete%')
OR (sc.TEXT LIKE '%your_table%' AND sc.TEXT LIKE '%insert%')
OR (sc.TEXT LIKE '%your_table%' AND sc.TEXT LIKE '%update%')

这不是一个完美的解决方案(例如,它也会找到来自您的表 SELECT来自另一个的DELETE的SP,但如果您有数百个只有SELECT来自你的桌子并且不做任何其他事情的SP,至少这些将被过滤掉。

答案 2 :(得分:0)

最后,我只是对存储了proc的主副本的文件夹进行了字符串搜索。花了几个小时来查看所有的点击量,但这比尝试编写自己的工具要快。

(我不明白为什么SQL的工具与C#相比有这么限制)

答案 3 :(得分:0)

**

  

试试这个SP_Helptrigger'表名'sp_helptext'triggername',请参阅   代码,然后在触发器中查看操作部分

**