В PostgreSQL 9.5:
Я создал функцию, которая выполняет следующие действия:
CREATE USER user_x WITH PASSWORD 'abc' CREATEDB CREATEROLE;
GRANT master_user TO user_x;
GRANT CONNECT ON DATABASE my_db TO user_x
LOOP THROUGH ALL USER SCHEMAS:
GRANT USAGE ON SCHEMA schemaN TO user_x
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schemaN TO user_x
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA schemaN TO user_x
LOOP THROUGH ALL FUNCTIONS:
GRANT EXECUTE ON FUNCTION funcN() TO user_x
Первая итерация l oop выполняется, как ожидается, ошибок нет и он всегда запускается сначала в схеме PUBLI C.
НО, во второй итерации l oop он выбирает вторую схему и запускает первую команду:
GRANT USAGE ON SCHEMA schemaN TO user_x
А потом ВСЕГДА блокируется на второй команде:
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schemaN TO user_x
Я знаю это, потому что я запускаю эту команду:
SELECT * FROM pg_stat_activity WHERE state IN ('idle in transaction', 'active');
и результаты всегда показывают, что команда предоставления заблокирована .
wait_event_type: Lock
wait_event: transactionid
query: GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA schemaN TO user_x
Я убиваю все PID, удаляю пользователя и пытаюсь снова и снова, он блокируется в том же месте таким же образом.
Больше никого нет доступ к таблицам, которые могут их заблокировать.
Я что-то здесь упускаю? Опять же, циклы по схеме PUBLI C просто отлично, но вторая пользовательская схема умирает. И я не говорю об информационных схемах или системных схемах pg, я имею в виду схему, созданную обычным пользователем.
Спасибо!