如何在更新前插入(自定义审核)
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;
$$
我想在更新某些行之前执行插入,插入将包含有关 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;
$$