聊聊oracle(四)触发器

本文深入探讨了SQL触发器的概念及其在数据库管理中的应用,特别关注了如何利用触发器进行日志记录,包括创建不同类型的触发器、触发顺序及测试方法。文章详细解释了触发器的工作原理,提供了实例演示如何实现数据操作的日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--触发器
--执行顺序:前语句触发->前行级触发->后行级触发->后语句触发
--instead of 类型的触发器主要解决视图的不可更新问题,比如多表关联或者group by语句 的,或者通过函数生成的复杂视图不可更新

CREATE TRIGGER tri_del
AFTER DELETE
ON jobs
BEGIN
IF deleting THEN
   dbms_output.put_line('删除数据操作!');
END IF;
END;


 

SELECT * FROM user_source WHERE NAME='TRI_DEL' ORDER BY line;

SELECT * FROM log_tab;
--创建序列
CREATE SEQUENCE log_tab_id
MINVALUE 100000000
MAXVALUE 999999999
START WITH 100000000
INCREMENT BY 1


--创建触发器,如果向表jobs中插入数据,就向日志表中进行记录

CREATE TRIGGER job_oper_tri
BEFORE INSERT
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
   IF inserting THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
   dbms_output.put_line('插入数据的主键:'||:new.job_id);
   END IF;  
END;


--下面两条语句是针对上述两个触发器进行测试的语句

INSERT INTO jobs VALUES('123','ceshi','1000','2000');
UPDATE jobs SET job_title='update' WHERE job_id='123';
DELETE FROM jobs WHERE job_id='123';


---使用多种触发事件,:new和:old表示在行级触发中来访问变更前后的数据

CREATE TRIGGER job_oper
BEFORE INSERT OR UPDATE OR DELETE
ON jobs
FOR EACH ROW--表示行级触发,没插入一行记录就触发一次
BEGIN
  CASE
   WHEN inserting THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
    dbms_output.put_line('插入数据的主键:'||:new.job_id);
   WHEN updating THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
    dbms_output.put_line('修改数据的主键:'||:old.job_id);
   WHEN deleting THEN
      INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
   dbms_output.put_line('删除数据的主键:'||:old.job_id);
   END CASE;  
END;

SELECT * FROM jobs;


--触发器中使用if语句

CREATE TRIGGER job_if
BEFORE UPDATE OF MIN_SALARY ON jobs
FOR EACH ROW
BEGIN

IF(TO_CHAR(SYSDATE,'dd')=27 AND OLD:MIN_SALARY>2000)THEN
raise_application_error(-20000,'今天是27号,不允许修改最低工资2000以上的数据!');
  INSERT INTO log_tab VALUES(
      log_tab_id.nextval,
      'jobs',
      'insert',
      :new.job_id,
      SYSDATE
   );
   END IF;
dbms_output.put_line('数据修改完成,主键是:'||:old.job_id);
END;



--触发器也可以进行级联修改,再操作中可以更新,插入,删除操作同时做


--DDL触发器

CREATE TRIGGER job_ddl
BEFORE CREATE OR UPDATE OR DROP OR RENAME ON schema
BEGIN
  IF sysevent ='create' THEN
    dbms_output.put_line(dictionary_obj_name||'创建中...');
  elseif sysevent ='drop' THEN
    IF dictionary_obj_name='TEST' THEN
    raise_application_error(-20000,'不允许删除表');
    END IF;
  elseif sysevent='alter' THEN
    raise_application_error(-20000,'不允许修改表');
  END IF;
END;




--系统触发器,级别是数据库级别,该触发器用于记录每个用户登陆的时间

CREATE TRIGGER logon_tgr
AFTER
LOGIN
ON
DATABASE
BEGIN
  INSERT INTO log_user VALUES(log_tab_id.nextval,sys.login_user,SYSDATE);
END;

 

转载于:https://my.oschina.net/lzhaoqiang/blog/547651

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值