Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транзакция на PL/pgSQL / 9 сообщений из 9, страница 1 из 1
01.02.2021, 12:15
    #40040429
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
Я написал пару SQL команд, которые должны выполняться в одной транзакции:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DELETE FROM web.cabinet_account_section;

DELETE FROM web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;

INSERT INTO web.cabinet_account_section (section_id, cabinet_param_id, account_id)
SELECT bcsi.section_id, bcsi.cabinet_param_id, ca.id
FROM web.buffer_cabinet_account_section bcsi
JOIN web.cabinet_account ca ON bcsi.account_name = ca.account_name;

DROP TABLE web.buffer_cabinet_account;

DROP TABLE web.buffer_cabinet_account_section;


Если в одной из команд произошла ошибка, то все изменения должны откатиться.

Как правильно написать транзакцию на PL/pgSQL? С чего начать? До этого не приходилось писать подобные вещи.
...
Рейтинг: 0 / 0
01.02.2021, 12:21
    #40040435
mefman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
Wasteland Rebel
Я написал пару SQL команд, которые должны выполняться в одной транзакции:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DELETE FROM web.cabinet_account_section;

DELETE FROM web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;

INSERT INTO web.cabinet_account_section (section_id, cabinet_param_id, account_id)
SELECT bcsi.section_id, bcsi.cabinet_param_id, ca.id
FROM web.buffer_cabinet_account_section bcsi
JOIN web.cabinet_account ca ON bcsi.account_name = ca.account_name;

DROP TABLE web.buffer_cabinet_account;

DROP TABLE web.buffer_cabinet_account_section;


Если в одной из команд произошла ошибка, то все изменения должны откатиться.

Как правильно написать транзакцию на PL/pgSQL? С чего начать? До этого не приходилось писать подобные вещи.

begin;
...
commit;
profit.
А при чем тут PL/pgSQL?
...
Рейтинг: 0 / 0
01.02.2021, 12:31
    #40040440
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
mefman
Wasteland Rebel
Я написал пару SQL команд, которые должны выполняться в одной транзакции:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DELETE FROM web.cabinet_account_section;

DELETE FROM web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;

INSERT INTO web.cabinet_account_section (section_id, cabinet_param_id, account_id)
SELECT bcsi.section_id, bcsi.cabinet_param_id, ca.id
FROM web.buffer_cabinet_account_section bcsi
JOIN web.cabinet_account ca ON bcsi.account_name = ca.account_name;

DROP TABLE web.buffer_cabinet_account;

DROP TABLE web.buffer_cabinet_account_section;


Если в одной из команд произошла ошибка, то все изменения должны откатиться.

Как правильно написать транзакцию на PL/pgSQL? С чего начать? До этого не приходилось писать подобные вещи.

begin;
...
commit;
profit.
А при чем тут PL/pgSQL?

Я читал, что PostgreSQL не откатит изменения, если хоть в одном statement выше произойдет ошибка в блоке begin->commit без rollback. Т.е. он выполнит то, что может выполнить. И подумал, что здесь нужно что-то более сложное с применение pl/pgsql.
...
Рейтинг: 0 / 0
01.02.2021, 12:34
    #40040443
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
наоборот - откатит все, если хоть в одном ошибка. В этом и суть транзакции.
функция (plpgsql) - всегда транзакция, насколько я помню.

зы: DELETE FROM, в данном случае, можно (нужно) заменить на TRUNCATE.
А для читаемости лучше так писать:
Код: sql
1.
2.
3.
4.
TRUNCATE web.cabinet_account;

INSERT INTO web.cabinet_account (account_name, cabinet_id)
SELECT bca.account_name, bca.cabinet_id FROM web.buffer_cabinet_account bca;
...
Рейтинг: 0 / 0
01.02.2021, 12:41
    #40040447
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
tip78,

Попробовал с BEGIN ... COMMIT.
Если происходит ошибка, то вроде как действительно ничего не применяется. Но если ошибок не возникает, точнее не должны (так как не возникали без блока begin...commit), то получаю ошибку:
Код: sql
1.
2.
3.
4.
ERROR:  ОШИБКА:  текущая транзакция прервана, команды до конца блока транзакции игнорируются


SQL state: 25P02
...
Рейтинг: 0 / 0
01.02.2021, 12:46
    #40040450
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
значит есть ошибка
...
Рейтинг: 0 / 0
01.02.2021, 13:00
    #40040458
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
tip78
значит есть ошибка

Да, мой косяк был.
...
Рейтинг: 0 / 0
01.02.2021, 13:13
    #40040464
Wasteland Rebel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
tip78,
Кстати, почему TRUNCATE предпочтительнее?
...
Рейтинг: 0 / 0
01.02.2021, 18:07
    #40040615
tip78
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Транзакция на PL/pgSQL
потому быстрее и менее ресурсоёмок
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Транзакция на PL/pgSQL / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]