ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Oracle的触发器Trigger

2021-09-07 15:37:19  阅读:205  来源: 互联网

标签:salary 触发器 old sal -- 薪水 Trigger Oracle


参考:https://blog.csdn.net/weixin_41649106/article/details/86981325
https://blog.csdn.net/htj10/article/details/114629358

触发器的应用场景

  1. 复杂的安全性检查
  2. 数据的确认
  3. 数据库审计
  4. 数据的备份和审计

触发器例子1:update 之前进行安全检查

准备工作:

create table t_salary(id number(8), sal number(10,2));
insert  into t_salary(id, sal) values(1, 8000);
select * from t_salary;

 创建触发器:

/**
涨后的薪水不能低于涨前的薪水
1 :old 和 :new 代表同一条记录
2 :old 代表操作该行之前,这一行的值
 :new 代表操作该行之后,这一行的值
*/
create or replace trigger checkSalary
 before update
 on t_salary
 for each row
declare
 -- local variables here 没有变量声明的话,declare可以省略
begin
 -- if 涨后的薪水 < 涨前的薪水 then 如何表示呢 ?
 if :new.sal < :old.sal then
   raise_application_error(-20002,'涨后的薪水:'|| :new.sal ||'小于涨前的薪水:'||:old.sal);
 end if;
end checkSalary;

 测试:

SQL> update t_salary set sal=7000 where id=1;
update t_salary set sal=7000 where id=1
       *
第 1 行出现错误:
ORA-20002: 涨后的薪水:7000小于涨前的薪水:9000
ORA-06512: 在 "SCOTT.CHECKSALARY", line 6
ORA-04088: 触发器 'SCOTT.CHECKSALARY' 执行过程中出错

 删除触发器

--删除 触发器
drop trigger checkSalary;

 例子2:备份数据

/*
删除前,将数据备份
*/
create or replace trigger tri_sal_delete_bk
  before delete
  on t_salary
  for each row
begin
  insert into t_salary_del(id,sal) values(:old.id, :old.sal);
  -- commit; -- 注意不可以有提交,会报错ora-04092
end tri_sal_delete_bk;

 注意:DML(delete/update/insert)触发器中不能使用DDL(CREATE,DROP,ALTER)语句,也不能使用事务控制语句(ROLLBACK, COMMIT,SAVEPOINT)。特别注意的是,在触发器的主体中引用的函数(function)/过程(procedure)中也不能有事物控制语句。

例子3:非工作时间禁止插入数据

/**
非工作时间(星期六 星期日, 非9点~18点的区间)禁止写入数据
首先要搞清楚: 触发器的类型--语句级触发器。
不管插入了多少条数据,没有必要对每一行数据都进行校验,只要不在这个时间段内,都不让插入。
*/

create or replace trigger tri_addSalaryCheck
  before insert on t_salary
declare
 -- local variables here
begin
  if to_char(sysdate, 'day') in ('星期六', '星期日') or
      to_number(to_char(sysdate, 'hh24')) not between 9 and 18    then
      -- 禁止insert
      raise_application_error(-20001,'非工作时间禁止插入数据');
  end if;
end tri_addSalaryCheck;

 

例子4:Oracle实现像Mysql的自动增长auto_increment

-- 建表:
CREATE TABLE t_user(U_ID NUMBER(8), UNAME VARCHAR2(20), UPASSWORD VARCHAR2(20));

-- 建立序列:
CREATE SEQUENCE SEQ_TUSER  
INCREMENT BY 1
MINVALUE 1                      --最小值  
MAXVALUE 99999999               --最大值由NUMBER(8)  
NOCYCLE                              --不打环   
NOCACHE                              --不缓存  
ORDER;
COMMIT;  

-- 然后建立before的触发器:
CREATE OR REPLACE TRIGGER TRG_ADDTUSER  
BEFORE INSERT ON t_user
FOR EACH ROW
BEGIN
SELECT SEQ_TUSER.NEXTVAL INTO :NEW.U_ID FROM DUAL;
END TRG_ADDTUSER;

-- 测试:
INSERT INTO t_user (UNAME,UPASSWORD) VALUES ('libai','589avf');
INSERT INTO t_user (UNAME,UPASSWORD) VALUES ('zhangsan','ko098');
COMMIT;
select * from t_user;

 

标签:salary,触发器,old,sal,--,薪水,Trigger,Oracle
来源: https://www.cnblogs.com/htj10/p/15238395.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有