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工具直接双击此列,来查看完整的信息;
-
-
禁用/启动触发器
- 语法1:
ALTER TRIGGER 触发器名称 [DISABLE | ENABLE]; |
在修改触发器时,提供了两种触发器的操作状态: |
禁用/启用一张表的全部触发器语法: |
-
示例1:将emp_alter_trigger触发器修改为禁用状态
ALTER TRIGGER emp_alter_trigger DISABLE ; |
- 查询数据字典表,确定触发器状态
SELECT trigger_name,status FROM user_triggers ; |
-
示例2:Oracle11g之后可以建立禁用触发器
- 说明:建立的触发器默认都是开启状态,可通过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号,如果不是抛出异常;
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 ; / |