搜索所有存储过程以更新特定列

Nea*_*ers 3 stored-procedures sql-server-2008-r2

我期待在由触发器创建的审计表,我们足够聪明来保存SUSER_NAME();我们称为列LastUpdateRef,但不是所有的旧代码已经更新为使用它(这是一个独一无二的代码,以帮助跟踪更新回到导致它们的代码)。

所以我知道有人正在更新,例如,TerminalIdTransaction表格中。我该如何回答这个问题?

向我显示所有在 Transaction 表上具有更新语句的存储过程,这些语句显式更改了 TerminalId

似乎这超出了任何易于编写的 RegEx。

一些更新语句采用这种格式,其中表名在FROM

update a
set 
    ArrivalDate = @ArrivalDateLocalTime,
    LastUpdate = SYSDATETIME(),
    LastUpdateRef = 'REFGFI168',
    LastUpdateBy = @UserID
from Flight a where etc... 
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 5

您是否有许多程序使粗略的网络然后手动消除任何误报会非常令人反感?

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%';
Run Code Online (Sandbox Code Playgroud)

涵盖此表单的最后一个案例:

;WITH x AS (SELECT ... FROM dbo.Transaction)
UPDATE x SET TerminalID = ... FROM x INNER JOIN ...;
Run Code Online (Sandbox Code Playgroud)

我不知道“更好”的 RegEx 在仅识别真正更新该列的那些,而从不识别误报方面的可靠性如何。事实上,任何与上述表达式(或您最初可能编写的任何 RegEx 表达式)匹配的真正更新语句都可以嵌入到注释或字符串中。

我建议从简单开始。如果以上产生太多误报,则变得更加精确。