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;
/

}

4

1 回答 1

0

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

您在通常会列出列名的语句中省略了可选列部分。insert如果没有列名的显式列表,则将根据目标表中列的顺序分配值,如user_tab_columns.column_id或中所示describe。最好列出列以避免歧义。因此,如果表定义发生更改(例如,添加了列,因此您没有足够的值)或列顺序在另一个环境中不同(可以说在体面的源代码控制下不应该发生),您就不会遇到问题)。也更容易发现琐碎的错误。

无论如何,只需列出您要插入的表中的列名:

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

于 2012-11-02T15:36:25.540 回答