【问题标题】:What DML operations a table is performing inside Stored Procedure or SQL Functions表在存储过程或 SQL 函数中执行的 DML 操作
【发布时间】:2023-04-06 12:52:01
【问题描述】:

我使用的是 SQL Server 2014。我有一些用户定义的表,例如 Customer、PurchaseOrder、User 等。我在许多存储过程中使用这些表。在某些情况下,这些存储过程几乎有 1000/1500 行长。

现在我想找出这些表在每个存储过程中执行的操作(插入/更新/删除)。

我是手动做的。但这是地狱般的努力。此外,在手动操作中,我可能会错过任何东西。

我们能否编写一个 SQL 查询,通过该查询无需打开存储过程,我就可以知道某个表在其中执行什么操作(插入/更新/删除)。

提前致谢。

【问题讨论】:

  • “现在我想找出这些表在每个存储过程中执行的操作(插入/更新/删除)。” 你的意思是什么 DML 操作正在针对您的存储过程中的哪些表执行?表不针对过程执行 DML 操作;这些表是受 DML 操作影响的表。
  • 然而,这充其量是过于宽泛了。要真正实现这一点,您需要定义过程和可以解析 SQL 并识别关键字和批处理正在执行的过程的工具。这与一项微不足道的任务。说实话,这就是好的文档发挥作用的地方。
  • 插入、更新、删除等 DML 操作。如果我们可以找出单个表,比如 Customer,在存储过程中对其执行什么类型的操作(插入/更新/删除),那对我来说也很好。
  • 从查找依赖项开始 - 这是一个常见的主题,并且发布了许多讨论和解决方案。除此之外,没有简单的方法可以确定存储过程对给定表执行哪些操作。不要忘记视图和触发器也可以“有助于”您寻求的信息。在这种情况下,良好的文档、代码编写一致性和良好的命名约定可以提供帮助。不幸的是,这些都不是开发团队的重点。需要吸取的教训。
  • 您希望查看哪些内容以及如何查看有关您的程序的信息?解释你的手动过程。您无法在系统目录视图中找到您需要的内容吗?

标签: sql sql-server stored-procedures sql-function system-stored-procedures


【解决方案1】:

根据您的要求,您可能会发现以下内容很有用。您可以搜索所有procedures/functions/triggers/views等的全文并查找匹配的关键字。

select Schema_Name(o.schema_id)[schema], o.[name], o.type_desc
from sys.sql_modules m
join sys.objects o on o.object_id=m.object_id
where 
    m.definition like '%insert%customers%' or
    m.definition like '%update%customers%' or
    m.definition like '%delete%customers%' 
order by type_desc, name

这可以帮助您缩小范围并识别潜在对象。这本身并不精确,因为它可能会找到一个过程,您可以在其中更新orders,然后在fromjoin 中使用customers

如果您有可以依赖的约定,例如 delete 将始终是 delete from customers 而不是 delete customersdelete from c from...,那么您当然可以改进匹配以增加您找到的内容的相关性。

像 Redgate 的 SQLPrompt 这样的工具在这里非常有用,因为您可以编写所有以 exec 为前缀的程序名称,将其粘贴到 SSMS 中,然后立即在弹出窗口中预览每个程序的整个程序代码。

【讨论】:

  • 正是我解决它的想法
猜你喜欢
  • 2020-03-31
  • 2016-01-07
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 2021-03-21
  • 2010-10-05
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多