【问题标题】:Stored procedure dependencies in SQL Server Management StudioSQL Server Management Studio 中的存储过程依赖项
【发布时间】:2019-01-09 15:16:38
【问题描述】:

我对MS世界了解不多,但现在正好我必须使用SQL Server Management Studio 2008。

我的问题:我的表中有一个列,我需要查看所有可能对其进行操作的存储过程。

我尝试右键单击并转到“查看依赖项”,但这似乎并没有返回应有的所有内容。

类似这样的问题:SQL Server Dependencies 有提供 3 种解决方案的答案

  1. 付费的第三方工具。
  2. 编写自己的脚本。
  3. 将所有内容导出到文本文件并对其进行 grepping。

WTF?我错过了一些明显的东西吗?事情真的是这样运作的吗?我想这是一个非常常见的用例:你想改变表并且你想确保你不会破坏任何东西。或者,如果您是第一次使用数据库查看一个新项目,并且您想查看某些列是如何填充存储过程的。实际上没有快速简便的内置工作流程来执行此操作吗?

【问题讨论】:

  • 是的,选项是正确的。如果存储过程使用动态 sql 怎么办 - 除非该工具只是在过程的所有文本中查找列名,否则它不会真正被识别为依赖项,这会导致误报等
  • 好的,谢谢。这很不幸,我觉得有总比没有好。
  • 您可能还需要更新以解决缺少的依赖项:请参阅此处 - activ8nz.com/Blog/professional/post/2010/11/01/…
  • 感谢您的链接。没想到这些看似简单的东西竟然有这么多陷阱。

标签: sql sql-server


【解决方案1】:

如果您需要按名称查找数据库对象(例如表、列、触发器) - 请查看名为 SQL SearchFREE Red-Gate 工具,它会搜索您的整个任何类型字符串的数据库。

对于任何 DBA 或数据库开发人员来说,它都是必备工具 - 我是否已经提到它绝对免费可用于任何用途??

【讨论】:

  • SQL 搜索非常棒 - 快速从我这里找到对您的 DB +1 中某些内容的所有引用的最佳方法之一!
  • 谢谢,这将解决我的问题。我仍然对微软不只是在他们的产品中包含这个功能感到惊讶。
  • @suslik:我们很幸运,有像 Red-Gate 这样的第三方工具供应商来填补这些“漏洞”——如果它是免费的,那就更好了! :-)
  • @marc_s 有趣的是我在一个没有管理员权限的公司环境中。我实际上需要提交一张票才能安装这个软件,而且需要几天的时间!
【解决方案2】:

使用这个查询:

SELECT ROUTINE_NAME, ROUTINE_DEFINITION 
FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%YOUR COLUMN %' 
AND ROUTINE_TYPE='PROCEDURE'

【讨论】:

    【解决方案3】:

    我花了很多时间试图找到一种无需搜索文本或使用第三方应用程序即可快速识别列级别依赖关系的方法。另一个挑战是跨多个数据库查找表名可能重复的依赖关系,这会在搜索 SP 文本时导致误报。

    从 SQL 2008 开始,有一个函数可以在字段级别返回跨数据库的依赖关系。

    下面的代码有一些例外:

    • 如果在已删除的表/字段上有无效引用的存储过程,它将失败(顺便说一下,我发现这对于查找因表修改意外损坏的 SP 很有用)。
    • 在 SP 以不寻常的方式使用临时表的情况下,它不会找到所有依赖项。
    • 在某些情况下,我发现它会返回复杂存储过程的误报。

    MSDN Documentation

    此代码应在 SP 所在的数据库中运行,以便能够跨越其他数据库依赖项。

    SELECT      
    --SP, View, or Function
    ReferencingName = o.name,
    ReferencingType = o.type_desc,
    
    --Referenced Field
    ref.referenced_database_name, --will be null if the DB is not explicitly called out
    ref.referenced_schema_name, --will be null or blank if the DB is not explicitly called out
    ref.referenced_entity_name,
    ref.referenced_minor_name
    
    FROM sys.objects AS o 
    cross apply sys.dm_sql_referenced_entities('dbo.' + o.name, 'Object') ref
    where o.type in ('FN','IF','V','P','TF')
    

    【讨论】:

      【解决方案4】:

      我想知道为什么您无法通过“查看依赖项”对话框看到依赖项,因为它对我来说非常好用。不过你可以查询'sys.sql_expression_dependencies'系统视图,获取你想要的依赖信息。

      例子

      SELECT OBJECT_NAME(referencing_id),OBJECT_NAME(referenced_id)  
      FROM sys.sql_expression_dependencies 
      WHERE referenced_id = OBJECT_ID('XXX')
      

      您当然可以投射您可能需要的其他信息。

      【讨论】:

      • 这不是View Dependencies 所做的。
      • @David - 这就是 msdn 关于“查看依赖关系”的说法 - 当前对象的对象依赖关系(常规页面)列出了该对象必须存在的数据库对象才能正常工作正确和依赖于所选对象的对象。 msdn 进一步建议查询我提到的视图msdn.microsoft.com/en-us/library/ms345449(SQL.105).aspx
      • 这是它应该做的,但它不跟踪它们。如果使用任何动态 SQL,它不会跟踪它们。如果在程序的原始编译之后有任何改变,它不会改变。视图没有显示对话框没有显示的任何内容。
      【解决方案5】:

      单个查询中所有依赖对象的列表。

      从 sys.procedures A 中选择不同的 A.name 内部连接 ​​sys.sql_dependencies B 关于 A.object_id = B.object_id;

      从 sys.objects A 中选择不同的 A.name 内部连接 ​​sys.sql_dependencies B on A.object_id = B.object_id where A.type_desc = '提到你的对象类型';

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-22
        相关资源
        最近更新 更多