我正在尝试为每个用户设置一个 PostgreSQL 数据库系统,并为关联帐户设置一个 PHP-FPM 资源池。我需要将数据库的所有权限授予其他用户,但似乎只能对表执行此操作。
我试过了
授予数据库用户名的所有权限给 username_shadow
但这只能提供有限的特权。
我已经升级到 PGSQL 9.2,它能够授予架构权限,但我无法获得有用的结果。如何让另一个用户拥有第一个用户对同一数据库的所有权限?
答案1
不要尝试复制此类权限集,否则会成为管理噩梦。使用角色和继承。
相反,创建一个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
任何权限允许其他用户访问它。