На початку маємо інстанс Постгреса mydb. Для нового проєкту створюємо нову базу даних в цьому інстансі, і двох користувачів: example_migrator може робити все в цій БД, а example_user може читати та писати в таблиці БД.
Тільки example_migrator має створювати нові схеми, таблиці, функції в цій БД! Користувач example_user може лише додавати, модифікувати та видаляти записи в таблицях.
CREATE ROLE example_migrator WITH PASSWORD 'putsecrethere' NOSUPERUSER NOCREATEDB LOGIN; CREATE ROLE example_user WITH PASSWORD 'putsecrethere' NOSUPERUSER NOCREATEDB LOGIN;
наступні операції виконати під адміном, наприклад, rds_superuser:
GRANT example_migrator TO CURRENT_USER WITH ADMIN option; CREATE DATABASE exampledb WITH OWNER example_migrator; GRANT CONNECT ON DATABASE exampledb TO example_user; ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT USAGE ON SCHEMAS TO example_user; ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO example_user; REVOKE example_migrator from CURRENT_USER;
Це створить нову БД exampledb. Користувач example_migrator стане її оунером і тому матиме всі права. Користувачу example_user надається право на підключення до нової БД, а також право модифікувати записи в усіх майбутніх таблицях і підключатися до всіх майбутніх схем цієї БД
Після цього через деякий час (вже створені якісь таблиці) може знадобитися додати нового користувача, тільки для читання (хай це буде користувач dbuser2):
GRANT example_migrator TO CURRENT_USER WITH ADMIN option; GRANT CONNECT ON DATABASE exampledb TO dbuser2; ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT USAGE ON SCHEMAS TO dbuser2; ALTER DEFAULT PRIVILEGES FOR ROLE example_migrator GRANT SELECT ON TABLES TO dbuser2; REVOKE example_migrator from CURRENT_USER;
Далі треба перепідключитися до БД exampledb і додати права на існуючи таблиці та схеми:
GRANT USAGE ON SCHEMA exampleschema TO dbuser2; GRANT SELECT ON ALL TABLES IN SCHEMA exampleschema TO dbuser2;