文档详情

第6章触发器报告.ppt

发布:2017-01-15约1.47万字共79页下载文档
文本预览下载声明
步骤2:验证运行结果: INSERT INTO emp(empno,ename,job,sal) VALUES(1000,BILL,CLERK,1500); 执行结果: 已创建 1 行。 执行查询: SELECT ename,job,sal FROM emp WHERE empno=1000; 执行结果: ENAME JOB SAL ------------- ------------- ------------------------ Bill CLERK 1500 说明:在本例中,通过直接为:new.ename进行赋值,修改了插入的值,但是这种用法只能在BEFORE型触发器中使用。验证结果为,在插入语句中雇员名称为大写的BILL,查询结果中雇员名称已经转换成以大写开头的Bill。 【练习5】限定一次对雇员的工资修改不超过原工资的10%。 语句级触发器的应用 同行级触发器不同,语句级触发器的每个操作语句不管操作的行数是多少,只触发一次触发器,所以语句级触发器适合于对整个表的操作权限等进行控制。在触发器定义中若省略FOR EACH ROW子句,则为语句级触发器。 【训练1】 创建一个语句级触发器CHECK_TIME,限定对表EMP的修改时间为周一至周五的早8点至晚5点。 步骤1:创建和编译以下触发器: CREATE OR REPLACE TRIGGER CHECK_TIME BEFORE UPDATE OR INSERT OR DELETE ON EMP BEGIN IF (TO_CHAR(SYSDATE,DY) IN (SAT,SUN)) OR TO_CHAR(SYSDATE,HH24) 08 OR TO_CHAR(SYSDATE,HH24)=17 THEN RAISE_APPLICATION_ERROR(-20500,非法时间修改表错误!); END IF; END; 执行结果: 触发器已创建。 步骤2:当前时间为18点50分,在EMP表中插入记录: UPDATE EMP SET SAL=3000 WHERE EMPNO=7369; 显示结果为: UPDATE EMP SET SAL=3000 WHERE EMPNO=7369 * ERROR 位于第 1 行: ORA-20500: 非法时间修改表错误! ORA-06512: 在STUDENT.CHECK_TIME, line 5 ORA-04088: 触发器 ‘STUDENT.CHECK_TIME’ 执行过程中出错 说明:通过引发异常限制对数据库进行的插入、删除和修改操作的时间。SYSDATE用来获取系统当前时间,并按不同的格式字符串进行转换。“DY”表示获取英文表示的星期简写,“HH24”表示获取24小时制时间的小时。 当在18点50分修改表中的数据时,由于时间在8点至17点(晚5点)之外,所以产生“非法时间修改表错误”的用户自定义错误,修改操作终止。 【练习1】设计一个语句级触发器,限定只能对数据库进行修改操作,不能对数据库进行插入和删除操作。 2 替代触发器 替代触发器是DML触发器的一种,替代条件换成instead of,而不是before和after,其他内容跟dml一致。并且替代触发器一般建立在不可更新的视图上,可以实现对不可更新视图的更新操作替换成对表的直接操作。 【训练1】 在emp表的视图上,通过触发器修改emp表。 步骤1:创建视图emp_name: CREATE VIEW emp_name AS SELECT ename FROM emp; 执行结果: 视图已建立。 步骤1:创建替代触发器: CREATE OR REPLACE TRIGGER change_name INSTEAD OF INSERT ON emp_name DECLARE V_EMPNO NUMBER(4); BEGIN SELECT MAX(EMPNO)+1 INTO V_EMPNO FROM EMP; INSERT INTO emp(empno,ename) VALUES(V_EMPNO,:new.ename); END; 执行结果: 触发器已创建。 步骤2:向emp_name视图插入记录: INSERT INTO emp_name VALUES(BROWN); COMMIT; 执行结果: 已创建 1 行。 提交完成。 ?说明:向视图直接插入雇员名将会发生错误,因为emp表的雇员编号列不允许为空。通过创建替代触发器,将向视图插入雇员名称转换为向emp表插入雇员编号和雇员名称,雇员编号取当前的最大雇员编号加1。试检查emp表的雇员列表。 触发器体内禁止使用COMMIT、RO
显示全部
相似文档