标签:pre lte content code update arp log 类别 span
触发器事实上是一种特殊的存储过程。它仅仅有在特定的事件发生时自己主动运行。
存储过程和触发器都是SQL语句和流程控制语句的集合,存储过程通过存储过程的名字被直接调用。而触发器主要通过时间进行触发而被运行。
触发器包含DML触发器和DDL触发器。DML触发器是我们常见的一种触发器,当数据库server中发生数据操作语言(DML)事件时会自己主动运行;DDL触发器是一种新型的触发器,它在响应数据定义语言(DDL)语句时触发。一般用于数据库中运行管理任务。今天我们主要研究DML触发器。它又分为AFTER触发器和INSTEAD OF触发器两类。
AFTER触发器是记录已经改变完毕之后才被激活的运行。也就是事件已经结束触发器才被触发;INSTEAD OF触发器是用来代替原本的操作,在事件发生之前触发,这样它并不运行原先的SQL语句。而是依照触发器中的定义操作。
DML触发器响应UPDATE、INSERT、DELETE语句而激活;DDL触发器响应CREATE、ALTER、DROP、GRANT、DENY、REVOKE、UPDATE以及STATISTICS等语句而激活。
以牛腩新闻公布系统中删除新闻类别同一时候删除新闻以及评论为例。这里由于有外键约束,所以删除新闻类别的同一时候要删除该类别的新闻以及评论。由于 AFTER触发器是记录已经改变完毕之后才被激活的运行,因此我们用INSTEAD OF触发器,把之前单纯的删除类别操作替换为删除评论、新闻以及类别的操作。
这样就不会出现外键约束而导致无法删除的情况了。
<span style="font-family:KaiTi_GB2312;font-size:18px;">-- ============================================= -- Author: <邵鸿鑫> -- Create date: <2014-8-18> -- Description: <删除类别触发器> -- ============================================= 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 END </span>
1)强制比CHECK约束更复杂的数据的完整性
标签:pre lte content code update arp log 类别 span
原文地址:http://www.cnblogs.com/slgkaifa/p/6814807.html