如何在更新前插入(自定义审核)

How to insert before update (Custom audit)

我想在更新某些行之前执行插入,插入将包含有关 table 更新的信息、更新的列、执行的查询等信息。

我写了这样的东西:

DO $$
DECLARE _new_product_id bigint := 1;
        _update_by_product_id bigint:= 2;

-- BEGIN TRANSACTION
BEGIN

DECLARE product_sql_query text := 'UPDATE products  SET product_id =' + _new_product_id + 'WHERE product_id =' + _update_by_product_id + ';'

INSERT INTO products_audit (ordinal_number, table_name, column_name, action_applied, query_executed, value_before_update, value_after_update, created_date  ) 
                            VALUES (1, 'products', 'product_id', 'UPDATE', users_query, 1, 1, NOW());

-- END TRANSACTION
COMMIT;
END;
$$

但是我收到一个语法错误:

ERROR: syntax error at or near "INSERT" LINE 9: INSERT INTO products_audit (ordinal_number, table...

这里有什么问题,我猜 product_sql_query 值不正确?

DECLARE 块需要在 PL/pgSQL 的第一个 BEGIN 之前 - 这与 BEGIN TRANSACTION 不同。您无法控制匿名 PL/pgSQL 区块中的交易。

我不清楚你对 product_sql_query 变量的意图,但删除所有语法错误后,该块应如下所示:

DO $$
DECLARE 
  _new_product_id       bigint := 1;
  _update_by_product_id bigint:= 2;
  product_sql_query     text;
BEGIN

  product_sql_query := 'UPDATE products  SET product_id = ' || _new_product_id::text ||' WHERE product_id = ' || _update_by_product_id::text;

  INSERT INTO products_audit 
    (ordinal_number, table_name, column_name, action_applied, query_executed, value_before_update, value_after_update, created_date) 
  VALUES 
    (1, 'products', 'product_id', 'UPDATE', users_query, 1, 1, NOW());

END;
$$