在学习牛腩新闻发布系统的过程中,学习到了触发器,说到触发器,就让我想到了存储过程。实际上,触发器是一种特殊的存储过程。
触发器的主要功能是监视用户对数据的修改,如果针对一个数据表建立触发器,则当数据表被修改(插入、更新或删除)时,SQLsever便使触发器自动执行,以便对数据的修改采用一些适当的措施,从而保证数据的完整性和安全性。
触发器的分类
刚刚接触触发器,先来了解一下常用的几种触发器吧。
After触发器
After 触发器在触发操作(Insert、Update 或Delete)后和处理完任何约束后激发。可通过指定 After 或 for 关键字来请求 After 触发器。因为 For 关键字与 After 的效果相同,所以具有 For 关键字的触发器也归类为 After 触发器。
Instead Of 触发器代替触发动作进行激发,并在处理约束之前激发。
注意:对于每个触发操作(Update、Delete和Insert),每个表或视图只能有一个 Instead Of 触发器。而一个表对于每个触发操作可以有多个 After触发器。
Instead of触发器
INSTEAD OF触发器指定执行触发器而不是执行触发 的SQL 语句,从而替代触发语句的操作。
在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。
举例:
拿牛腩新闻发布系统的触发器来说。
USE [newssystem]
GO
/****** Object: Trigger [dbo].[trigCategoryDelete] Script Date: 2019/1/12 21:00:00 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trigCategoryDelete] --建立触发器的名称
on [dbo].[category] --选择要建立触发器的表
INSTEAD OF delete --触发条件 除了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
写在最后
触发器虽然好用,但是要合理使用哦。小编就出现过因为触发器而导致的错误。