web-dev-qa-db-ja.com

同義語がランダムに再作成されています-ある種のトリガー/ログを作成することは可能ですか?

相互にリンクするシノニムを持つデータベースがいくつかあります。シノニムの1つがランダムに誤って再作成され、データベース名に角かっこが追加されています。私は私たちが持っているすべてのスクリプトをチェックして再チェックしましたが、誰も原因ではないようです。

この時点で、同義語を削除/作成するトランザクションをログに記録できるかどうかを確認しようとしていますが、可能ですか?

1
Jay Croghan

実行されたログイン+クエリをログに記録することで、トリガーを使用してこれを行うことができます

ロギングテーブルを作成します

CREATE TABLE DBO.SynonymTriggerLogging( ID int Identity(1,1) PRIMARY KEY NOT NULL,
                                 LoginName varchar(200), 
                                 QueryExecuted varchar(max));

トリガーを作成します(ログイン名とドロップステートメントのみをログに記録する場合)

CREATE TRIGGER SynonymTrigger
ON DATABASE
AFTER DROP_SYNONYM  
AS
INSERT INTO DBO.SynonymTriggerLogging(LoginName,QueryExecuted)
SELECT ORIGINAL_LOGIN(),EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)');

テスト

CREATE SYNONYM TEST
FOR dbo.test;

DROP SYNONYM TEST;

結果

SELECT * 
FROM DBO.SynonymTriggerLogging;

ID  LoginName   QueryExecuted
1   rvertongen  DROP SYNONYM TEST

ホスト名も必要な場合は、次の表とトリガーを使用してください

CREATE TABLE DBO.SynonymTriggerLogging( ID int Identity(1,1) PRIMARY KEY NOT NULL,
                                 LoginName varchar(200), 
                                 QueryExecuted varchar(max),
                                 HostName varchar(200));
GO
CREATE TRIGGER SynonymTrigger
ON DATABASE
FOR DROP_SYNONYM  
AS
INSERT INTO DBO.SynonymTriggerLogging(LoginName,QueryExecuted,HostName)
SELECT ORIGINAL_LOGIN(),EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)'),Host_NAME()

また、この link の例Dを見て、SYNONYMが削除されないようにします。

0
Randi Vertongen