2012-11-02 26 views
0

使用下面提到的触发器,我正在跟踪审计或更改日志表中的生产表中的更改。我的问题是跟踪表中的字段名称与table1中的字段名称不同。值是相同的,但列的名称是不同的。使用触发器跟踪更改 - 备用字段名称

问题是,触发器中的语法必须如何更改一个字段名称的值,并将其插入到跟踪表中不同名称的字段中?

感谢您的任何帮助或建议。

{

CREATE OR REPLACE TRIGGER track_change_trg 
AFTER INSERT OR UPDATE OR DELETE 
ON table1 
FOR EACH ROW 
BEGIN 
  
IF INSERTING THEN 
    INSERT INTO tracking table VALUES 
    (:new.pname, :new.p_id, :new.p_type, :new.t1name, 
    'INSERTED', SYSDATE); 
  
ESLIF UPDATING THEN 
    INSERT INTO tracking table VALUES 
    (:new.pname, :new.p_id, :new.p_type, :new.t1name, 
    'UPDATED', SYSDATE); 
      
ELSIF DELETING THEN 
    INSERT INTO tracking table VALUES 
    (:old.pname, :old.p_id, :old.p_type, :old.t1name, 
    'DELETED', SYSDATE); 
      
    END IF; 
END; 
/

}

回答

0

这没有什么区别,如果列名是在主及审核表不同。我不知道为什么你认为这是一个问题 - 显示任何错误可能有助于澄清您的问题,以及表定义。我可以立即看到的唯一错误就是抛出 - 假设tracking table中的空间是转录错误 - 是否订单不匹配,并且您将错误的数据类型或大小放在列中。很难猜到你看到的是什么。

您已省略insert语句中的可选column section,该语句通常会列出列名称。没有明确的列名称列表,将根据目标表中的列顺序分配值,如user_tab_columns.column_iddescribe所示。列出列以避免模棱两可会更好。所以如果表定义发生变化(例如添加了列,所以没有足够的值)或者列顺序在另一个环境中是不同的,那么您不会遇到问题(这可能不应该在体面的源代码管理下发生)。发现微不足道的错误也更容易。

不管怎么说,只列出从表中你插入的列名:

INSERT INTO tracking_table (x_name, x_id, x_type, x_t1name, x_action, x_when) 
VALUES (:new.pname, :new.p_id, :new.p_type, :new.t1name, 'INSERTED', SYSDATE); 

...实际列名替换x_name等从tracking_table

+0

谢谢。我的错误出现了,因为我试图像在SELECT语句中那样使用AS。你为我清除它很好... –