使用Juneau(CTP3)或SQL Dependency Tracker(来自RedGate)很容易找到“依赖”给定表的所有存储过程。
但是我们有100个存储过程只能从给定的表中进行选择,因此查看来自Juneau的结果非常耗时。
我需要从表中找到插入/更新/删除数据的过程。
(使用复杂的正则表达式搜索,不是一个可行的解决方案!)
答案 0 :(得分:5)
与基督徒一样,有一种方法是100%确定存储过程更新你的表而不是另一个,这种方法有一些改进:< / p>
代码:
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
通过一些修改,您只能找到实际包含关键字delete
,insert
和update
的那些:
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',请参阅 代码,然后在触发器中查看操作部分
**