2012-11-07 43 views
2

根据需求,我需要为每个表支持两个必填列:ADDED_DATE,MODIFIED_DATE。
这些用于DBA /审计目的。Oracle表审计的添加日期和修改日期

当我从应用程序中插入/更新记录时,是否可以使这些东西完全自动化,由数据库本身支持?

+0

的可能重复[如何找出当Oracle表上次更新时间](http://stackoverflow.com/questions/265122/how-to-find-out-when- an-oracle-table-was-updated-the-last-time) – sleske

回答

3

在表格上创建触发器(每行更新之前)。

SQL> create table foo (hi varchar2(10), added_date date, modified_date date); 

Table created. 

SQL> create trigger foo_auifer 
    2 before update or insert on foo 
    3 for each row 
    4 declare 
    5 begin 
    6 if (inserting) then 
    7  :new.added_date := sysdate; 
    8 elsif (updating) then 
    9  :new.modified_date := sysdate; 
10 end if; 
11 end; 
12/

Trigger created. 

SQL> insert into foo (hi) values ('TEST'); 

1 row created. 

SQL> insert into foo (hi) values ('TEST2'); 

1 row created. 

SQL> update foo set hi = 'MODDED' where rownum = 1; 

1 row updated. 

SQL> alter session set nls_date_format='dd-mon-yyyy hh24:mi:ss'; 

Session altered. 

SQL> select * from foo; 

HI   ADDED_DATE   MODIFIED_DATE 
---------- -------------------- -------------------- 
MODDED  07-nov-2012 15:28:28 07-nov-2012 15:28:39 
TEST2  07-nov-2012 15:28:30 

SQL> 
3
create table "db_user"."my_table" (
    ... 
    "added_date" date default sysdate, 
    "modified_date" date default sysdate 
) 
/
create or replace 
trigger "db_user"."trg_my_table_audit" 
before update on my_table for each row 
begin 
    :new.modified_date := sysdate; 
end; 
+0

+1用于指出插入操作不需要触发器。 “default sysdate”对于插入工作正常。你只需要触发更新。 –