Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
Alex__kK
Member

Откуда:
Сообщений: 240
Всем добрый день!

Пытаюсь писать процедуры и столкнулся со странным поведением:

create or replace procedure development.my_test (a int, b int)
LANGUAGE plpgsql
AS $$
declare
  l_i int;
BEGIN
  l_i := a + b;
  insert into development.parti_1 (c1,c2,c3) values ('1',l_i,'1');
end
$$;

create or replace procedure development.my_test_loop ()
LANGUAGE plpgsql
AS $$
declare
 a int := 1;
BEGIN
  for i in 1..10 loop
    execute 'call development.my_test ($1, $2);' using a, i;
    commit;
  end loop;
end
$$
SECURITY INVOKER;


если процедуру development.my_test_loop делаем как SECURITY INVOKER, то все работает,
если ее делаем как SECURITY DEFINER, то выдает ошибку:
psql (11.5)
Введите "help", чтобы получить справку.

ddb=# call development.my_test_loop();
ERROR:  invalid transaction termination
КОНТЕКСТ:  PL/pgSQL function development.my_test_loop() line 9 at COMMIT


Вопрос, почему?
23 янв 20, 12:12    [22065119]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
Guzya
Member

Откуда:
Сообщений: 416
А разве можно завершать транзакцию(commit) внутри функции?
23 янв 20, 12:29    [22065149]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
Alex__kK
Member

Откуда:
Сообщений: 240
Guzya,

Это не функции, это процедуры, в них можно
23 янв 20, 12:59    [22065194]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 659
Alex__kK,

https://postgrespro.ru/docs/postgresql/11/sql-createprocedure
В процедуре с характеристикой SECURITY DEFINER не могут выполняться операторы управления транзакциями (например, COMMIT и ROLLBACK в некоторых языках).
23 янв 20, 15:07    [22065299]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
Alex__kK
Member

Откуда:
Сообщений: 240
Павел Лузанов,
Спасибо за ответ.

В некоторых языках.... То есть PL/PGSQL видимо относятся к этим некоторым языкам... А можно как-то огласить весь список этих некоторых языков?
23 янв 20, 15:15    [22065304]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
qwwq
Member

Откуда:
Сообщений: 2889
Alex__kK
Павел Лузанов,
Спасибо за ответ.

В некоторых языках.... То есть PL/PGSQL видимо относятся к этим некоторым языкам... А можно как-то огласить весь список этих некоторых языков?

написано русским по белому:
не могут во всех.
а конкретно обзываемые -- в некоторых.
ещё вопросы ?
23 янв 20, 15:24    [22065310]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
Alex__kK
Member

Откуда:
Сообщений: 240
qwwq,

Видимо русские языки у всех разные
23 янв 20, 15:38    [22065317]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
qwwq
Member

Откуда:
Сообщений: 2889
Павел Лузанов
Alex__kK,

https://postgrespro.ru/docs/postgresql/11/sql-createprocedure
В процедуре с характеристикой SECURITY DEFINER не могут выполняться операторы управления транзакциями | (например, COMMIT и ROLLBACK в некоторых языках).

ЧЙДНТ ?
23 янв 20, 15:55    [22065335]     Ответить | Цитировать Сообщить модератору
 Re: PG11.5 процедуры и SECURITY INVOKER/DEFINER  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 659
Оговорка в скобках относится к операторам управления транзакциями, которые в некоторых языках могут быть не только COMMIT или ROLLBACK.
Например, даже в языке SQL оператор END TRANSACTION тоже завершает транзакцию. И тоже нельзя использовать в security definer процедурах.

Сообщение было отредактировано: 23 янв 20, 17:04
23 янв 20, 17:02    [22065399]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить