用oracle触发器对记录表增加记录的问题

tcrct 2009-03-01 10:21:53
现想对指定用户下的指定表都作一个操作记录,有一个logs表,
字段 类型
id number
objid varchar2(50) --操作表的ID字段
objname varchar2(20) --操作表的名称
optione varcahr2(20) --操作类型(增删改)
createtime date --logs记录创建时间

需求就是,创建一个触发器,当对用户下的指定表进行增删改时,就对logs表增加一条操作记录。网上搜了很久都没有找到所要的答案,不知如何能自动得知操作表的ID号及正在进行的是那种类型的操作。

...全文
190 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcrct 2009-03-02
  • 打赏
  • 举报
回复
字段 类型
id number
objid varchar2(50) --操作表的ID字段
objname varchar2(20) --操作表的名称
optione varcahr2(20) --操作类型(增删改)
createtime date --logs记录创建时间

创建表logs

create or replace trigger tr_test
after update or delete or insert
on t_test
for each row
begin
if inserting then
insert into t_logs values(seq_logid.nextval,:old.id,'t_test','insert',sysdate);
elsif updating then
insert into t_logs values(seq_logid.nextval,:old.id,'t_test','update',sysdate);
elsif deleting then
insert into t_logs values(seq_logid.nextval,:old.id,'t_test','delete',sysdate);
end if;
end;


多谢谢1楼及7楼的,按7楼的所言,明白了old.xx的意思,所有将old.objid改为old.id,由于我更改的表里没有指定表名,所以就直接写死了。谢谢~
yf520gn 2009-03-02
  • 打赏
  • 举报
回复
你的意思是要在每个表上都建立一个触发器,如1楼所言,你再每种情况下写上你要执行的INSERT语句就好了!
willflyz 2009-03-02
  • 打赏
  • 举报
回复
更新之前的记录的值,old就是原来记录,new就是更新后的记录,insert,update才会有值,old,new是默认的也可能自定义,如下
for each row
referencing new as newname old as oldname
tcrct 2009-03-02
  • 打赏
  • 举报
回复
另,我想问一下old.objid及old.objname分别是什么?
tcrct 2009-03-02
  • 打赏
  • 举报
回复
create or replace trigger tr_test
after update or delete or insert
on t_test
for each row
begin
if inserting then
insert into t_logs values(seq_logid.nextval,:old.objid,:old.objname,'insert',sysdate);
elsif updating then
insert into t_logs values(seq_logid.nextval,:old.objid,:old.objname,'update',sysdate);
elsif deleting then
insert into t_logs values(seq_logid.nextval,:old.objid,:old.objname,'delete',sysdate);
end if;
end;

logs表我是按前面所说的字段类型来建的。其中seq_logid.nextval是oracle的序列号来的。一执行insert就报ora-04098的错,请问如何解决呢?
在线等....谢谢!
willflyz 2009-03-02
  • 打赏
  • 举报
回复
报这个错,应该是你插入LOG表的字段类型不匹配造成,检查一下类型.
tcrct 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hdhai9451 的回复:]

create or replace trigger tr
after update or delete or insert
on t
for each row
begin
if inserting then
insert into logs values(:new.id,:new.objid,:new.objname,'insert',sysdate);
elsif updating then
insert into logs values(:old.id,:old.objid,:old.objname,'update',sysdate);
elsif deleting then
insert into logs values(:old.id,:old.objid,:old.objname,'delete',sysdate);
en…
[/Quote]

谢谢你的读贴,不过你这个触发器,并不能执行呀!会报错的ORA-04098
oraclelogan 2009-03-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hdhai9451 的回复:]

create or replace trigger tr
after update or delete or insert
on t
for each row
begin
if inserting then
insert into logs values(:new.id,:new.objid,:new.objname,'insert',sysdate);
elsif updating then
insert into logs values(:old.id,:old.objid,:old.objname,'update',sysdate);
elsif deleting then
insert into logs values(:old.id,:old.objid,:old.objname,'delete',sysdate);
en…
[/Quote]

学习了!
Andy__Huang 2009-03-01
  • 打赏
  • 举报
回复

create or replace trigger tr
after update or delete or insert
on t
for each row
begin
if inserting then
insert into logs values(:new.id,:new.objid,:new.objname,'insert',sysdate);
elsif updating then
insert into logs values(:old.id,:old.objid,:old.objname,'update',sysdate);
elsif deleting then
insert into logs values(:old.id,:old.objid,:old.objname,'delete',sysdate);
end if;
end;

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧