0

私は、別のプログラマーチームによって何年も維持されていたSQLServer2008のインストールを使用しています。

サーバーの特定のテーブルからデータの行が不思議に消えているように見えるという問題があります。

テーブルがいつ変更されたか、および変更の概要を教えてくれる、ある種の監視システムをセットアップできるようにしたいと思います。

「トリガー」は私が探しているものかもしれないと思いますが、私はこれまでそれらを使用したことがありません。トリガーは私が使用したいものですか?もしそうなら、それらを使用することを学ぶための良いリソースは何ですか?より良い解決策はありますか?

私が参照しているテーブルはそれほど頻繁に更新されていないことを言及する必要があると思いますので、少しのオーバーヘッドを追加することは大したことではないと思いますが、私が一掃できるソリューションを望んでいます問題が解決したら。

4

4 に答える 4

2

FOR DELETEトリガーは、削除される行をキャプチャするのに役立ちます。監査テーブル(監視するテーブルのコピー)を作成してから、次のコードをトリガーに追加できます。

INSERT INTO [Your Audit Table]
SELECT * FROM deleted

また、FORXMLに関連する「より高度な」シナリオもいくつか見ました。

トリガーがレコードを削除しているユーザーを特定するのに役立つかどうかはわかりませんが、レコードが削除されていること、おそらく何時などを証明できる可能性があります。これにより、トラブルシューティングをさらに進めることができます。

于 2012-10-05T19:25:55.490 に答える
2

次のサンプルは、探しているものの基本的な考え方です。

CREATE TABLE MyTestTable(col1 int, col2 varchar(10));
GO

CREATE TABLE MyLogTable(col1 int, col2 varchar(10), ModDate datetime, ModBy varchar(50));
GO

CREATE TRIGGER tr_MyTestTable_IO_UD ON MyTestTable AFTER UPDATE, DELETE
AS
    INSERT MyLogTable
    SELECT col1, col2, GETDATE(), SUSER_SNAME()
    FROM   deleted;
GO

Insert MyTestTable Values (1, 'aaaaa');
Insert MyTestTable Values (2, 'bbbbb');
UPDATE MyTestTable Set col2 = 'bbbcc' WHERE col1 = 2;
DELETE MyTestTable;
GO

SELECT * FROM MyLogTable;
GO

ただし、トリガーによってキャッチされないレコードを削除する方法はまだあることに注意してください。(TRUNCATE TABLEおよびさまざまな一括更新コマンド。)

于 2012-10-05T19:33:01.063 に答える
1

別の解決策は、特定の条件でSqlProfilerをデータベースに接続することです。これにより、検査のために実行されたすべてのクエリがログに記録されます。

私はトリガーから離れるのが好きですが、Draghonが言ったようにそれらはあなたの問題を助けることができます

于 2012-10-05T19:22:38.247 に答える
0

私はあなたがそれを理解したと思います。トリガーは、取得できる限りデータに近いため、おそらく最善の策です。コード(プログラミングまたはストアドプロシージャ)を検査しても、トリガーほどの保証は得られません。この場合の削除トリガー。

この記事をチェックしてください:http ://www.go4expert.com/forums/showthread.php?t = 15510

于 2012-10-05T19:19:46.630 に答える