【SQL触发器、事务、锁的概念和应用】
【SQL触发器、事务、锁的概念和应用】
1.触发器
(一)触发器概述
1.触发器的定义
触发器(Trigger)是一种特殊的存储过程,它与表紧密相连,可以是表定义的一部分。当预定义的事件(如用户修改指定表或者视图中的数据)发生时,触发器会自动执行。
触发器基于一个表创建,但是可以对多个表进行操作。因此触发器可以用来对表实施复杂的完整性约束,当触发器保存的数据改变时,触发器被自动激活,从而防止对数据的不正确修改。触发器的优点如下。
(1)触发器自动执行,在对表的数据做了任何修改(如手工输入或者使用程序采集的操作)之后立即激活。
(2)触发器可以通过数据库中的相关表进行层叠更改。这比直接把代码写在前台的做法更安全合理。
(3)触发器可以强制限制,这些限制比用CHECK约束定义的更复杂。与CHECK约束不同的是,触发器可以引用其他表中的列。
2.触发器的分类
在SQL Server系统中,按照触发事件的不同,可以把提供的触发器分成两大类型,即DDL触发器和DML触发器。
(1)DML触发器
DML 触发器为特殊类型的存储过程,可在发生数据操作语言(DML)事件时自动生效,以便影响触发器中定义的表或视图。DML事件包括 INSERT、UPDATE或DELETE语句。DML触发器可用于强制业务规则和数据完整性、查询其他表并包括复杂的 Transact-SQL语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到错误(如磁盘空间不足),则整个事务自动回滚。
(2)DDL触发器
DDL触发器将激发响应各种数据定义语言(DDL)事件。这些事件主要与以关键字CREATE、ALTER、DROP、GRANT、DENY、REVOKE或UPDATE STATISTICS开头的Transact-SQL语句对应。
(二)创建触发器
1.DML触发器
因为DML触发器是一种特殊的存储过程,所以DML触发器的创建和存储过程的创建方式有很多相似之处,创建DML触发器的基本语法如下。
CREATE TRIGGER trigger_name
ON {table|view}
{{{FOR|AFTER|INSTEAD OF}{[UPDATE [[,][INSERT][,][DELETE] ]ASsql_statement}
}
CREATETRIGGER语句中,主要参数的含义如下。
trigger_name:是要创建的触发器的名称。
table|view:是在其上执行触发器的表或者视图,有时称为触发器表或者触发器视图。可以选择是否指定表或者视图的所有者。
FOR、AFTER、INSTEAD OF:指定触发器触发的时机。
AFTER:指定触发器只有在SQL语句中指定的所有操作都已成功执行后才触发,只有在所有的引用级联操作和约束检查成功完成后,才能执行此触发器。如果仅指定FOR关键字,则AFTER是默认设置。
INSTEAD OF:指定执行触发器而不是执行触发的SQL语句,从而替代触发语句的操作。在表或视图上,每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器。
DELETE、INSERT、UPDATE:指定在表或视图上执行哪些语句时将触发触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个,需用逗号分隔这些选项。
sql_statement:指定触发器执行的Transact-SQL语句。
【例1】 创建一个触发器,当class表中的班级编号变更时,同时更新student表中的相应班级编号信息。
USE grademanager
GO
CREATETRIGGERtrig_班级信息更新
ON class
FOR UPDATE
AS
IF UPDATE(classno)
BEGIN
UPDATE student SET classno=(SELECT classno FROM inserted)
WHERE classnoIN(SELECT classno FROM deleted)
END
【例2】 创建一个触发器,用于在grademanager数据库中删除student表的一个学生信息时,级联删除该学生对应sc表中的成绩信息。
默认时,由于student表和sc表在sno列上存在外键约束,因此不允许直接删除student表中