none
レコード削除の履歴を残したい RRS feed

  • 質問

  • SQL Server 2008 R2を使用しています。
    クライアントにインストールされたVB6.0で開発されたプログラムPG001があり、
    PG001がSQL ServerのDBに対してテーブル・列・レコードの追加、変更、削除の操作をするのですが、
    SQL Server側で「レコードの削除」の操作を記録したいと考えています。
    「○○というコンピュータが、何時、○○○のレコードを削除した」という内容が欲しいです。

    上記を可能にする機能はありますでしょうか?
    削除には1行削除の場合と複数選択の場合とあります。

    よろしければ、設定方法なども教えていただけると助かります。
    諸先輩方、ご教示をお願いします。

    2012年10月17日 0:48

回答

  • 試していませんが、以下のようにすればよいのではないでしょうか?

    INSERT INTO tbl_test_Log(code, name, memo, date, hostname)
                              SELECT code, name, memo, getdate(), (SELECT host_name FROM sys.dm_exec_sessions WHERE session_id=@@SPID)
    FROM deleted

    #getdate()は、より精度の高いsysdatetime()を使うこともできます。
    #nameやdateなど予約語とぶつかりそうな列名は避けた方が無難だと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/




    • 編集済み trapemiya 2012年10月17日 5:58 予約語について追加
    • 回答としてマーク lixy 2012年10月17日 6:41
    2012年10月17日 5:52

すべての返信

  • トリガーで処理されてみてはいかがでしょうか?

    (参考)
    削除時のトリガについて
    http://oshiete.goo.ne.jp/qa/4653022.html

     


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2012年10月17日 1:03
  • trapemiyaさん、ありがとうございます。
    教えていただいたURLを確認させていただきましたが、初心者の私にはあのSQL文をどこに記述していいのやら。。という具合で解決には至りませんでした。
    ただ、SQL Serverのトリガーという機能について調べたところ、削除した行を別のテーブルに記録しておくことができるようになりました。(下記ソース)
    後は、そのログ用テーブルに対して、削除日時や削除を実行したコンピュータ名を記録できれば良いのですが、お分かりになりますでしょうか?
    =======================
    USE [Test_DB]
    GO
    /****** Object:  Trigger [dbo].[トリガーサンプル]    Script Date: 10/17/2012 13:56:42 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER TRIGGER [dbo].[トリガーサンプル] ON [dbo].[tbl_test]
    AFTER DELETE
    AS
    BEGIN
    INSERT INTO tbl_test_Log(code, name, memo) SELECT code, name, memo FROM deleted
    INSERT INTO tbl_test_Log(code, name, memo) SELECT code, name, memo FROM inserted
    END
    ========================

    できればログ用のテーブルで列を[code],[name],[memo],[date],[hostname]とし、[date]には削除日時、[hostname]には削除処理を行ったPCのコンピュータ名を記録したいと考えています。

    • 編集済み lixy 2012年10月17日 5:03
    2012年10月17日 4:15
  • 試していませんが、以下のようにすればよいのではないでしょうか?

    INSERT INTO tbl_test_Log(code, name, memo, date, hostname)
                              SELECT code, name, memo, getdate(), (SELECT host_name FROM sys.dm_exec_sessions WHERE session_id=@@SPID)
    FROM deleted

    #getdate()は、より精度の高いsysdatetime()を使うこともできます。
    #nameやdateなど予約語とぶつかりそうな列名は避けた方が無難だと思います。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/




    • 編集済み trapemiya 2012年10月17日 5:58 予約語について追加
    • 回答としてマーク lixy 2012年10月17日 6:41
    2012年10月17日 5:52
  • 追加質問へのご返信、ありがとうございました。
    trapemiyaさんのコードの通りに書き換えたところ、正常に動作していることを確認できました。

    大変勉強になりました。 
    フォーラムをまた利用させていただくこともあると思いますので、その折にはよろしくお願いします。

    2012年10月17日 6:45