加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sqlserver触发器无before的解决方案

发布时间:2020-12-12 14:59:36 所属栏目:MsSql教程 来源:网络整理
导读:由于sqlserver在同一张表不支持一个以上的级联删除(on delete cascade) 但在实际开发的时候、还是需要使用到的、所以我们不得不使用触发器来完成这项工作 问题又来了、由于从表存在外键、直接删除主表肯定是不行的、 而sqlserver的触发器没有oracle的befor

由于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的元组

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读