|
触发器的主要作用是维护表中数据的完整性,但它比参照完整性约束更要灵活和复杂。触发器是一级 SQL 语句和流控制语句的集合,它创建在某个表上,且仅对该表起作用。创建触发器的表称为触发器表,且当在触发器表中更新数据时自动触发触发器。
1、创建与删除触发器。在SQL SERVER中,有三种创建触发器的语法。
1)第一种语法
CREATE TRIGGER trigger_name
ON table_name
FOR {insert | update | delete}
AS SQL_statements
其中:
SQL_statements : 是一组 SQL 语句和流控制语句的集合。当 SQL_statements 是两条以上的 SQL 语句时,可用关键字 BEGIN...END 把它括起来。
ON : 指定触发器表。
FOR : 指定触发器的类型。触发器的类型是指触发器表做何种更新时触发触发器,一般分为插入、修改和删除三种。触发器也可以是这三种的混合型。例如把插入和修改混合在一看书的触发器,它既在插入的时候触发,也在修改的时候触发。
例如:执行下面的语句在表 部门 上创建一个 delete 类型的触发器:
在ADP中的操作如下:在数据库窗口表节中,右键单击表 部门 选择 触发器 -- 新建
然后输入如下内容:
ALTER TRIGGER 部门_del
/* 在 部门 表上定义一个名为 部门_del 的触发器 */
ON 部门
FOR DELETE /* 该触发器的类型是删除触发器,即只要执行了删除操作,就触发该触发器 */
AS
BEGIN
ROLLBACK TRANSACTION /* 回退删除操作 */
END
当执行删除操作时,会触发该触发器回退删除操作,使记录不被删除。
2)第二种语法
创建触发器的第二种语法只适用创建 insert 和 update 类型的触发器。语法如下:
CREATE TRIGGER trigger_name
ON table_name
FOR {insert | update}
AS
IF UPADTE(column)
[{AND | OR} UPDATE(colmun)] [...n]
SQL_statements [...n]
其中:
UPDATE(column) 用来判断 column 列是否被修改,如果修改了就返回真值,否则返回假值。当需要判断多列是否被修改时,可以指定多个 UPDATE(column),然后使用逻辑操作符 AND 或 OR 连接起来。
例如:
ALTER TRIGGER 部门_update部门编号
/* 在 部门 表上定义一个名为 部门_update部门编号 */
ON 部门
FOR UPDATE /* 该触发器的类型是更新触发器,即只要执行了更新 部门编号 字段操作,就触发该触发器 */
AS
IF UPDATE(部门编号)
ROLLBACK /* 回退删除操作 */
该触发器用于维护部门中的部门编号,使之不能被修改。
3)第三语法
创建触发器的第三种语法也是适用于创建 insert 和 update 类型的触发器,语法如下:
CREATE TRIGGER trigger_name
ON table_name
FOR {insert | update}
AS
IF (COLUMNS_UPDATED() {bitwise_operator} update_bitmask)
{ comparison_operator } column_bitmask [ ...n ] }
SQL_statements
其中:
COLUMNS_UPDATED() : 判断哪些列被插入或修改,并返回一个二进制形式的整数值指定表中被插入或修改的列。例如:如果 Tab1 表包含四列:t1, t2, t3 和 t4,如果其中 t2 和 t3 列被修改了,则返回的二进制值为 0110 (十进制为 6)。
bitwise_operator : 二进制操作符
update_bitmask 和 column_bitmask : 用户指定的检验值,必须是个十进制整数值。
comparison_operator : 比较操作符。
例如:创建表 Tab1:
CREATE TABLE Tab1
(
t1 char(3) not null,
t2 char(3) not null,
t3 int not null,
t4 int not null
)
创建该表的触发器 Tab1_update
CREATE TRIGGER Tab1_update
ON Tab1
FOR UPDATE
AS
IF (COLUMNS_UPDATED() & 6) = 0 /* t2 和 t3 列被修改
ROLLBACK /* 回退,取消修改 */
此触发器维护 Tab1 表中 t2 和 t3 不能修改。
2、触发器的工作原理
触发器之所以能够维护表中数据的完整性,是因为触发器能够使用两个临时表 inserted 和 deleted 表,它们被称为触发器检查表。这两个是逻辑意义上的表,且是专门针对触发器而由系统自动创建的,它们的结构和触发器表的结构完全相同。
在触发器执行过程中,不能修改触发器检查表中的数据,但是能够使用 SELECT 语句来检索这些表中的数据。触发器可以根据这些表中的数据,判断当前的数据更新操作是否破坏表中数据的完整性。如果该更新操作破坏了表中数据的完整性,则要么对该操作涉及的表执行一个级联更新,使该操作合法;要么回退该操作。
在对表中的数据进行操作时,有时并不只修改一条数据。这时,触发器不是每删除一条记录都要触发 delete 触发器,而是在删除操作完全结束后才触发。当执行这样的操作时,检查表中的数据就会超过一条记录。因此,在创建触发器时一定要考虑超过一条记录的情况。[em26] |
|