2

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

是否有任何工具可以让我检测这些存储过程中的哪些是 UPDATE 或 INSERT 到某个 TABLE 中?

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

4

3 回答 3

11

首先,没有办法从存储过程定义或其元数据中派生出信息,这些信息毫无疑问会告诉您该过程对特定表执行插入或更新。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 并从输入变量构建表名或整个命令的过程 - 也没有字符串解析会找到这些。

于 2013-08-09T15:01:13.197 回答
7

这对我有用:

select distinct o.name, o.type_desc, dep.is_updated
FROM sys.sql_modules   m 
INNER JOIN sys.objects o ON m.object_id=o.object_id
INNER JOIN sys.sql_dependencies dep ON m.object_id = dep.object_id
INNER JOIN sys.columns col ON dep.referenced_major_id = col.object_id
INNER JOIN sys.tables tab ON tab.object_id = col.object_id
WHERE tab.name = 'BasketOrderForm'
and is_updated = 1
ORDER BY O.name

结果如下:

Name                                    type_desc               is_updated
procBasketHelperMergeBasketOrderForms   SQL_STORED_PROCEDURE    1   
procListImport_Baskets                  SQL_STORED_PROCEDURE    1   
procListTransferInsertBasketOrderForm   SQL_STORED_PROCEDURE    1   
procTS360SubmitBasket                   SQL_STORED_PROCEDURE    1   
procTS360TransferBasketToUsers          SQL_STORED_PROCEDURE    1   
tdBasketLineItems                       SQL_TRIGGER             1   
tuBasketOrderForm                       SQL_TRIGGER             1
于 2015-12-04T19:53:24.343 回答
1

redgate 的SQL 搜索是一个让这变得非常简单的工具。它使搜索依赖项(通过搜索单个元素,如表、列、存储过程等)变得微不足道,甚至跨数据库也是如此。最重要的是,它可以免费用于商业用途。

于 2013-08-09T14:05:52.060 回答