使用下面提到的触发器,我在跟踪审计或更改日志表中的生产表中的更改。我的问题是跟踪表中的字段名称与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 :(得分:0)
如果主表和审计表中的列名不同,则没有区别。我不确定为什么你认为这是一个问题 - 显示任何错误可能有助于澄清你的问题,以及表定义。我可以立即看到抛出的唯一错误 - 假设tracking table
中的空格是转录中的错误 - 如果列 order 不匹配并且您输错了类型或列中的数据大小。很难猜到你在看什么。
您在insert
语句中省略了通常列出列名的可选column section。如果没有明确的列名列表,将根据目标表中列的顺序分配值,如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
等。