Sql server 如何查找在给定表中更改数据的所有存储过程和函数?
通过使用Juneau(CTP3)或SQL依赖项跟踪器(来自RedGate),很容易找到“依赖”给定表的所有存储过程 然而,我们有100个只从给定表中选择的存储过程,因此查看Juneau的结果非常耗时 我需要从表中找到插入/更新/删除数据的过程Sql server 如何查找在给定表中更改数据的所有存储过程和函数?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,通过使用Juneau(CTP3)或SQL依赖项跟踪器(来自RedGate),很容易找到“依赖”给定表的所有存储过程 然而,我们有100个只从给定表中选择的存储过程,因此查看Juneau的结果非常耗时 我需要从表中找到插入/更新/删除数据的过程 (使用复杂正则表达式的搜索不是一个有效的解决方案!)您可以在系统视图中查询 如何查找与某个表相关的所有SP。 稍加修改,您只能找到那些实际包含关键字delete、insert和update: SELECT DISTINCT so.name, sc.text
(使用复杂正则表达式的搜索不是一个有效的解决方案!)您可以在系统视图中查询 如何查找与某个表相关的所有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%')
这不是一个完美的解决方案(例如,它还会找到从您的表中选择的SP和从另一个表中删除的SP),但是如果您有数百个SP,它们只从您的表中选择,而不做其他操作,至少这些将被过滤掉。您可以在系统视图中查询 如何查找与某个表相关的所有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%')
这不是一个完美的解决方案(例如,它也会找到从您的表中选择的SP和从另一个表中删除的SP),但是如果您有数百个SP,它们只从表中选择而不做任何其他操作,那么至少这些SP会被过滤掉。与Christian的警告相同,实际上,没有一种方法可以100%确定某个存储过程会更新您的表,而不是另一个,这种方法有两个改进:
(我不明白为什么SQL工具与C相比如此有限(对于这类事情)最后,我只是对存储过程主副本的文件夹进行了字符串搜索。花了几个小时查看所有的点击,但这比尝试编写自己的工具要快 (我不明白为什么SQL工具与C语言相比在这类事情上如此有限)** 请尝试此SP_Helptrigger“表名”SP_helptext“triggername”查看 编码,然后在触发器中查看操纵部分 **** 请尝试此SP_Helptrigger“表名”SP_helptext“triggername”查看 编码,然后在触发器中查看操纵部分
**我能想到的唯一不涉及执行它们的方法是编写一些代码,为您识别的所有XML执行计划生成一个估计计划,并解析XML执行计划。当然,您可以通过只包含至少包含
insert/update/delete/merge
的定义来减少要查看的内容,即使存储过程使用条件逻辑、动态SQL或#temp
表,这也行不通。@Martin,我希望有一个工具可以解析SQL,然后建立一个详细的模型来处理SQL Server当然可以为您这样做,您可以在计划中查找感兴趣的对象上的插入、更新或删除运算符。也可以使用Microsoft.Data.Schema.ScriptDom.Sql
自己解析Sql。依赖计划的问题是,所有对象的缓存中都必须有一个计划。某些过程的调用频率可能不够高,无法放入计划缓存中,尤其是在动力不足的服务器上,弄清楚如何调用系统中的每个存储过程会很麻烦(因为许多存储过程可能具有必需的参数,更不用说不希望出现的后果了)-同样,如果系统动力不足,这可能是不可能的。我能想到的唯一不涉及执行它们的方法是编写一些代码,为您识别并解析X的所有系统生成估计计划