2013-12-24 67 views
1

我有一个cust_info表,需要跟踪更新并删除它。我创建了2个新表(archive_customers与cust_info相同,但customers_hist包含两个额外的实例(changed_by和change_date))。用于跟踪更改历史记录的SQL触发器 - ORACLE DB

CREATE TABLE CUST_INFO 
    (
    CUST_ID  NUMBER(15), 
    CUST_F_NAME VARCHAR(20), 
    CUST_L_NAME VARCHAR(20), 
    CUST_ADDRESS VARCHAR(40), 
    CITY   VARCHAR(30), 
    STATE   VARCHAR(30), 
    ZIP   NUMBER, 
    PHONE   VARCHAR(12), 
    PRIMARY KEY (CUST_ID) 
    ); 

我正在寻找类似的问题,这是我走到这一步:

CREATE OR REPLACE TRIGGER TRIGGER_UPDATE 
    BEFORE UPDATE ON CUST_INFO 
    FOR EACH ROW 
    BEGIN 
    INSERT INTO CUSTOMERS_HIST 
    (
    CUST_ID, 
    CUST_F_NAME, 
    CUST_L_NAME, 
    CUST_ADDRESS, 
    CITY, 
    STATE, 
    ZIP, 
    PHONE, 
    SYSDATE 
    ) 
     SELECT 
     OLD.CUST_ID, 
     OLD.CUST_F_NAME, 
     OLD.CUST_L_NAME, 
     OLD.CUST_ADDRESS, 
     OLD.CITY, 
     OLD.STATE, 
     OLD.ZIP, 
     OLD.PHONE 
     FROM CUST_INFO 
     END; 

     CREATE OR REPLACE TRIGGER TRIGGER_DELETE 
     BEFORE DELETE ON CUST_INFO 
     FOR EACH ROW 
     BEGIN 
     INSERT INTO ARCHIVE_CUSTOMERS 
     (
     CUST_ID, 
     CUST_F_NAME, 
     CUST_L_NAME, 
     CUST_ADDRESS, 
     CITY, 
     STATE, 
     ZIP, 
     PHONE 
    ) 
     SELECT 
     OLD.CUST_ID, 
     OLD.CUST_F_NAME, 
     OLD.CUST_L_NAME, 
     OLD.CUST_ADDRESS, 
     OLD.CITY, 
     OLD.STATE, 
     OLD.ZIP, 
     OLD.PHONE 
     FROM CUST_INFO 
     END; 

另外,我不知道怎么去填充change_by和CHANGE_DATE?

如果您需要更多信息,请发表评论。

谢谢

回答

2

也许你可以分别使用usersysdate内置功能chnage_bychange_date。我想写的代码是完全不同的,如果我想将更改历史记录存储在表中。然而,对于你的例子,代码如下:

CREATE OR REPLACE TRIGGER TRIGGER_UPDATE 
    BEFORE UPDATE 
    ON CUST_INFO 
    FOR EACH ROW 
BEGIN 
    INSERT INTO CUSTOMERS_HIST (CUST_ID, 
           CUST_F_NAME, 
           CUST_L_NAME, 
           CUST_ADDRESS, 
           CITY, 
           STATE, 
           ZIP, 
           PHONE, 
           SYSDATE, 
           change_by, 
           change_date) 
     SELECT OLD.CUST_ID, 
       OLD.CUST_F_NAME, 
       OLD.CUST_L_NAME, 
       OLD.CUST_ADDRESS, 
       OLD.CITY, 
       OLD.STATE, 
       OLD.ZIP, 
       OLD.PHONE, 
       user, 
       sysdate 
      FROM CUST_INFO; 
END; 
/

CREATE OR REPLACE TRIGGER TRIGGER_DELETE 
    BEFORE DELETE 
    ON CUST_INFO 
    FOR EACH ROW 
BEGIN 
    INSERT INTO ARCHIVE_CUSTOMERS (CUST_ID, 
            CUST_F_NAME, 
            CUST_L_NAME, 
            CUST_ADDRESS, 
            CITY, 
            STATE, 
            ZIP, 
            PHONE, 
            change_by, 
            change_date) 
     SELECT OLD.CUST_ID, 
       OLD.CUST_F_NAME, 
       OLD.CUST_L_NAME, 
       OLD.CUST_ADDRESS, 
       OLD.CITY, 
       OLD.STATE, 
       OLD.ZIP, 
       OLD.PHONE, 
       user, 
       sysdate 
      FROM CUST_INFO; 
END; 
/

这是你的问题的答案。

现在,如果我是你,我会如下建立一个审计表:

TABLE audit_entry 
(
    audit_Entry_Id INTEGER, 
    change_By  VARCHAR2 (30), -- User who made the change 
    change_TS  TIMESTAMP,  -- TS at which the change was made 
    table_Name  VARCHAR2 (30), -- Name of table on which change was made 
    column_Name  VARCHAR2 (30), -- Name of column in that table 
    primary_key_id INTEGER,  -- The PK or ID of the row which was changed 
    old_clob   CLOB, 
    new_clob   CLOB, 
    old_TS   TIMESTAMP, 
    new_TS   TIMESTAMP, 
    old_number  NUMBER (36, 2), 
    new_number  NUMBER (36, 2) 
) 

最后oldnew列将存储适当的数据类型的新旧值。您也可以根据您的需求改善桌子。然后,在您的表格上创建一个触发器来跟踪更改并相应地将值插入到audit_entry表中。

相关问题