Я пытаюсь настроить систему с базой данных PostgreSQL для каждого пользователя с пулом ресурсов PHP-FPM для связанной учетной записи. Мне нужно предоставить все привилегии в базе данных другому пользователю, но кажется, что это можно сделать только для таблиц.
я пробовал
grant all privileges on database username to username_shadow
но это дает только ограниченные привилегии.
Я обновился до PGSQL 9.2, в котором есть возможность предоставлять привилегии для схемы, но я не могу получить полезный результат. Как мне просто предоставить другому пользователю все права первого пользователя в той же базе данных?
Не пытайтесь дублировать наборы прав подобным образом, это станет кошмаром для менеджмента. Используйте роли и наследование.
Вместо этого создайте ROLE
(группа) и сделайте обоих пользователей членами роли. Предоставьте роли необходимые права и права собственности на любые требуемые объекты, и пользователи автоматически унаследуют эти права доступа.
Чтобы выполнить переход, либо:
Превратите существующего пользователя в общую роль, переименовав его и отбросив LOGIN
правильно, превратив его из роли входа (пользователя) в роль (группу) без входа в систему, затем создайте нового пользователя с исходным именем; или
Вручную GRANT
новой роли все необходимые права, используя GRANT ... ON DATABASE
, GRANT ... ON SCHEMA
, GRANT ... ON ALL TABLES IN SCHEMA
, и т.д.
Вот демонстрация первого подхода. Скажем, у нас есть оригинальный пользователь с именем test
с владением столом и некоторыми другими грантами:
regress=# CREATE USER test WITH PASSWORD 'original user pw';
CREATE ROLE
regress=# CREATE TABLE testtab(x integer);
CREATE TABLE
regress=# ALTER TABLE testtab OWNER TO test;
ALTER TABLE
Мы можем преобразовать его в общую роль и создать нового пользователя с тем же именем:
regress=# ALTER ROLE test RENAME TO test_group;
NOTICE: MD5 password cleared because of role rename
ALTER ROLE
regress=# ALTER ROLE test_group NOLOGIN;
ALTER ROLE
regress=# CREATE USER test IN GROUP test_group PASSWORD 'original user pw';
CREATE ROLE
Пока вы устанавливаете один и тот же пароль, пользователь не заметит разницы.
Теперь вы можете создать нового пользователя и добавить его к той же роли, предоставив ему тот же доступ, что и исходный test
пользователь имел до того, как вы превратили его в роль test_group
. В этом случае я использую отдельные шаги для создания пользователя, а затем предоставления ему членства в роли; эффект такой же, как и выше, я просто показываю вам два разных способа сделать это:
regress=# CREATE USER newuser PASSWORD 'fred';
CREATE ROLE
regress=# GRANT test_group TO newuser;
GRANT ROLE
Сейчас newuser
жестяная банка SELECT * FROM testtab
даже если testtab
принадлежал пользователю test
и не было GRANT
s, чтобы другие пользователи могли получить к нему доступ.