【问题标题】:How to find out when a column was changed in Oracle DB?如何找出 Oracle DB 中的列何时更改?
【发布时间】:2016-06-26 12:17:45
【问题描述】:

我希望能够查看特定列的更改时间。 澄清一下,我不想看到何时更改了行。我可以使用 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。

【问题讨论】:

  • 什么是data1data2。你能举个例子来创建/更新你给的表吗?
  • 你是否开启了闪回功能?
  • 基本的字符串或数字,可以是任何东西。我将编辑我的帖子以使其更清楚,谢谢。闪回已关闭,但由于我稍后要创建一个新数据库,所以我可以将其打开。
  • 您可以编写一个触发器,在每次行更改时比较每一列,并将结果写入审计表。是你想要的吗?这将是一个要写入的 fancy 触发器(对于任何给定的表)。否则,如果您想保留修改时间的记录以及以前的值,则必须编写一个完整的数据仓库。

标签: sql oracle timestamp


【解决方案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;
    

【讨论】:

  • 我发现你的第一个 if 语句条件很有帮助,因为我也是这样做的
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2014-04-22
  • 2012-11-09
  • 2010-09-20
  • 1970-01-01
  • 2014-08-23
  • 2020-07-27
相关资源
最近更新 更多