gpt4 book ai didi

sql - 如何检测哪些存储过程更新或插入某个表?

转载 作者:行者123 更新时间:2023-12-04 18:33:49 24 4
gpt4 key购买 nike

我有许多代表存储过程的 SQL 文件,这些存储过程在数据库中被加密

是否有任何工具可以让我检测这些存储过程中的哪些更新或插入到某个表中?

也许 NOTEPAD++ 正则表达式可以帮助我实现这一点?

最佳答案

首先,无法从存储过程定义或其元数据中派生信息,毫无疑问地告诉您此过程对特定表执行插入或更新。 SQL Server 只是不维护这种类型的信息。 RegEx 可能会让你接近,但你依赖于容易出错的字符串模式。

现在,在您的特定情况下,您会增加加密的复杂性。有一些工具可以解密存储过程定义,您可以搜索它们(出于道德原因,我不会在这里将它们交给您)。

与此同时,由于您在文本文件中有未加密的版本,我建议您使用这些在虚拟数据库中临时创建过程,不加密(您必须进行某种搜索和替换以从过程声明中删除此选项)。然后您可以使用内置元数据(例如 OBJECT_DEFINITION()sys.sql_modules)来解析文本,就像您对文本文件所做的那样。创建过程后(同样,未加密),您可以执行类似这样的操作来查找在提及表名之前使用 UPDATE 关键字的存储过程:

SELECT s.name, p.name, m.definition
FROM sys.schemas AS s
INNER JOIN sys.procedures AS p
ON s.[schema_id] = p.[schema_id]
INNER JOIN sys.sql_modules AS m
ON p.[object_id] = m.[object_id]
WHERE UPPER(m.definition) LIKE N'%UPDATE%TABLENAME%';

并更改它(或添加 OR)以处理 INSERT

现在,这会导致很多误报:

  • 更新一张表,然后从您感兴趣的表中选择
  • 在评论中有更新
  • tablename 实际上包含在其他更长的对象名称中(例如,我更喜欢 Customers 而不是 Customer 的原因之一)<

但是,它应该缩小列表的范围,以便将您必须执行的手动工作减至最少,以确保您确定了正确的程序集。由于许多相同的“误报”原因,没有自动字符串解析可以让您 100% 到达那里。并且不要忘记,您可能有使用动态 SQL 并根据输入变量构建表名或整个命令的过程 - 字符串解析也无法找到它们。

关于sql - 如何检测哪些存储过程更新或插入某个表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18148474/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com