存储日期和时间Oracle Apex中行数据的时间和更新程序/用户

时间:2017-04-25 06:38:52

标签: sql oracle oracle-apex

寻找理想的存储方式(1)日期和时间更新时间(2)使用Oracle Apex的每行表数据的更新程序/用户。我正在考虑添加2个额外的列来存储信息,并试图找出如何跟踪每行的更改。

1 个答案:

答案 0 :(得分:0)

如果要在表上创建插入,更新,删除日志,则添加2列不够。每个新更新都将删除以前,并且无法记录删除。因此,您需要将数据表与数据表分开存储,并在数据表上创建的触发器之前和之后填充它。如果你想要样品,我可以提供一些。

这里简化的例子,当然在现实生活中数据会更复杂,我猜一个触发器应该更加智能,但这是创建自己的简单起点。执行下面的代码后,尝试在表TEST_DATA中插入,更新,删除删除记录,看看TEST_LOG

中发生了什么

创建数据表

create table TEST_DATA (
  UNID number,
  COL_B varchar2(50)
);
-- Create/Recreate primary, unique and foreign key constraints 
alter table TEST_DATA
  add constraint PK_TEST_DATA_UNID primary key (UNID);

为其创建日志表

create table TEST_LOG (
  UNID number,
  OPERATION varchar2(1),
  COL_OLD varchar2(50),
  COL_NEW varchar2(50),
  CHNGUSER varchar2(50),
  CHNGDATE date
);

最后创建跟踪变化的触发器

create or replace trigger TR_LOG_TEST_DATA
   after update or insert or delete on TEST_DATA
   referencing new as new old as old
   for each row
begin
   if Inserting then
      insert into TEST_LOG
         (UNID, OPERATION, COL_OLD, COL_NEW, CHNGUSER, CHNGDATE)
      values
         (:new.unid, 'I', null, :new.col_b, user, sysdate);
   end if;

   if Updating then
      insert into TEST_LOG
         (UNID, OPERATION, COL_OLD, COL_NEW, CHNGUSER, CHNGDATE)
      values
         (:new.unid, 'U', :old.col_b, :new.col_b, user, sysdate);
   end if;

   if Deleting then
      insert into TEST_LOG
         (UNID, OPERATION, COL_OLD, COL_NEW, CHNGUSER, CHNGDATE)
      values
         (:old.unid, 'D', :old.col_b, null, user, sysdate);
   end if;

end;