Выполнить блок кода в транзакции в postgres - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу запустить следующий блок кода в транзакции, чтобы в случае сбоя sql statements вся транзакция была прервана. Если я запускаю следующий блок как есть, выполняется ли он в транзакции или мне нужно запустить его внутри BEGIN; ... COMMIT;

DO $$
  DECLARE
    readonly_exists int;
BEGIN
  SELECT COUNT(*) INTO readonly_exists FROM information_schema.enabled_roles
    WHERE role_name = 'readonly';
  IF readonly_exists = 0 THEN
    <SQL STATEMENT 1>
    <SQL STATEMENT 2>
    <SQL STATEMENT 3>
  ELSE
    RAISE EXCEPTION 'readonly role already exists';
  END IF;
END$$;

1 Ответ

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

Любой оператор SQL всегда выполняется в одной транзакции (исключение из этого правила составляет CALL).

Таким образом, ваш оператор DO будет выполняться в одной транзакции, и все три SQL операторов выполнены успешно, или все будут отменены.

...