加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网_ASP源码网 (https://www.1asp.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

Oracle触发器

发布时间:2020-12-31 01:46:09 所属栏目:站长百科 来源:网络整理
导读:触发器是许多关系数据库系统都提供的一项技术。在oracle系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。 8.1 触发器类型 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行

如果在触发器内调用其它函数或过程,当这些函数或过程被删除或修改后,触发器的状态将被标识为无效。当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源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读