Oracle12C--管理触发器(59)

  • 3种管理触发器的操作
    • 触发器属于数据中的对象,所有的数据库对象都可以被创建,删除,修改,查询;
  • 查询触发器
    • 可以使用3个数据字典查看触发器信息
      • user_triggers;
      • all_triggers;
      • dba_triggers
    • 示例1:使用c##scott用户登录,查看user_triggers数据字典

SELECT trigger_name,status,trigger_type,status,table_name,triggering_event,trigger_body FROM user_triggers ;

  • 说明:在查询出的表中,trigger_body字段给出的是所有触发器的程序代码,可以通过SQL Developer工具直接双击此列,来查看完整的信息;
    • Oracle12C--管理触发器(59)
  • 禁用/启动触发器
    • 语法1

ALTER TRIGGER 触发器名称 [DISABLE | ENABLE];

在修改触发器时,提供了两种触发器的操作状态:
ENABLE(有效状态):当触发事件发生时,处于有效状态的数据库触发器将被触发:
DISABLE(无效状态):当触发事件发生时,处于无效状态的数据库触发器TRIGGER将不会被触发,相当于触发器不存在

禁用/启用一张表的全部触发器语法:
ALTER TABLE [schema.]表名称 [ENABLE | DISABLE] ALL TRIGGERS;

  • 示例1:将emp_alter_trigger触发器修改为禁用状态

ALTER TRIGGER emp_alter_trigger DISABLE ;

  • 查询数据字典表,确定触发器状态

SELECT trigger_name,status FROM user_triggers ;

  • 示例2Oracle11g之后可以建立禁用触发器
    • 说明:建立的触发器默认都是开启状态,可通过DISABLE选项,直接创建禁用触发器:

CREATE OR REPLACE TRIGGER emp_update_trigger

BEFORE INSERT OR UPDATE OR DELETE

ON dept

DISABLE

FOR EACH ROW

BEGIN

NULL ;

END;

/

可通过ENABLE选项,更改为启用

  • 示例3:启用emp表的全部触发器

ALTER TABLE emp ENABLE ALL TRIGGERS;

  • 删除触发器
    • 语法:

DROP TRIGGER 触发器名称;

  • 示例1:删除forbid_emp_trigger触发器

DROP TRIGGER emp_alter_trigger ;

  • 触发器中调用子程序
    • 问题:触发器只能编写最多32KB大小的代码,如果需要编写较多的代码,可以将这些代码定义在过程或者函数中,触发器只需要完成调用即可
    • 注意:
      • 触发器调用其它的过程或函数,那么该过程或函数被删除后,会导致触发器无法使用,抛出ORA-04098异常;
      • 如果调用的过程或函数被改变时,触发器的操作状态可能变为无效,此时可使用下面的语法,重新编译触发器:

ALTER TRIGGER [模式.]触发器名称 COMPILE [ DEBUG]

  • 示例1:在每月10号允许办理新近人员入职,同时入职的新雇员工资不能够超过公司的平均工资
    • 步骤1:定义一个过程,检查当前的日期是否为每月10号,如果不是抛出异常;


CREATE OR REPLACE PROCEDURE emp_update_date_proc

AS

v_currentdate VARCHAR2(20) ;

BEGIN

SELECT TO_CHAR(SYSDATE,'dd') INTO v_currentdate FROM dual ;

IF TRIM(v_currentdate)!='10' THEN

RAISE_APPLICATION_ERROR(-20008,'在每月的10号才允许办理入职手续!') ;

END IF ;

END;

/

  • 步骤2:定义一个函数:检索出公司的平均工资

CREATE OR REPLACE FUNCTION emp_avg_sal

RETURN NUMBER

AS

v_avg_salary emp.sal%TYPE ;

BEGIN

SELECT AVG(sal) INTO v_avg_salary FROM emp ;

RETURN v_avg_salary ;

END;

/

  • 步骤3:在触发器中分别调用以上的过程与函数

CREATE OR REPLACE TRIGGER forbid_emp_trigger

BEFORE INSERT

ON emp

FOR EACH ROW

BEGIN

emp_update_date_proc ; -- 调用过程

IF :new.sal>emp_avg_sal() THEN -- 调用函数

RAISE_APPLICATION_ERROR(-20009,'新进雇员工资不得高于公司平均工资!') ;

END IF ;

END ;

/