授予另一个用户对 postgresql 数据库的权限

授予另一个用户对 postgresql 数据库的权限

我正在尝试为每个用户设置一个 PostgreSQL 数据库系统,并为关联帐户设置一个 PHP-FPM 资源池。我需要将数据库的所有权限授予其他用户,但似乎只能对表执行此操作。

我试过了

授予数据库用户名的所有权限给 username_shadow

但这只能提供有限的特权。

我已经升级到 PGSQL 9.2,它能够授予架构权限,但我无法获得有用的结果。如何让另一个用户拥有第一个用户对同一数据库的所有权限?

答案1

不要尝试复制此类权限集,否则会成为管理噩梦。使用角色和继承。

相反,创建一个ROLE(组)并让两个用户都成为该角色的成员。授予该角色所需的权限和任何所需对象的所有权,用户将自动继承这些访问权限。

要进行转换,请执行以下操作之一:

  • 将现有用户重命名并删除其LOGIN权限,将其从登录角色(用户)转变为非登录角色(组),然后使用原始名称创建新用户;或

  • 手动授予GRANT新角色所有必需的权限,使用、、GRANT ... ON DATABASE等。GRANT ... ON SCHEMAGRANT ... 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 testtabtesttab归用户所有test并且没有GRANT任何权限允许其他用户访问它。

相关内容