添加、删除、修改触发器,更新数据放入t_log表

本文详细介绍了如何使用SQL触发器实现对数据库操作(插入、更新、删除)的日志记录,包括触发器的创建、参数解析及日志数据的插入。

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

create or replace trigger put_log
  after insert or update or delete  on t_user 
  for each row
declare
--val_tablename varchar2(20);
--val_processing varchar2(20);
val_processingtime date;
val_deletedata varchar2(20);
val_insertdata varchar2(20);
val_olddata varchar2(20);
val_newdata varchar2(20);
--val_tablename:='t_user';

  -- local variables here
begin
   --修改触发
   if(updating) then
     dbms_output.put_line('updating!');
     val_processingtime:=sysdate;
     val_olddata:=:old.uname;
     val_newdata:=:new.uname;
     begin
       if(:old.uname<>:new.uname) then
         insert into t_log(tablename,processing,olddata,newdata,processingtime)
            values('t_user','updating',val_olddata,val_newdata,val_processingtime);
        end if;
     end;
      dbms_output.put_line(
       '编号:     '||:old.uno||
       '姓名:     '||:old.uname||
       'old字段: '||val_olddata||
       'new字段   '||val_newdata||
       'time is:  '||val_processingtime);
    
   --删除触发
   else if(deleting) then
     dbms_output.put_line('delete');
     val_processingtime:=sysdate;
     val_deletedata:=:old.uname;--delete old data
       begin
         insert into t_log(tablename,processing,processingtime,deletedata)
           values('t_user','deleting',val_processingtime,val_deletedata);
       end;
       dbms_output.put_line(
       '编号:     '||:old.uno||
       '姓名:     '||:old.uname||
       'time is:  '||val_processingtime||
       '删除字段: '||val_deletedata);
     --
   --插入触发
   else if(inserting) then
     dbms_output.put_line('insert');
     val_processingtime:=sysdate;
     val_insertdata:=:new.uname;---
     begin
         insert into t_log(tablename,processing,processingtime,insertdata)
           values('t_user','insert',val_processingtime,val_insertdata);
     end;
     dbms_output.put_line(
       '插入编号: '||:new.uno||
       '插入姓名: '||:new.uname||
       ' time is: '||val_processingtime);
   end if;
   end if;
   end if ;
end put_log;

### 创建 SQL 触发器 `tri_dqzt_log` 为了实现这一需求,可以使用如下 SQL 脚本创建触发器。此脚本基于 SQLite 和 PostgreSQL 的语法特点设计,并假设目标环境支持标准的触发器功能。 #### 触发器逻辑描述 1. 当 `yw_l_sgsxzcf` 中的字段 `dqzt` 发生更新时,触发器会被激活。 2. 如果旧值 (`OLD.dqzt`) 与新值 (`NEW.dqzt`) 不同,则向日志 `t_dqzt_log` 插入一条记录。 3. 记录的内容包括:`id`、原始 `dqzt` 值、新的 `dqzt` 值以及当前系统时间。 以下是完整的 SQL 脚本: ```sql CREATE TRIGGER tri_dqzt_log AFTER UPDATE OF dqzt ON yw_l_sgsxzcf FOR EACH ROW WHEN OLD.dqzt <> NEW.dqzt BEGIN INSERT INTO t_dqzt_log (id, old_dqzt, new_dqzt, log_time) VALUES (NEW.id, OLD.dqzt, NEW.dqzt, datetime('now')); END; ``` #### 解析 - **触发时机**: 使用 `AFTER UPDATE OF dqzt ON yw_l_sgsxzcf` 定义触发器在 `yw_l_sgsxzcf` 中 `dqzt` 字段发生更新之后启动[^1]。 - **条件判断**: 利用 `WHEN OLD.dqzt <> NEW.dqzt` 来确认只有当 `dqzt` 字段的实际值发生变化时才执行后续操作。 - **插入日志**: 将必要的信息(如 `id`, `old_dqzt`, `new_dqzt`, `log_time`)写入到日志 `t_dqzt_log` 中。其中,`datetime('now')` 函数用于获取当前的时间戳[^4]。 --- ### 验证触发器的功能 可以通过模拟数据更新来验证触发器的行为是否符合预期。例如: ```sql -- 更新前的状态 SELECT * FROM yw_l_sgsxzcf WHERE id = 1; -- 执行一次更新操作 UPDATE yw_l_sgsxzcf SET dqzt = '已处理' WHERE id = 1; -- 查看日志中的新增记录 SELECT * FROM t_dqzt_log ORDER BY log_time DESC LIMIT 1; ``` 上述测试流程可以帮助确认触发器是否正常工作并正确记录变更历史。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值