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

posted @ 2022-05-07 15:09  潜摩羯  阅读(1252)  评论(0编辑  收藏  举报