触发器
触发器的定义
触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。SQL的触发器是一个能由系统自动执行对数据库修改的语句。
触发器的作用
1.可在写入数据表前,强制检验或转换数据。
2.触发器发生错误时,异动的结果会被撤销。
3.部分数据库管理系统可以针对数据定义语言(DDL)使用触发器,称为DDL触发器。
4.可依照特定的情况,替换异动的指令 (INSTEAD OF)。
触发器的与存储过程的唯一区别
触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
触发器的分类
SQL Server 包括三种常规类型的触发器:
1.After 触发器
after代表触发器里面的命令在DML修改数据之后执行。
2.Before触发器
before代表触发器里面的命令在DML修改数据之前执行
before举例:
在emp表上面创建触发器,当输入的工资小于1000时,自动将工资修改为1000。
create or replace trigger tri_emp_sal_check
before INSERT OR UPDATE ON emp
for each row
BEGIN
IF :new.sal <1000 THEN
:new.sal :=1000;
END IF;
END;
3.登录触发器
登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。
触发器的优点
触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制用比CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
常用触发器示例
新增:
//insert
create trigger tri_insert
on student
for insert
as
declare @student_idchar(10)
select @student_id=s.student_id from students
inner join insertedion s.student_id=i.student_id
if @student_id='1'
begin
raiserror('不能插入1的学号!',16,8)
rollbacktran
end
修改:
go
update
create trigger tri_update
on student
for update
as
if update(student_id)
begin
raiserror('学号无法修改!',16,8)
rollbacktran
end
删除:
go
delete
create trigger tri_delete
on student
for delete
as
declare @student_idvarchar(10)
select @student_id=student_id from deleted
if @student_id='admin'
begin
raiserror('错误',16,8)
rollbacktran
end
==参考资料
- 周志逵等.数据库系统原理.北京:清华大学出版社,2010==