触发器是与表事件有关的特殊存储过程。它不能直接被执行,必须为表上的增、删、改事件所触发。外键要比触发器更快,但是我们经常会遇见外键约束的问题,触发器能解决外键不能处理的复杂关系。下面是一个实践的例子:
一、背景
在牛腩发布系统中,三个表(新闻类别、新闻、评论)之间的关系是一对多的关系,每个新闻类别可以有多条新闻,每条新闻可以有多条评论,主键为相应的id号,关系图如下:
现在在表中填充如下几条数据,关系已经在图中标明:
新进行操作“删除新闻类别表”中的任一条记录:
delete from category where id=14
报错delete语句与REFERENCE约束“ ”冲突:
解决办法:建立一个触发器,
<span style="font-family:KaiTi_GB2312;font-size:18px;">ALTER TRIGGER [dbo].[trigCategoryDelete]这样就允许删除新闻类别表中的记录了,但是删除的记录是没有下属新闻的新闻类别,如果有新闻类别又会报错:
ON [dbo].[category]
AFTER Delete
AS
BEGIN
select * from deleted
END
</span>
所以给出直观图:
向上图中如果删除新闻类别id=16的新闻(有下属新闻或评论的)必须这样编辑触发器:
ALTER TRIGGER [dbo].[trigCategoryDelete]
ON [dbo].[category]
instead of Delete
AS
BEGIN
declare @caId int
select @caId =id from deleted
--删除评论
delete comment where newsid in (select newsid from news where caId =@caId )
--删除新闻
delete news where caId =@caId
--删除类别
delete category where id=@caId
-- Insert statements for trigger here
END
总结:在牛腩新闻发布系统中,触发器这集视频资料看了四遍才弄明白,发现sql sever的内容太多了,一个标点符号,一个词语都会影响到全局。越学越发现自己知道的太少,虽然在这里花费了点时间,但学到了很多知识还是很开心,吼吼~