oracle 触发器的品种和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器
oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,ld.字段名或:new.字段名?
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. 通过替代触发器可以向视图插入数据?
黑色头发:http://heisetoufa.iteye.com/