私はこれを行う最も簡単な方法は、instead of
トリガーを介して、各操作のために別々のトリガーを使用することだと思う。
create table X(ID int not null,Type int not null, Name varchar(11) not null,
Value int not null, Description varchar(38) not null);
insert into X(ID,Type,Name,Value,Description) values
(1,1,'Mike' ,100,'-'),
(2,1,'John' ,50 ,'-'),
(3,1,'Vince',10 ,'-');
go
create table Numbers (n int not null);
insert into Numbers(n) values (1),(2),(3); --TODO - May need more in future
go
create trigger T_X_I on X instead of insert
as
set nocount on;
insert into X(ID,Type,Name,Value,Description)
select i.ID,n.n,i.Name,i.Value,
CASE WHEN n.n = 1 THEN i.Description ELSE 'INSERT' END
from inserted i
cross join
Numbers n
where n.n in (1,2);
go
create trigger T_X_U on X instead of update
as
set nocount on;
merge into X
using (select * from inserted i cross join Numbers n where n.n in (1,2)) s
on
s.ID = X.ID and
s.n = 1 and
X.Type = 1
when matched then update
set Name = s.Name,Value = s.Value,Description = s.Description
when not matched then
insert (ID,Type,Name,Value,Description) values
(s.ID,s.n,s.Name,s.Value,'UPDATE');
go
create trigger T_X_D on X instead of delete
as
set nocount on;
merge into X
using (select * from deleted d cross join Numbers n where n.n in (1,2)) s
on
s.ID = X.ID and
s.n = 1 and
X.Type = 1
when matched then delete
when not matched then
insert (ID,Type,Name,Value,Description) values
(s.ID,s.n,s.Name,s.Value,'DELETE');
go
update X set
Name = CASE WHEN ID=2 THEN 'Monica' ELSE 'Tom' END,
Value = CASE WHEN ID=2 THEN 60 ELSE 5 END
where ID in (2,3)
go
insert into X (ID,Type,Name,Value,Description)
values (6,1,'Paul',200,'-')
go
select * from X
結果::
ID Type Name Value Description
----------- ----------- ----------- ----------- --------------------------------------
1 1 Mike 100 -
2 1 Monica 60 -
3 1 Tom 5 -
2 2 Monica 60 UPDATE
3 2 Tom 5 UPDATE
6 1 Paul 200 -
6 2 Paul 200 INSERT
すでに上記のクエリでそれを置き換えること自由に感じ、Numbers
テーブルまたは同等のものを持っている場合は、私は、これらが正しいことだと思います。
一時的なテーブルや監査用に別のテーブルを使用するなど、従来のアプローチを考慮して拒否したことを前提としています。 –
あなたの引き金も投稿してください。あなたはどんなエラーを出していますか? – Peter