SQL触发器
一、什么是触发器
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。
( 触发器的处理是可以任意的事情,包括修改目标表的数据,也可以报一个异常,终止数据的处理。)
二、触发器的语法
create [or replace] trigger 触发器名 触发时间 {before | after} -- view 中是 instead of 触发事件 {insert | update | delete} -- dml、ddl、database on 触发对象 -- table、view、schema、database 触发频率 {for each row} -- 行级触发器。默认:语句级触发器 [follows 其它触发器名] -- 多个触发器执行的 前后顺序 [when 触发条件] begin pl/sql 语句; end;
DROP TRIGGER 触发器名称;---删除触发器
例子:
create table emp_tagx as select * from emp; --创建测试表 --加工资 create or replace trigger tg_emp_change before update or insert or delete on emp_tagx ---相关的行为发生,都会执行这个触发器 for each row ---发生变化的每一行|增量 begin ---处理逻辑 dbms_output.put_line('修改前工资:'||:old.sal); ---打印修改前的工资 :old专用的,固定写法 专指修改前的数据 dbms_output.put_line('修改后工资:'||:new.sal); ---打印修改后的工资 :new专用的,固定写法 专指修改后的数据 ----insert into target_sal(:old.empno,:old.sal,:new.sal); ---commit; ---每次加工资不能超过2000,否则就失败 if :new.sal - :old.sal >2000 then raise_application_error(-20001,'加工资步子不要太大'); --报错 end if ; end;
update emp_tagx set sal = sal+ 2000 where empno=7788;
Databse 触发器
触发事件 startup:'数据库打开'时,相反的 = shutdown logon :当用户连接到数据库并 '建立会话' 时,相反的 = logoff servererror:发生服务器错误时
例子:
create or replace trigger scott.tr_al_database_login_info after logon on database declare v_option_user varchar2(50) := sys_context('USERENV', 'OS_USER'); -- 电脑域账户 begin insert into scott.database_login_info (client_ip, login_user, database_name, database_event, create_user, create_data) values (dbms_standard.client_ip_address, dbms_standard.login_user, dbms_standard.database_name, dbms_standard.sysevent, v_option_user, sysdate); end;
详细的可以看:https://blog.csdn.net/m0_37253968/article/details/120326922