曾經以為SQL SERVER的觸發(fā)器只能觸發(fā)單行,也就是說如果一個delete觸發(fā)器,如果同時刪除多行時,只會對第一條記錄觸發(fā),后來發(fā)現了不是人家SQL SERVER不支持,而是偶腦子笨沒發(fā)現。
其實inserted和deleted兩張內部表存放了所有要插入或要刪除的記錄,可以用cursor逐次訪問里面的每條記錄,下面是一個示例,該觸發(fā)器將要刪除的記錄轉移到另一張表中:
第一步,創(chuàng)建這兩張表
create table table1([id] int primary key, [value] varchar(100))create table table2([id] int primary key, [value] varchar(100))
第二步,插入測試數據
declare @i intset @i = 1while @i <= 100begin insert into table1([id], [value]) values(@i, cast(@i as varchar)) set @i = @i + 1end
創(chuàng)建table1的delete觸發(fā)器
create trigger tr_d_table1 on table1 for deleteasbegin declare @id int, @value varchar(100) declare cur_del cursor local forward_only for select [id], [value] from deleted open cur_del fetch next from cur_del into @id, @value while @@fetch_status = 0 begin insert into table2([id], [value]) values(@id, @value) fetch next from cur_del into @id, @value end close cur_del deallocate cur_del end
現在對table1執(zhí)行delete語句,發(fā)現所有被刪除的記錄都記錄在在table2中了
delete from table1
其實inserted和deleted兩張內部表存放了所有要插入或要刪除的記錄,可以用cursor逐次訪問里面的每條記錄,下面是一個示例,該觸發(fā)器將要刪除的記錄轉移到另一張表中:
第一步,創(chuàng)建這兩張表
create table table1([id] int primary key, [value] varchar(100))create table table2([id] int primary key, [value] varchar(100))
第二步,插入測試數據
declare @i intset @i = 1while @i <= 100begin insert into table1([id], [value]) values(@i, cast(@i as varchar)) set @i = @i + 1end
創(chuàng)建table1的delete觸發(fā)器
create trigger tr_d_table1 on table1 for deleteasbegin declare @id int, @value varchar(100) declare cur_del cursor local forward_only for select [id], [value] from deleted open cur_del fetch next from cur_del into @id, @value while @@fetch_status = 0 begin insert into table2([id], [value]) values(@id, @value) fetch next from cur_del into @id, @value end close cur_del deallocate cur_del end
現在對table1執(zhí)行delete語句,發(fā)現所有被刪除的記錄都記錄在在table2中了
delete from table1