如何找出Oracle中列的更改时间?

时间:2016-03-11 09:58:15

标签: sql oracle timestamp

我希望能够在更改特定列时看到。 为了澄清,我不想看到,当一行被更改时。我能够通过ROWDEPENDENCIES和带有时间戳的触发器来实现。使用ROWDEPENDICIES,我可以看到最后一行被修改的时间,但我特别想知道特定列的更改时间。

为了澄清,我想要下表:

id   Name       Name_modified_on    Salary   Salary_modified_on
 1   Johnson    11.03.16 10:54:27   5000     11.03.16 10:51:27  

我该怎么做?谢谢。 PS:我正在运行Oracle 11g。

1 个答案:

答案 0 :(得分:1)

试试这段代码:

  1. 创建一个表格:

    CREATE TABLE TEST
    (
      ID                  VARCHAR2(2000 BYTE),
      NAME                VARCHAR2(2000 BYTE),
      NAME_MODIFIED_ON    DATE                      DEFAULT sysdate,
      SALARY              NUMBER(10),
      SALARY_MODIFIED_ON  DATE                      DEFAULT sysdate
    );
    
  2. 创建数据库触发器:

    DECLARE
    /******************************************************************************
       NAME:       COLUMN_UPDATE_TRG
       PURPOSE:    
    
       REVISIONS:
       Ver        Date        Author           Description
       ---------  ----------  ---------------  ------------------------------------
       1.0        4.8.2016     Tomaz Kristan    1. Created this trigger.
    
       NOTES:
    
       Automatically available Auto Replace Keywords:
          Object Name:     COLUMN_UPDATE_TRG
          Sysdate:         4.8.2016
          Date and Time:   4.8.2016, 14:33:39, and 4.8.2016 14:33:39
          Username:         (set in TOAD Options, Proc Templates)
          Table Name:      Z_TEST (set in the "New PL/SQL Object" dialog)
          Trigger Options:  (set in the "New PL/SQL Object" dialog)
    ******************************************************************************/
    BEGIN
    
    IF UPDATING THEN
    
        IF ( :new.name is not null AND :new.name != :old.name ) THEN
             :new.name_modified_on := sysdate;
        END IF;   
    
        IF ( :new.salary is not null AND :new.salary != :old.salary ) THEN
             :new.salary_modified_on := sysdate;
        END IF;           
    
    END IF;
    
       EXCEPTION
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    END COLUMN_UPDATE_TRG;