PostgreSQL - Блокировка базы данных по команде: ПРЕДОСТАВИТЬ ВСЕ ПРИВИЛЕГИИ НА ВСЕХ ТАБЛИЦАХ В СХЕМЕ, зацикливая схемы - PullRequest
0 голосов
/ 12 апреля 2020

В 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, я имею в виду схему, созданную обычным пользователем.

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...