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