Вопрос

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

Теперь мне нужно применить несколько сценариев одновременно и в одной транзакции.Пока что единственное решение, которое я придумал, — это удалить стартовую транзакцию/фиксацию из исходного набора скриптов, а затем объединить их внутри нового блока стартовой транзакции/фиксации.Я пишу сценарии на Perl, чтобы делать это на лету.

По сути, мне нужны вложенные транзакции, которые я не могу понять, как это сделать в postgresql.

Есть ли способ выполнить или смоделировать вложенные транзакции для этой цели?У меня есть настройки для автоматического устранения любой ошибки, поэтому мне не нужно продолжать транзакцию верхнего уровня, если какая-либо из транзакций нижнего уровня завершится неудачей.

Это было полезно?

Решение

Что ж, у вас есть возможность использовать вложенные транзакции внутри postgresql с помощью SavePoints.

Возьмем этот пример кода:

CREATE TABLE t1 (a integer PRIMARY KEY);

CREATE FUNCTION test_exception() RETURNS boolean LANGUAGE plpgsql AS
$$BEGIN
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (2);
   INSERT INTO t1 (a) VALUES (1);
   INSERT INTO t1 (a) VALUES (3);
   RETURN TRUE;
EXCEPTION
   WHEN integrity_constraint_violation THEN
      RAISE NOTICE 'Rollback to savepoint';
      RETURN FALSE;
END;$$;

BEGIN;

SELECT test_exception();
NOTICE:  Rollback to savepoint
 test_exception 
----------------
 f
(1 row)

COMMIT;

SELECT count(*) FROM t1;
 count 
-------
     0
(1 row)

Возможно, это вам немного поможет.

Другие советы

В итоге я «решил» свою проблему вне диапазона - я использую Perl-скрипт, чтобы переработать входные сценарии, чтобы исключить их вызовы запуска транзакции/фиксации, а затем помещаю их все в один файл, который получает свою собственную стартовую транзакцию/ совершить.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top