如何检测哪些存储过程UPDATE或INSERT进入某个TABLE?

时间:2013-08-09 14:00:28

标签: sql sql-server-2008

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

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

也许NOTEPAD ++正则表达式可以帮助我实现这个目标吗?

3 个答案:

答案 0 :(得分: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的过程并从输入变量构建表名或整个命令 - 也不会找到字符串解析。

答案 1 :(得分:2)

这对我有用:

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

答案 2 :(得分:1)

redgate的

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