如何使用触发器能够记录一张表更新之前的数据

如何使用触发器能够记录一张表更新之前的数据,第1张

不知道你是什么数据库,我把我的思路和你说一下吧。

其实最直接的办法就是判断每列的old值和new值进行比较,不同的则插入记录表中;但是这样很麻烦,需要做很多判断,你的列这么多,会有很多判断,所以比较繁琐。

另一种思路是这样,更新的记录有old值和new值,两条记录,对这两条记录进行 *** 作,比如:

tab1的表为:
id  col1  col2  col3  col4  col5
 1   B     A      I     D    U
更新了tab1的col2字段变为:
id  col1  col2  col3  col4  col5
 1   B    HELLO   I     D    U
 产生了old和new两条记录,目的是找出值不同的列,跟原表的形式来找的话就需要几个判断。如果我们改变原表的形式的话,可 *** 作性会更强一些,做这些改变。
select decode(col1,'H','col1') t1,'H' t2 from tab1 where id=1
union all
select decode(col2,'E','col2') t1,'E' t2 from tab1 where id=1
union all
select decode(col3,'L','col3') t1,'L' t2 from tab1 where id=1
union all
select decode(col4,'L','col4') t1,'L' t2 from tab1 where id=1
union all
select decode(col5,'O','col5') t1,'0' t2 from tab1 where id=1;
结构变为:
 T1     T2
col1 H
col2 E
col3 L
col4 L
col5 0
这样的话old记录和new记录就各产生一份这种类型的数据集,这是就可以通过select来判断改变的列,存到触发器定义的变量中。
select tab1T1,tab1T2 into v_col,v_val from old_record tab1,new_record tab2 where tab1T1=tab2T1 and tab1T2<>tab2T2
然后插入到记录表中
insert into 记录表 values(v_col,v_val,sysdate);
有问题欢迎讨论,望采纳。

我给你语言描述吧
IF :NEW。主键 ! = :OLD 。主键 THEN --如果主键更新了
执行触发器
ELSE
NULL
END IF;
完整过程
CREATE OR REPLACE TRIGGER 名字
BEFORE UPDATE
ON 表名
FOR EACH ROW
DECLARE
自定义字段
BEGIN
IF update THEN
IF :NEW。主键 ! = :OLD 。主键 THEN --如果主键更新了
执行触发器
ELSE
NULL
END IF;
END IF;
END;
END 触发器名称
信息来源:饭客网络

触发器使用的意义在于当某一个数据表发生变化时,致使关联的另一个数据表也随之变化。这个用于更新密码意义不大。建议在程序里用代码先判断用户名和密码是否一致,如果一致则允许并写入库较为妥当。

我感觉还不是你对数据库的事务处理不太明白。
虽然我也没有看懂你的问题,但我想知道的是你的更新是否是只有一条,但我只能揣摩你的目的!
你的目的就是更新记录时形成一个备份而已。如果是这样,建议你这么写过程:
Create trigger TR_table1_update_log
on table1
for update
as
begin
insert into change select 'table1',sid from inserted
end
触发器的命名分为四个部分:TR表是是一个触发器,table1表示工作在table1表上,update表示为update所设,log是记录。
语句就是将更新的语句全部用上。
一般情况下我们所谓的chage会有系统时间,更新的SID,来源于某表,等一些关键值。而insrted表中也可能不是一条记灵,如果记录时要记录全部更新记录时不可以用一个变量去求一个所有的结果的!而select 进行投影时可以加入常值,这样你所有的问题都可以得到解决!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/13339842.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-17
下一篇 2023-07-17

发表评论

登录后才能评论

评论列表(0条)

保存