web-dev-qa-db-ja.com

テーブルの列を更新するクエリとは何ですか

誰が更新しているのかわからない列がテーブルにあります。

テーブル名はdbo.Eventsおよび列名は[Status]そしてこの列の値は1または2です。

この列の行を更新しているクエリを見つけようとしています

私はテーブルに精通しています

select * from sys.sql_modules m with(nolock);

他のオプションはありますか?

ありがとう

1
itzik Paz

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

これで、どのクエリがトリガーを起動したかだけでなく、誰が、いつ、どのアプリケーションからトリガーを実行したかを確認できます。

3
Aaron Bertrand