oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器
oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器 ??
ld.字段名或:new.字段名
* 触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程。
定义一个触发器时要考虑上述多种情况,并根据具体的需要来决定触发器的种类。
DML触发器的创建
创建DML触发器需要CREATE TRIGGER系统权限。创建DML触发器的语法如下:
CREATE [OR REPLACE] TRIGGER 触发器名
{BEFORE|AFTER|INSTEAD OF} 触发事件1 [OR 触发事件2...]
ON 表名
WHEN 触发条件
[FOR EACH ROW]
DECLARE
声明部分
BEGIN
主体部分
END;
其中:
OR REPLACE:表示如果存在同名触发器,则覆盖原有同名触发器。
BEFORE、AFTER和INSTEAD OF:说明触发器的类型。
WHEN 触发条件:表示当该条件满足时,触发器才能执行。
触发事件:指INSERT、DELETE或UPDATE事件,事件可以并行出现,中间用OR连接。
对于UPDATE事件,还可以用以下形式表示对某些列的修改会引起触发器的动作:
UPDATE OF 列名1,列名2...
ON 表名:表示为哪一个表创建触发器。
FOR EACH ROW:表示触发器为行级触发器,省略则为语句级触发器。
触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器。删除触发器的语法如下:
DROP TIRGGER 触发器名
可以通过命令设置触发器的可用状态,使其暂时关闭或重新打开,即当触发器暂时不用时,可以将其置成无效状态,在使用时重新打开。该命令语法如下:
ALTER TRIGGER 触发器名 {DISABLE|ENABLE}
其中,DISABLE表示使触发器失效,ENABLE表示使触发器生效。
同存储过程类似,触发器可以用SHOW ERRORS 检查编译错误。
行级触发器的应用
在行级触发器中,SQL语句影响的每一行都会触发一次触发器,所以行级触发器往往用在对表的每一行的操作进行控制的场合。若在触发器定义中出现FOR EACH ROW子句,则为语句级触发器。
【训练1】? 创建包含插入、删除、修改多种触发事件的触发器DML_LOG,对EMP表的操作进行记录。用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。
在创建触发器之前,需要先创建事件记录表LOGS,该表用来对操作进行记录。该表的字段含义解释如下:
LOG_ID:操作记录的编号,数值型,它是该表的主键,由序列自动生成。
LOG_TABLE:进行操作的表名,字符型,非空,该表设计成可以由多个触发器共享使用。比如我们可以为dept表创建类似的触发器,同样将操作记录到该表。
LOG_DML:操作的动作,即INSERT、DELETE或UPDATE三种之一。
LOG_KEY_ID:操作时表的主键值,数值型。之所以记录表的主键,是因为主键是表的记录的惟一标识,可以识别是对哪一条记录进行了操作。对于emp表,主键是empno。
LOG_DATE:操作的日期,日期型,取当前的系统时间。
LOG_USER:操作者,字符型,取当时的操作者账户名。比如登录SCOTT账户进行操作,在该字段中,记录账户名为SCOTT。
步骤1:在SQL*Plus中登录STUDENT账户,创建如下的记录表LOGS:
??
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
已删除 1 行。已创建 1 行。已更新 1 行。提交完成。
步骤4:检查emp表和employee表中被插入、删除和更新的雇员。
运行结果略,请自行验证。
? 说明:在触发器中判断触发事件,根据不同的事件对employee表进行不同的操作。
【练习1】创建一个emp表的触发器EMP_TOTAL,每当向雇员表插入、删除或更新雇员信息时,将新的统计信息存入统计表EMPTOTAL,使统计表总能够反映最新的统计信息。
统计表是记录各部门雇员总人数、总工资的统计表,结构如下:
部门编号 number(2)
总人数 number(5)
总工资 number(10,2)
练习
1. 下列有关触发器和存储过程的描述,正确的是:
A. 两者都可以传递参数
B. 两者都可以被其他程序调用
C. 两种模块中都可以包含数据库事务语句
D. 两者创建的系统权限不同
2. 下列事件,属于DDL事件的是:
??? A.? INSERT B.? LOGON
??? C.? DROP D.? SERVERERROR
3. 假定在一个表上同时定义了行级和语句级触发器,在一次触发当中,下列说法正确的是:
??? A. 语句级触发器只执行一次
??? B. 语句级触发器先于行级触发器执行
?????????? C. 行级触发器先于语句级触发器执行
??????????????? D. 行级触发器对表的每一行都会执行一次
4. 有关行级触发器的伪记录,下列说法正确的是:
?? A.? INSERT事件触发器中,可以使用:old伪记录。
?? B.? DELETE事件触发器中,可以使用:new伪记录。
?? C.? UPDATA事件触发器中,只能使用:new伪记录。
??????????????? D.? UPDATA事件触发器中,可以使用:old伪记录。
5. 下列有关替代触发器的描述,正确的是:
??? A. 替代触发器创建在表上
??????????????? B. 替代触发器创建在数据库上
??????????????? C. 通过替代触发器可以向基表插入数据
??????????????? D. 通过替代触发器可以向视图插入数据