Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何查找在给定表中更改数据的所有存储过程和函数?_Sql Server_Sql Server 2008 - Fatal编程技术网

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

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

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

然而,我们有100个只从给定表中选择的存储过程,因此查看Juneau的结果非常耗时

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


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

您可以在系统视图中查询

如何查找与某个表相关的所有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%确定某个存储过程会更新您的表,而不是另一个,这种方法有两个改进:

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

    现在有一个缺点是sys.sql\u expression\u依赖项不是100%可靠的,但出于上述原因,我还是更愿意这样做

    不久前,我写了一篇关于维护依赖关系的相当长的文章:


    与Christian一样,实际上没有一种方法可以100%确定某个存储过程会更新您的表,而不是另一个,此方法有两个改进:

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

    现在有一个缺点是sys.sql\u expression\u依赖项不是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的所有系统生成估计计划