oracle触发器记录字段变更

记录变更字段名和原始值…现在值…修改用户…修改时间等基础信息…我知道要用到表级和行级和包…但是不会写…求高人指点…... 记录变更字段名和原始值…现在值…修改用户…修改时间等基础信息…我知道要用到表级和行级和包…但是不会写…求高人指点… 展开
 我来答
jsczwangx
推荐于2016-07-29 · TA获得超过1222个赞
知道小有建树答主
回答量:777
采纳率:100%
帮助的人:660万
展开全部

原来回答过这类问题。其实最直接的办法就是判断每列的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);
太平岁年丰9
2013-10-20 · TA获得超过1231个赞
知道小有建树答主
回答量:1017
采纳率:100%
帮助的人:1120万
展开全部
你应该把表结构列出来,我这里给你提供个思路
现在假设有个表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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式