DB2 9.5 SQL Procedure Developer 认证考试 735 准备,第4部分:触发器
2010-02-18 15:01:13 来源:WEB开发网通过以下示例查看这些组件的说明。
清单 2将显示 AFTER INSERT触发器的语法。INSERT是触发器事件之一。在向基本表employee中插入行时将激活(启动)此触发器。由于此触发器被定义为 AFTER触发器,因此定时条件是在对employee表执行INSERT语句之后执行的。触发器操作将把审计条目插入到audit_emp基本表中。REFERENCING NEW AS将提供一个相关名称,该名称将指定为了允许引用受触发器影响的新的列值而设定的前缀。FOR EACH ROW是另一个定时条件。将对触发器事件处理的每一行都执行触发器操作,因此,如果INSERT语句处理25行,则在audit_emp表中插入 25 个新审计条目。清单 2将显示此触发器的语法。
清单 2. 简单的AFTER INSERT触发器CREATE TRIGGER new_emp
AFTER INSERT ON employee
REFERENCING NEW AS n
FOR EACH ROW
INSERT INTO audit_emp VALUES (n.empno, 'Insert',0.0, current user, current timestamp)
清单 3将显示 AFTER DELETE触发器的语法。删除是触发器事件之一。在从基本表employee中删除行时将激活(启动)此触发器。由于此触发器定义为 AFTER触发器,因此定时条件是在对employee表执行DELETE语句之后执行的。触发器操作将把审计条目插入到audit_emp基本表中。REFERENCING OLD AS将提供一个相关名称,该名称将指定为了允许引用受触发器影响的旧的列值而设定的前缀。FOR EACH ROW是另一个定时条件。将对触发器事件处理的每一行都执行触发器操作,因此,如果DELETE语句处理五行,则在audit_emp表中插入五个新审计条目。
清单 3. 简单的AFTER DELETE触发器CREATE TRIGGER purge_emp
AFTER DELETE ON employee
REFERENCING OLD AS o
FOR EACH ROW
INSERT INTO audit_emp VALUES (o.empno, 'Delete',0.0, current user, current timestamp)
清单 4将显示 AFTER UPDATE触发器的语法。更新是触发器事件之一。在对基本表employee 执行更新时将激活(启动)此触发器。由于此触发器定义为 AFTER触发器,因此定时条件是在对employee表执行UPDATE语句之后执行的。触发器操作将把审计条目插入到audit_emp基本表中。REFERENCING OLD AS将提供一个相关名称,该名称将指定为了允许引用受触发器影响的旧列值而设定的前缀,和 REFERENCING NEW 子句的行为一样。FOR EACH ROW是另一个定时条件。将对触发器事件处理的每一行都执行触发器操作,因此,如果UPDATE语句处理100行,则在audit_emp表中插入 100 个新审计条目。触发器主体中的WHEN 子句提供将被包含在FOR EACH ROW中的条件逻辑。这将根据使用REFERENCE 子句中声明的相关名称定义的测试的结果有条件地执行触发操作。本例将把基本表employee中的现有employee.salary列与通过UPDATE语句更新的值进行比较。如果条件为真(不相等),则使用employee表中执行UPDATE语句得到的更新值对audit_emp表执行INSERT语句。
清单 4. 简单的AFTER UPDATE触发器CREATE TRIGGER update_emp
AFTER UPDATE OF salary ON employee
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
WHEN (n.salary <> o.salry)
INSERT INTO audit_emp VALUES (o.empno,'Update',n.salary,current user, current timestamp)
清单 5将显示 BEFORE UPDATE触发器的语法。更新再一次被作为触发器事件。在对基本表employee 执行更新时将激活(启动)此触发器。由于此触发器定义为 BEFORE触发器,因此定时条件是在对employee表执行UPDATE语句之前执行的。如果salary表的新更新值等于 60,000.00,则触发器操作将把 employee.salary 设为 75,000.00。REFERENCING OLD AS将提供一个相关名称,该名称将指定为了允许引用受触发器影响的旧列值而设定的前缀,与 REFERENCING NEW 子句的行为一样。FOR EACH ROW是另一个定时条件。触发器主体中的WHEN 子句提供将被包含在FOR EACH ROW中的条件逻辑。这将根据使用REFERENCE 子句中声明的相关名称定义的测试的结果有条件地执行触发操作。本例将比较 UPDATE语句(employee.salary)中的更新值。如果它等于 60,000.00,则将薪水设为 75,000.00。
清单 5. 简单的BEFORE UPDATE触发器CREATE TRIGGER update_bemp
BEFORE UPDATE ON employee
REFERENCING OLD AS o NEW AS n
FOR EACH ROW
WHEN (n.salary = 60000.00)
SET n.salary = 75000.00)
触发器的高级用法
使用触发器的一些高级方法包括:
INSTEAD OF触发器
用触发器处理XML数据
从触发器中调用存储过程
INSTEAD OF触发器
INSTEAD OF触发器始终是针对视图创建的,而决不会为基本表或者昵称创建。通过使用INSTEAD OF触发器,视图修改被替换为针对先前定义的视图发挥功能的触发器逻辑,并且对于调用应用程序是透明的。
清单 6将显示如何创建 INSTEAD OF触发器:
清单 6. 创建 INSTEAD OF触发器
-- Base Table (employees)
CREATE TABLE "DB2INST1"."EMPLOYEES"
(
"EMPNO" CHAR(6) NOT NULL ,
"FIRSTNME" VARCHAR(12) NOT NULL ,
"LASTNAME" VARCHAR(15) NOT NULL ,
"PHONENO" CHAR(4) ,
"SALARY" DECIMAL(9,2)
)
-- Create View for the EMPLOYEES Table
CREATE VIEW employeev As
SELECT empno, firstnme, lastname, phoneno
FROM employees
-- Create Instead of Trigger
CREATE TRIGGER new_emp1
INSTEAD OF INSERT ON employeev
REFERENCING NEW AS n
FOR EACH ROW
INSERT INTO employees VALUES (n.empno, n.firstnme, n.lastname, n.phoneno, 0)
使用INSTEAD OF触发器可以将数据插入到employees表中受保护的salary列中。当在视图 employeev中插入行时将激活(启动)此触发器。由于此触发器定义为 INSTEAD OF触发器,因此定时条件是在对视图执行INSERT语句之后执行的。触发器操作将对基本表(employees)执行INSERT。REFERENCING NEW AS将提供一个相关名称,该名称将指定为了允许引用受触发器影响的新列值而设定的前缀。FOR EACH ROW是另一个定时条件。将对触发器事件处理的每一行都执行触发器操作,因此,如果INSERT语句处理五行,则在基本表(employees)中插入五个新条目并为 employeev 视图中不可见的salary列提供默认值零。
- ››sql server自动生成批量执行SQL脚本的批处理
- ››sql server 2008亿万数据性能优化
- ››SQL Server 2008清空数据库日志方法
- ››sqlserver安装和简单的使用
- ››SQL Sever 2008 R2 数据库管理
- ››SQL SERVER无法安装成功,sqlstp.log文件提示[未发...
- ››Sql Server中通过父记录查找出所有关联的子记录
- ››SqlServer触发器、存储过程和函数
- ››SQL Server 中的事务(含义,属性,管理)
- ››Sqlite数据库插入和读取图片数据
- ››Sql server 2005拒绝了对对象 'xx表' (数...
- ››Sql server 2005拒绝了对对象 'xx表' (数...
更多精彩
赞助商链接