Oracle触发器
|
如果在触发器内调用其它函数或过程,当这些函数或过程被删除或修改后,触发器的状态将被标识为无效。当DML语句激活一个无效触发器时,ORACLE将重新编译触发器代码,如果编译时发现错误,这将导致DML语句执行失败。 在PL/SQL程序中可以调用ALTER TRIGGER语句重新编译已经创建的触发器,格式为:?????????? ALTER TRIGGER [schema.] trigger_name COMPILE [ DEBUG] 其中:DEBUG 选项要器编译器生成PL/SQL 程序条使其所使用的调试代码。 8.3 删除和使能触发器 l???????? 删除触发器: DROP TRIGGER trigger_name; 当删除其他用户模式中的触发器名称,需要具有DROP ANY TRIGGER系统权限,当删除建立在数据库上的触发器时,用户需要具有ADMINISTER DATABASE TRIGGER系统权限。 此外,当删除表或视图时,建立在这些对象上的触发器也随之删除。 l???????? 禁用或启用触发器 数据库TRIGGER 的状态: 有效状态(ENABLE):当触发事件发生时,处于有效状态的数据库触发器TRIGGER 将被触发。 无效状态(DISABLE):当触发事件发生时,处于无效状态的数据库触发器TRIGGER 将不会被触发,此时就跟没有这个数据库触发器(TRIGGER) 一样。 数据库TRIGGER的这两种状态可以互相转换。格式为: ALTER TIGGER trigger_name [DISABLE | ENABLE ]; --例:ALTER TRIGGER emp_view_delete DISABLE; ?????????? ALTER TRIGGER语句一次只能改变一个触发器的状态,而ALTER TABLE语句则一次能够改变与指定表相关的所有触发器的使用状态。格式为:???????????? ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS; --例:使表EMP 上的所有TRIGGER 失效: ALTER TABLE emp DISABLE ALL TRIGGERS; 8.4 触发器和数据字典 相关数据字典:USER_TRIGGERS、ALL_TRIGGERS、DBA_TRIGGERS SELECT TRIGGER_NAME,TRIGGER_TYPE,TRIGGERING_EVENT, TABLE_OWNER,BASE_OBJECT_TYPE,REFERENCING_NAMES, STATUS,ACTION_TYPE FROM user_triggers; 8.5?? 数据库触发器的应用举例 例1:创建一个DML语句级触发器,当对emp表执行INSERT,DELETE 操作时,它自动更新dept_summary 表中的数据。由于在PL/SQL块中不能直接调用DDL语句,所以,利用ORACLE内置包DBMS_UTILITY中的EXEC_DDL_STATEMENT过程,由它执行DDL语句创建触发器。 CREATE TABLE dept_summary( Deptno NUMBER(2), Sal_sum NUMBER(9,2), Emp_count NUMBER); INSERT INTO dept_summary(deptno,sal_sum,emp_count) SELECT deptno,SUM(sal),COUNT(*) FROM emp GROUP BY deptno; --创建一个PL/SQL过程disp_dept_summary --在触发器中调用该过程显示dept_summary标中的数据。 CREATE OR REPLACE PROCEDURE disp_dept_summary IS Rec dept_summary%ROWTYPE; CURSOR c1 IS SELECT * FROM dept_summary; BEGIN OPEN c1; FETCH c1 INTO REC; DBMS_OUTPUT.PUT_LINE(‘deptno??? sal_sum??? emp_count‘); DBMS_OUTPUT.PUT_LINE(‘-------------------------------------‘); WHILE c1%FOUND LOOP ??? DBMS_OUTPUT.PUT_LINE(RPAD(rec.deptno,6)|| ????? To_char(rec.sal_sum,‘$999,999.99‘)|| ????? LPAD(rec.emp_count,13)); ??? FETCH c1 INTO rec; END LOOP; CLOSE c1; END; BEGIN DBMS_OUTPUT.PUT_LINE(‘插入前‘); Disp_dept_summary(); DBMS_UTILITY.EXEC_DDL_STATEMENT(‘ ??? CREATE OR REPLACE TRIGGER trig1 ????? AFTER INSERT OR DELETE OR UPDATE OF sal ON emp ??? BEGIN ????? DBMS_OUTPUT.PUT_LINE(‘‘正在执行trig1 触发器…‘‘); ????? DELETE FROM dept_summary; ????? INSERT INTO dept_summary(deptno,emp_count) ????? SELECT deptno,COUNT(*) ????? FROM emp GROUP BY deptno; ??? END; ‘); INSERT INTO dept(deptno,dname,loc) VALUES(90,‘demo_dept’,‘none_loc’); INSERT INTO emp(ename,deptno,sal) VALUES(USER,90,9999,3000); DBMS_OUTPUT.PUT_LINE(‘插入后‘); Disp_dept_summary(); UPDATE emp SET sal=1000 WHERE empno=9999; DBMS_OUTPUT.PUT_LINE(‘修改后‘); Disp_dept_summary(); DELETE FROM emp WHERE empno=9999; DELETE FROM dept WHERE deptno=90; DBMS_OUTPUT.PUT_LINE(‘删除后‘); Disp_dept_summary(); DBMS_UTILITY.EXEC_DDL_STATEMENT(‘DROP TRIGGER trig1’); EXCEPTION ?? WHEN OTHERS THEN ????? DBMS_OUTPUT.PUT_LINE(SQLCODE||‘---‘||SQLERRM); END; (编辑:安卓应用网_ASP源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
