我正在尝试编写一个触发器,以便在该表的特定列更新时记录该表的旧值。
这是我到目前为止编写的代码:
CREATE OR REPLACE TRIGGER log_valor_produto
AFTER UPDATE OF VALOR_VENDA ON PRODUTO
FOR EACH ROW
BEGIN
INSERT INTO PRODUTO_HISTORICO (IDPRODUTO, DATA_ALTERACAO, VALOR_ANTERIOR, USUARIO)
VALUES (:OLD.IDPRODUTO, SYSDATE, :OLD.VALOR_VENDA, USER);
END;
/
(不幸的是,目前,我无法测试此代码...)
我的问题是:如何在不设置PK值的情况下将其插入PRODUTO_HISTORICO表?该表有一个名为IDPRODUTO_HISTORICO的PK,我在触发器的INSERT上没有设置任何内容...
答案 0 :(得分:1)
哪个列(在PRODUTO_HISTORICO表中)成为主键?
除非您手动处理(通过触发器),否则-如果您使用的是12c,则创建一个 identity 列-不会“自动”执行任何操作。
最简单的选择可能是使用序列。例如:
CREATE SEQUENCE seq_historico;
CREATE OR REPLACE TRIGGER log_valor_produto
AFTER UPDATE OF valor_venda
ON produto
FOR EACH ROW
BEGIN
INSERT INTO produto_historico (primary_key_column, --> I added this ...
idproduto,
data_alteracao,
valor_anterior,
usuario)
VALUES (seq_historico.NEXTVAL, --> ... and this
:old.idproduto,
SYSDATE,
:old.valor_venda,
USER);
END;