由于sqlserver在同一张表不支持一个以上的级联删除(on delete cascade)
但在实际开发的时候、还是需要使用到的、所以我们不得不使用触发器来完成这项工作
问题又来了、由于从表存在外键、直接删除主表肯定是不行的、
而sqlserver的触发器没有oracle的before关键字、这让我们很忧伤
但是方法还是有的、sqlserver的触发器有一个字段instead of
具体原理和学术上的解释这里不讲、用通俗的方法来解释:重写关键字的功能
看如下代码:
create table a(aa int primary key);
create table b(bb int references a(aa));
insert into a values(1);
insert into b values(1);
create trigger tri_delete_a on a
instead of delete
as
begin
declare @abc int;
select @abc = aa from deleted;
delete b where bb = @abc;
delete a where aa = @abc;
end
在表a中、delete关键字已经不再是删除、而更像一个函数、其功能代码如下:
declare @abc int;
select @abc = aa from deleted;
delete b where bb = @abc;
delete a where aa = @abc;
代码中deleted是指a表中被delete的数据、看如下代码:
delete a where aa = 1
则deleted中的数据有aa=1的元组