牛腩新闻发布系统(1)级联表的操作
触发器是一种特殊类型的存储过程,它不同于普通的存储过程。触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名称而被直接调用。当往某一个表格中插入记录、修改记录或者删除记录时,SQL SERVER就会自动执行触发器所定义的SQL语句,以确保数据的完整性。
很多时候我们有这样一种需求,某一分类信息是属于另一个大的分类,当需要删除大的分类时,它下面小的分类实际也应该一起删除的,而且表之间设置了主键和外键,例如有三个表示:新闻分类表、新闻表、评论表。
![](http://my.csdn.net/uploads/201207/17/1342529672_9277.png)
它们分别为一对多的关系,如果你删除某一个新闻分类,这个分类里的新闻以及每条新闻的评论应该都删除,这三个表之间如果建立了外键,再删分类表或新闻表时就会出错,而用触发器可以很好的解决。
![](http://my.csdn.net/uploads/201207/17/1342531286_7067.png)
因此,在删除新闻分类时,要先删除它下面的新闻,即新闻表中属于该分类下的记录。
建立触发器代码如下:
![](http://my.csdn.net/uploads/201207/18/1342571285_1747.png)
在触发器中需要注意代码中红色框和绿色框框中内容,红色框中可以是Instead of 或after ,分别表示UPDATE、 INSERT 、DELETE执行之前或之后触发。
AFTER:表示只有在执行了指定的操作INSERT、DELETE、UPDATE之后触发器才被激活,执行触发器中的SQL语句。
INSTEAD OF:当为表或视图定义了针对某一操作INSERT、DELETE、UPDATE的INSTEAD OF类型触发器,且执行了相应的操作时,尽管触发器被触发,但相应的操作并不被执行,而运行的仅是触发器SQL语句本身。
这句话表明如果是INSTEAD OF类型触发器,那个执行的SQL语句本身不再执行,而是只执行触发器中内容。
如果是三个表之间级联删除和两个表之间删除类似,不同的是再删除第三表中记录时,所有的评论不会只属于一个新闻类,可以用“In”关键字,删除。如下:
![](http://my.csdn.net/uploads/201207/18/1342573069_1253.png)
可能你对触发器语句中的deleted不理解,这涉及到触发器工作原理。
每个触发器有两个特殊的表:插入表(inserted)和删除表(deleted)。这两个表是逻辑表,并且这两个表是由系统管理的,存储在内存中,不是存储在数据库中,因此不允许用户直接对其修改。这两个表的结构总是与被该触发器作用的表有相同的表结构。这两个表是动态驻留在内存中的,当触发器工作完成,这两个表也被删除。这两个表主要保存因用户操作而被影响到的原数据值或新数据值;另外这两个表是只读的,即用户不能向这两个表写入内容,但可以引用表中的数据。
触发器和事件触发一样,如单击事件,它是事件触发事件,让多个有联系的业务、操作关联起来,需要根据需要灵活使用。