第八章触发器- - JavaEye技术网站
触发器的基本概述
在SQLServer2005中,存储过程和触发器都是SQL语句和流程控制语句的集合,就本质而言,触发器也是一种存储过程,它是一种在基本表被修改时自动执行的内嵌过程,主要通过事件进行触发而被执行,而存储过程可以通过存储过程名字而被直接调用,当对某一张表进行如UPDATE,INSERT,DELETE这些操作时,SQLServer就会自动执行触发器所定义的SQL语句.从而确保对数据的处理符合由这些SQL语句所定义的规则.触发器的主要作用是其能实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性.

优点:
由于在触发器中可以包含复杂的处理逻辑,因此,应该将触发器用来保持低级的数据的完整性,而不是返回大量的查询结果.使用触发器主要可以实现以下操作:
1.强制比CHECK约束更复杂的数据的完整性
在数据库中实现数据的完整性的约束,可以使用CHECK约束或触发器来实现.但是在CHECK约束中不允许引用其他表中的列来完成检查工作,而触发器可以引用其他表中的列来完成数据的完整性的约束.
2.使用自定义的错误提示信息
用户有时需要在数据的完整性遭到破坏或其他情况下,使用预先自定义好的错误提示信息或动态自定义的错误提示信息,通过使用触发器用户可以捕获破坏数据的完整性的操作,并返回自定义的错误提示信息.
3.实现数据库中多张表的级联修改
用户可以通过触发器对数据库中的相关表进行级联修改
4.比较数据库修改前后数据的状态
触发器提供了访问有INSERT,UPDATE,DELETE语句引起的数据前后状态变化的能力.因此用户就可以在触发器中引用由于修改所影响的记录行.
5.维护规范化数据
用户可以使用触发器来保证非规范数据库中的低级数据的完整性,维护非规范化数据与表的级联是不同的,表的级联指的是不同表之间的主外键关系,维护表的级联可以通过设置表的主键与外键的关系来实现,而非规范数据通常是指在表中派生的,冗余的数据值,维护非规范化数据应该通过使用触发器来实现.

触发器的创建
语法:
CREATE TRIGGER 触发器名称
ON 表名
FOR INSERT或UPDATE或DELETE
AS
BEGIN
要执行的操作
END

示例:
CREATE TABLE USERS(
USERID INT IDENTITY PRIMARY KEY,
USERNAME NVARCHAR(20) NOT NULL,
USERPWD NVARCHAR(20) NOT NULL
)

CREATE TABLE USERTYPE(
TYPEID INT IDENTITY PRIMARY KEY,
TYPENAME NVARCHAR(20) NOT NULL,
USERID INT NOT NULL
)

--INSERT触发器
CREATE TRIGGER ADDUSERTYPE
ON USERS
FOR INSERT
AS
BEGIN
DECLARE @USERID INT
SET @USERID=@@IDENTITY
INSERT INTO USERTYPE VALUES('家人',@USERID)
INSERT INTO USERTYPE VALUES('同学',@USERID)
INSERT INTO USERTYPE VALUES('同事',@USERID)
INSERT INTO USERTYPE VALUES('朋友',@USERID)
END

INSERT INTO USERS VALUES('zhanghaidang','wdpc');
可以看到USERTYPE表插入了四条记录

--DELETE触发器
CREATE TRIGGER DELUSERTYPE
ON USERS
FOR DELETE
AS
BEGIN
IF @@ROWCOUNT=0
RETURN
ELSE
BEGIN
DECLARE @USERID INT
--注意,这里是DELETED,后面多了一个D,下面专门介绍DELETED
--SELECT @USERID=USERID FROM DELETED
--DELETE FROM USERTYPE WHERE USERID=@USERID
DELETE FROM USERTYPE WHERE USERID in (SELECT USERID FROM DELETED)
END
END

DELETE FROM USERS WHERE USERID=4

触发器有2个专用表
一个是Inserted,其中的数据记录的是更新后的数据
一个是Deleted,其中的数据记录的是更新前的数据

当对某张表建立触发器后,分3种情况讨论
1.插入操作(Insert)
Inserted表有数据,Deleted表无数据

2.删除操作(Delete)
Inserted表无数据,Deleted表有数据

3.更新操作(Update)
Inserted表有数据(新数据),Deleted表有数据(旧数据)

简单来说: 删除的数据保存在deleted表中 插入的数据保存在inserted表中

--UPDATE触发器
CREATE TABLE USERRECORD(
RECORDID INT IDENTITY PRIMARY KEY,
RECORDNAME NVARCHAR(20) NOT NULL,
RECORDPHONE NVARCHAR(20) NOT NULL,
TYPEID INT,
USERNAME NVARCHAR(20) NOT NULL
)

CREATE TRIGGER UPDATEUSERS
ON USERS
FOR UPDATE
AS
BEGIN
DECLARE @OLDUSERNAME NVARCHAR(20),@NEWUSERNAME NVARCHAR(20)
SELECT @OLDUSERNAME=USERNAME FROM DELETED
SELECT @NEWUSERNAME=USERNAME FROM INSERTED
UPDATE USERRECORD SET USERNAME=@NEWUSERNAME WHERE USERNAME=@OLDUSERNAME
END

UPDATE USERS SET USERNAME='wujinghui' WHERE USERID=4
郑重声明:资讯 【第八章触发器- - JavaEye技术网站】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——