Oracle触发器及使用举例(几种触发器类型)

xiaoxiao2021-02-28  58

触发器 触发器的触发事件分类: 执行DDM语句;执行DDL语句;引发数据库系统事件;引发用户事件; 创建触发器的语法 CREATE TRIGGER 触发器名 [before|after|instead of] 触发事件 on 表名或者视图名或者用户名或者数据库名 [for each row] [触发条件表达式] [declare 变量] begin sentences; end 触发器名;注意:多个触发事件用or连接; 根据触发事件和触发器的执行情况,将Oracle所支持的触发器分为下面5中类型: 行级触发器(引起的触发器只执行一次); 语句级触发器(DML所影响的每一行执行一次触发器); 替换触发器(定义在视图上); 用户事件触发器; 系统事件触发器; 语句级触发器举例,包含条件谓词的使用 条件谓词:inserting,updating,updating('列名'),deleting create table employee_log (oper_name varchar2(20), oper_date date ); create or replace trigger tri_emp before insert or update or delete on employees declare var_1 varchar2(20); begin if inserting then var_1:='insert'; elsif updating then var_1:='update'; elsif deleting then var_1:='delete'; elsif updating('SALARY') then var_1:='update_salary'; end if; insert into employee_log values(var_1,sysdate); end tri_emp; 行级触发器使用举例 注意:在sqlplus中可以使用old和new record变量引用当前行相关的数据 create or replace trigger tri_emp before update on employees for each row begin if :new.salary>:old.salary then dbms_output.put_line(:new.first_name||'工资调高了'); elsif :new.salary<:old.salary then dbms_output.put_line(:new.first_name||'工资调低了'); else dbms_output.put_line(:new.first_name||'工资没有调整'); end if; end tri_emp; 执行结果: update employees set salary=salary+200 where employee_id=103; 执行结果 1 行已更新。 Alexander工资调高了用户事件触发器举例 下面例子使用了几个事件属性 ora_dict_obj_name DDL操作对象名称 ora_dict_obj_type DDL操作对象的类型 ora_sysevent触发器的系统事件名 ora_login_user登录用户名 create table ddl_oper_emp ( db_obj varchar2(20), db_obj_type varchar2(20), oper_action varchar2(20), oper_user varchar2(20), opre_date date ); create or replace trigger tri_ddl before create or alter or drop on hr.schema begin insert into ddl_oper_emp values(ora_dict_obj_name,ora_dict_obj_type,ora_sysevent,ora_login_user,sysdate); end tri_ddl; 只有努力不会背叛 博文仅供参考,欢迎大家来访。如有错误之处,希望批评指正。
转载请注明原文地址: https://www.6miu.com/read-64983.html

最新回复(0)