oracle触发器记录字段变更
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle触发器记录字段变更相关的知识,希望对你有一定的参考价值。
记录变更字段名和原始值…现在值…修改用户…修改时间等基础信息…我知道要用到表级和行级和包…但是不会写…求高人指点…
原来回答过这类问题。其实最直接的办法就是判断每列的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 tab1.T1,tab1.T2 into v_col,v_val from old_record tab1,new_record tab2 where tab1.T1=tab2.T1 and tab1.T2<>tab2.T2
然后插入到记录表中
insert into 记录表 values(v_col,v_val,sysdate); 参考技术A 你应该把表结构列出来,我这里给你提供个思路
现在假设有个表A :
create table a (id number,name varchar2(20));
有个B表去跟踪表A的变化:
create table b (
operat varchar2(10), --做的什么操作,可能的的有删除、插入、修改
col varchar2(10), --修改的列名
orig varchar2(50), --原始值,插入时为空
curr varchar2(50), --现在值,删除时为空
who varchar2(30), --修改用户
when date --修改时间
);
create or replace trigger tri_a_af_idu
after insert or delete or update on a
for each row --行级触发器
begin
if inserting then --如果插入,表A有几个字段就在表B记几行
insert into b values ('insert','id', '',to_char(:new.id),user,sysdate);
insert into b values ('insert','name','',:new.name,user,sysdate);
end if;
if deleting then --删除时新值是空
insert into b values ('delete','id',to_char(:old.id), '',user,sysdate);
insert into b values ('delete','name',:old.name,'',user,sysdate);
end if;
if updating then --更新哪个字段就记录哪个
if :new.id != :old.id then
insert into b values ('update','id',to_char(:old.id),to_char(:new.id),user,sysdate);
end if;
if :new.name != :old.name then
insert into b values ('update','id', :old.name,:new.name,user,sysdate);
end if;
end if;
end;
/
--测试DML操作
insert into a values (1,'111');
insert into a values (2,'222');
update a set id=3,name='333' where id=1;
delete a where id=3;
select * from a;
select * from b;
oracle 如何将字段类型varchar 改为blob 更改提示数据类型的变更无效
按照官方规定,不可以直接改成BLOB字段。一个替代的办法是:可以先把原字段改名,然后新建个字段用正确的类型,再把数据转入新建的字段,然后把原来那个改名的字段删除。 参考技术A 1. 新增一列 blob
2. 将varchar列存储到blob列(不会,自己试试)
3. 将varchar列删除
4. 将blob列改名(为原varchar列)本回答被提问者和网友采纳
以上是关于oracle触发器记录字段变更的主要内容,如果未能解决你的问题,请参考以下文章
oracle触发器自身表更新时,怎么拿到别的表字段数据更新自身表的某个字段?
oracle创建触发器(例:当有操作x_yonghu表指定字段并且字段有修改时,插入日志表)