SQLServer

○IDENTITY(AutoNumber)のあるテーブルにINSERTする場合

CREATE TABLE [dbo].[test_table](
    [Seq] [int] IDENTITY(1,1) NOT NULL,
    [CreateDate] [datetime] NULL,
 CONSTRAINT [PK_test_table] PRIMARY KEY CLUSTERED 
(
    [Seq] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

次のSQLを実行してデータを挿入してみると

insert into test_table select GetDate();

こうなりました。

Seq         CreateDate
----------- -----------------------
          1 2016-10-05 15:57:29.117

あら不思議

○テーブルの変更履歴トリガー
 test_table に対して test_table_history に変更履歴を保存する場合、
 test_table の定義をコピーして test_table_history を作成し、フィールドの先頭に

    [Seq] [int] IDENTITY(1,1) NOT NULL,
    [Type] [nvarchar](20) NULL,
    [CreateDate] [datetime] NULL,

 を追加する。そして次のSQLでトリガーを作成する。

CREATE TRIGGER [dbo].[Tri_test_table_History] on [dbo].[test_table]
after INSERT, UPDATE, DELETE
AS 
BEGIN
 SET NOCOUNT ON;

 DECLARE @dml nvarchar(20);
 DECLARE @ins bigint;
 DECLARE @del bigint;
 SET @ins = (SELECT COUNT(*) FROM inserted);
 SET @del = (SELECT COUNT(*) FROM deleted);
 if @ins > 0 and @del > 0
  BEGIN
  SET @dml = 'UPDATE_PRE';
  insert into test_table_History 
  select @dml, getdate(), deleted.* from deleted;  
  
  SET @dml = 'UPDATE';  
  insert into test_table_History 
  select @dml, getdate(), inserted.* from inserted;
  END
 else if @ins > 0
  begin
  SET @dml = 'INSERT';
  insert into test_table_History 
  select @dml, getdate(), inserted.* from inserted;
  end 
 else if @del > 0
  begin
  SET @dml = 'DELETE';
  insert into test_table_History 
  select @dml, getdate(), deleted.* from deleted;
  end
 --else
 --例 UPDATEが0件等
END 
GO