相互にリンクするシノニムを持つデータベースがいくつかあります。シノニムの1つがランダムに誤って再作成され、データベース名に角かっこが追加されています。私は私たちが持っているすべてのスクリプトをチェックして再チェックしましたが、誰も原因ではないようです。
この時点で、同義語を削除/作成するトランザクションをログに記録できるかどうかを確認しようとしていますが、可能ですか?
実行されたログイン+クエリをログに記録することで、トリガーを使用してこれを行うことができます
ロギングテーブルを作成します
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
が削除されないようにします。