Как вставить перед обновлением (Пользовательский аудит) - PullRequest
0 голосов
/ 24 февраля 2020

Я хотел бы выполнить вставку перед обновлением некоторых строк, вставка будет содержать информацию о том, какая таблица обновляется, какой столбец обновляется, какой запрос выполняется и т. Д. c ..

И я написал что-то вроде this:

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;
$$

Но я получаю синтаксическую ошибку, которая говорит:

ОШИБКА: синтаксическая ошибка в или около "INSERT" ЛИНИЯ 9: INSERT INTO products_audit (ordinal_number, таблица ...

Что здесь не так, я думаю, что значение product_sql_query неверно?

1 Ответ

1 голос
/ 24 февраля 2020

Блок DECLARE должен go до первого НАЧАЛА PL / pg SQL - что не совпадает с BEGIN TRANSACTION. Вы не можете контролировать транзакции в анонимном блоке PL / pg SQL.

Мне неясно, что вы намерены использовать с переменной 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;
$$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...