2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Triggerを使用して履歴テーブルを作ってみる

Posted at

備忘録として後世の自分に託す

はじめに

SQL Server データベースプロジェクトで作成する
履歴を残すテーブルを作成する

例:Departmentテーブル

CREATE TABLE [dbo].[Department]
(
  [Id] INT NOT NULL PRIMARY KEY,
  [DepartmentName] NVARCHAR(10) NULL
)

今回はDepartmentテーブルに対してinserted, update, deleteなどの操作が行われたときに履歴を残すためにTriggerを使ってみる

履歴テーブルを作成する

まずは履歴を保存しておくテーブルを作っておく

例:DepartmentHistoryテーブル

CREATE TABLE [dbo].[DepartmentHistory]
(
  [Id] INT NOT NULL PRIMARY KEY,
  [DepartmentName] NVARCHAR(10) NULL,
  [Action] NVARCHAR(10) NULL,
  [UpdateDate] DATETIME2 NULL,
)
  • [Action]:どんな操作が行われたかを保管する列
  • [UpdateDate]:更新が行われ時間を保管する列

Triggerを作成して履歴を残す処理を実装する

Triggerを追加する
今回は一例としてDepartmentテーブルに対してUPDATEが走ったときに履歴テーブルへとデータをINSERTするような処理を書いてみます。

例:DepartmentUpdateTrigger

CREATE TRIGGER [DepartmentUpdateTrigger]
  ON [dbo].[Department] // どのテーブルに対して?
  FOR UPDATE // どんな操作が行われたら?
  AS
  BEGIN
    INSERT INTO
        [dbo].[DepartmentHistory](
          [Id],
          [DepartmentName],
          [Action],
          [UpdateDate]
      )
        SELECT
          [Id],
          [DepartmentName],
          'UPDATE',
          GETUTCDATE()
        FROM
          inserted
  END
  • FOR: 今回の例ではUPDATEだが、INSERT、DELETEなどでも同じように描ける。
  • inserted: insertedテーブルからSELECTして履歴テーブルへと登録している。
    • もしDELETE文がトリガーならば、ここはdeletedで実際にdeletedしたデータがテーブルとして表されている。

以上によりDepartmentテーブルに対してデータが更新されるとDepartmentHistoryテーブルに更新が走るので試してみてください。

まとめ

爆速で履歴作れたのでいい感じだと思いました。
データベースの知識が乏しく感じるのでもっと勉強せねばならない。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?