sql-server-2008-r2 – 搜索所有存储过程以获取特定列的更新

我正在查看由触发器创建的审计表,我们足够聪明地保存了SUSER_NAME();我们有一个名为LastUpdateRef的列,但并非所有旧代码都已更新以使用它(它是一个独特的代码,可帮助将更新跟踪到导致它们的代码).

所以我知道有人正在更新,例如,Transaction表中的TerminalId.我该怎么回答这个问题?

Show me all the stored procs that have an update statement on the Transaction table that explicitly change the TerminalId

似乎这将超出任何容易编写的RegEx.

某些更新语句采用此格式,其中表名在FROM之后:

update a
set 
    ArrivalDate = @ArrivalDateLocalTime,
    LastUpdate = SYSDATETIME(),
    LastUpdateRef = 'REFGFI168',
    LastUpdateBy = @UserID
from Flight a where etc... 
最佳答案
您是否有许多程序可以获得粗糙的网络,然后手动消除任何误报将是非常令人反感的?

SELECT s.name, p.name, m.definition
  FROM sys.procedures AS p
  INNER JOIN sys.sql_modules AS m
  ON p.[object_id] = m.[object_id]
  INNER JOIN sys.schemas AS s
  ON p.[schema_id] = s.[schema_id]
WHERE LOWER(m.definition) LIKE '%update%transaction%terminalid%'
   OR LOWER(m.definition) LIKE '%update%terminalid%transaction%'
   OR LOWER(m.definition) LIKE '%with%transaction%update%terminalid%';

最后一个案例来涵盖这个表格:

;WITH x AS (SELECT ... FROM dbo.Transaction)
UPDATE x SET TerminalID = ... FROM x INNER JOIN ...;

我不知道“更好”的RegEx可以识别那些真正更新该列的那些,并且永远不会识别出误报.事实上,任何与上述表达式(或您最初可能会编写的任何RegEx表达式)匹配的真正更新语句都可以嵌入到注释或字符串中.

我建议开始简单.如果上述结果导致过多的误报,则会更精确.

转载注明原文:sql-server-2008-r2 – 搜索所有存储过程以获取特定列的更新 - 代码日志