Ошибка PostgreSQL 0L000: invalid_grantor — разбор прав доступа
- Ошибка
ERROR: invalid grantor (SQLSTATE 0L000)при попытке делегирования или передачи привилегий на объекты СУБД. - Административный скрипт развертывания прав падает при вызове команд
GRANT ... WITH GRANT OPTION. - Пользователь без достаточных полномочий пытается изменить списки управления доступом (ACL) таблиц или схем.
1. Анализ владельца объекта и прав текущего пользователя
Проверьте владельца таблицы и списки прав (ACL) в схеме:
SELECT c.relname, u.usename as owner, c.relacl
FROM pg_class c
JOIN pg_user u ON u.usesysid = c.relowner
WHERE c.relname = 'my_table';2. Корректная выдача прав с возможностью передачи (WITH GRANT OPTION)
Передавать права другим ролям может только суперпользователь, владелец объекта или роль, которой права были выданы с опцией WITH GRANT OPTION:
-- Выполняется суперпользователем (postgres):
GRANT ALL PRIVILEGES ON TABLE my_table TO lead_developer WITH GRANT OPTION;
-- Теперь lead_developer может выдавать права другим:
SET ROLE lead_developer;
GRANT SELECT, INSERT ON TABLE my_table TO junior_developer;3. Назначение роли-владельца для баз 1С:Предприятие
Для корректной работы технологической платформы пользователь БД 1С должен быть владельцем схемы и всех таблиц:
ALTER TABLE my_table OWNER TO usr1cv8;
ALTER SCHEMA public OWNER TO usr1cv8;4. Сброс и повторное назначение ролей
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM faulty_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO faulty_user; Частые вопросы (FAQ)
Почему суперпользователь postgres не может получить ошибку 0L000?
Суперпользователь обходит все проверки прав ядра. Ошибка 0L000 возникает исключительно у непривилегированных пользователей или ролей без флага SUPERUSER/WITH GRANT OPTION.
Как проверить, какие роли имеют право передавать привилегии?
Выполните запрос к pg_class или информационной схеме: SELECT table_name, privilege_type, is_grantable FROM information_schema.table_privileges WHERE grantee = 'my_role';
Какие минимальные права требуются для пользователя базы 1С в PostgreSQL?
Пользователь 1С должен обладать правами CREATEDB (или являться владельцем базы данных), иметь полный доступ к схеме public и право создавать расширения (если требуется pg_trgm).
Что означает предложение GRANTED BY в SQL:2008?
В PostgreSQL конструкция GRANTED BY позволяет явно указать, от чьего имени выдается привилегия, но текущая роль обязана входить в состав указанной роли.