PL / SQL触发器-保存更新列的日志,如何设置插入PK

时间:2018-09-06 11:20:09

标签: sql oracle plsql

我正在尝试编写一个触发器,以便在该表的特定列更新时记录该表的旧值。

这是我到目前为止编写的代码:

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上没有设置任何内容...

1 个答案:

答案 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;