誰が更新しているのかわからない列がテーブルにあります。
テーブル名はdbo.Events
および列名は[Status]
そしてこの列の値は1または2です。
この列の行を更新しているクエリを見つけようとしています
私はテーブルに精通しています
select * from sys.sql_modules m with(nolock);
他のオプションはありますか?
ありがとう
sys.sql_modules
は役に立ちません-どの更新が特定の更新を引き起こしているのか、誰がそれを呼び出しているのかがわかりません。これが始まりです-ロギングテーブルを作成します:
CREATE TABLE dbo.UpdateLog
(
EventType SYSNAME,
Parameters INT,
EventInfo NVARCHAR(MAX),
EventDate DATETIME NOT NULL DEFAULT GETDATE(),
AppName SYSNAME NOT NULL DEFAULT APP_NAME(),
HostName SYSNAME NOT NULL DEFAULT Host_NAME(),
LoginName SYSNAME NOT NULL DEFAULT SUSER_SNAME()
);
次に、ソーステーブルを更新するためのトリガーを作成します。
CREATE TRIGGER dbo.tr_whatever
ON dbo.whatever
WITH EXECUTE AS OWNER
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS
(
SELECT 1 FROM inserted AS i
INNER JOIN deleted AS d
ON i.id = d.id -- use key column(s) here
AND i.x <> d.x -- assumes column x is not nullable
)
BEGIN
INSERT dbo.UpdateLog(EventType, Parameters, EventInfo)
EXEC sys.sp_executesql N'DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS;';
END
END
GO
これで、どのクエリがトリガーを起動したかだけでなく、誰が、いつ、どのアプリケーションからトリガーを実行したかを確認できます。