PostgreSQL: невозможно вставить в таблицу из-за разрешений

Я использую PostgreSQL 9.5.

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

Я использовал следующий PSQL-код для создания роли:


DROP ROLE IF EXISTS myrole ;
CREATE ROLE myrole WITH 
    LOGIN
    PASSWORD 'myrole' 
    NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION
    ;
GRANT a_user_group TO myrole;

ALTER ROLE myrole VALID UNTIL 'infinity' ;

 \connect mydatabase ;

GRANT ALL PRIVILEGES ON SCHEMA myschema TO myrole;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschema TO myrole;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschema TO myrole;

ALTER DEFAULT PRIVILEGES IN SCHEMA myschema  GRANT ALL PRIVILEGES ON SEQUENCES TO myrole ;
ALTER DEFAULT PRIVILEGES IN SCHEMA myschema  GRANT ALL PRIVILEGES ON TABLES TO myrole ;

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO myrole ;

Я думал, что этого должно быть достаточно, но я не могу сделать INSERT с этим пользователем. Я могу сделать только SELECT, и я уверен, что это потому, что группа a_user_group имеет эту привилегию.

Я не могу найти, как заставить это работать. Любая идея?

1 ответ

Задача решена!

После сбоя pgAdmin каждый раз, когда я пытался получить доступ к инкриминированной последовательности с упомянутой ролью, и, читая ошибку pgAdmin, я начал подозревать, что состояние роли было проблемным.

Поэтому я удалил роль, используя

    REVOKE ALL PRIVILEGES ON SCHEMA traitements FROM zones_delaissees_traitements ;
REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA traitements FROM zones_delaissees_traitements ;
REVOKE ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA traitements FROM zones_delaissees_traitements ;
ALTER DEFAULT PRIVILEGES IN SCHEMA traitements  REVOKE ALL PRIVILEGES ON SEQUENCES FROM zones_delaissees_traitements ;
ALTER DEFAULT PRIVILEGES IN SCHEMA traitements  REVOKE ALL PRIVILEGES ON TABLES FROM zones_delaissees_traitements ;
DROP ROLE IF EXISTS zones_delaissees_traitements ;

И создал его снова, и теперь это работает!

Другие вопросы по тегам