Mau*_*rez 2 sql sql-server-2008
我有许多表示存储过程的SQL文件,这些存储过程在数据库中加密.
是否有任何工具允许我检测哪些存储过程更新或插入某个TABLE?
也许NOTEPAD ++正则表达式可以帮助我实现这一目标?
Aar*_*and 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%';
Run Code Online (Sandbox Code Playgroud)
并改变它(或添加一个OR)来处理INSERT.
现在,这可能导致许多误报:
tablename实际上是包含在其他,长对象名称(我喜欢的原因之一Customers了Customer,例如)但是,它应该缩小列表范围,以便尽可能减少您必须进行的手动工作,以确保您已确定正确的程序集.没有自动化的字符串解析会让你100%因为许多相同的"误报"原因.并且不要忘记您可能有使用动态SQL的过程并从输入变量构建表名或整个命令 - 也不会找到字符串解析.
小智 6
这对我有用:
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
Run Code Online (Sandbox Code Playgroud)
这是结果:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16769 次 |
| 最近记录: |