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

Aus*_*tin 4 postgresql permissions

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

我试过了

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

但这仅提供有限的特权。

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

Cra*_*ger 7

不要试图复制这样的权利集,这将成为管理的噩梦。使用角色和继承。

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

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

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

  • 手动GRANT新角色所需的所有权利,使用GRANT ... ON DATABASEGRANT ... 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
Run Code Online (Sandbox Code Playgroud)

我们可以将其转换为共享角色并创建一个同名的新用户:

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
Run Code Online (Sandbox Code Playgroud)

只要您设置相同的密码,用户就不会注意到差异。

您现在可以创建一个新用户并将其添加到相同的角色,为其提供与test将其转换为角色之前原始用户相同的访问权限test_group。在这种情况下,我使用创建用户然后授予他们角色成员资格的单独步骤;效果和上面一样,我只是给大家展示两种不同的方法:

regress=# CREATE USER newuser PASSWORD 'fred';
CREATE ROLE
regress=# GRANT test_group TO newuser;
GRANT ROLE
Run Code Online (Sandbox Code Playgroud)

现在newusercanSELECT * FROM testtab即使testtab由用户拥有test并且没有GRANTs 允许其他用户访问它。