2012-11-07 42 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」對於插入工作正常。你只需要觸發更新。 –