Reg:PostgreSQL 模式的默认权限

Ane*_*n N 5 postgresql permissions default-value

我有一种情况,许多用户可以跨所有可用模式创建数据库对象。

所有开发人员都使用一个通用用户 pg_dump_user 在需要时将整个数据库转储到他们的本地数据库。所以这个用户应该拥有对所有数据库对象的读取权限。

为了实现这一点,我尝试在架构级别和用户级别设置默认权限。

--为每个模式设置的默认权限

ALTER DEFAULT PRIVILEGES IN SCHEMA xyz GRANT SELECT ON TABLES to ro_user';
Run Code Online (Sandbox Code Playgroud)

--为每个用户设置的默认权限

ALTER DEFAULT PRIVILEGES FOR ROLE abc_user GRANT SELECT ON TABLES to ro_user' ;
Run Code Online (Sandbox Code Playgroud)

即使上面的设置存在,在某些时间之后这些都会消失,因为 ro_user 无法访问创建的新对象。

任何关于此的指针都会有所帮助,我的目标只是为用户实现对当前和未来所有对象的选择访问,以便执行 pg_dump。

dez*_*zso 6

文件关于ALTER DEFAULT PRIVILEGES告诉你一个可能的原因-它不是那么清楚的描述,虽然。

来看看怎么说的:

您只能更改将由您自己或您所属的角色创建的对象的默认权限。

这意味着此语句定义的默认权限仅适用于由您(或您所属的角色)创建的对象。让我们看看它的实际效果!

alice的架构

首先,我们以alice. 然后,在新创建的模式中,我们创建一个表并授予以下权限bob

SELECT current_user;
 current_user 
??????????????
 alice


SHOW search_path ;
 search_path  
??????????????
 test, public

CREATE SCHEMA alicetest;

ALTER DEFAULT PRIVILEGES 
    FOR ROLE alice 
    IN SCHEMA alicetest 
    GRANT ALL ON TABLES TO alice;

GRANT SELECT ON alicetest.a TO bob; 
-- this I do only for showing the privileges - 
-- the owner has by default ALL and is not shown by \dp

\dp alicetest.a
                             Access privileges
  Schema   ? Name ? Type  ?  Access privileges  ? Column access privileges 
???????????????????????????????????????????????????????????????????????????
 alicetest ? a    ? table ? alice=arwdDxt/alice?? 
           ?      ?       ? bob=r/alice         ? 
Run Code Online (Sandbox Code Playgroud)

alice 正如预期的那样,现在她拥有所有权利。

bob' 相同模式中的表

现在,在获得对该架构的访问权限后,bob尝试创建一个表:

SELECT current_user;
 current_user 
??????????????
 bob

CREATE TABLE alicetest.b (id integer);

GRANT SELECT ON alicetest.b TO alice;

\dp alicetest.b
                            Access privileges
  Schema   ? Name ? Type  ? Access privileges ? Column access privileges 
?????????????????????????????????????????????????????????????????????????
 alicetest ? b    ? table ? bob=arwdDxt/bob  ?? 
           ?      ?       ? alice=r/bob       ? 
Run Code Online (Sandbox Code Playgroud)

如您所见,尽管在alice的架构中创建了表,她设置了默认权限,但bob的表并不具有所有这些权限。发生这种情况是因为alice它不是 的成员bob

让我们也检查一下这个成员资格,并尝试alice再次定义默认权限,这次是为另一个角色:

ALTER DEFAULT PRIVILEGES 
    FOR ROLE charlie 
    IN SCHEMA alicetest 
    GRANT ALL ON TABLES TO alice;
ERROR:  must be member of role "charlie"
Run Code Online (Sandbox Code Playgroud)

因此,某个足够强大的用户授予她 中的成员资格charlie,然后她再次尝试,并成功:

ALTER DEFAULT PRIVILEGES 
    FOR ROLE charlie 
    IN SCHEMA alicetest 
    GRANT ALL ON TABLES TO alice;
ALTER DEFAULT PRIVILEGES
Run Code Online (Sandbox Code Playgroud)

charlie的圆

然后charlie创建一个新表:

CREATE TABLE alicetest.c (id integer);
Run Code Online (Sandbox Code Playgroud)

以及特权:

\dp alicetest.c
                               Access privileges
  Schema   ? Name ? Type  ?    Access privileges    ? Column access privileges 
???????????????????????????????????????????????????????????????????????????????
 alicetest ? c    ? table ? charlie=arwdDxt/charlie?? 
           ?      ?       ? alice=arwdDxt/charlie   ? 
Run Code Online (Sandbox Code Playgroud)

如您所见,alice作为 的成员charlie, 可以访问该表。

要回答你的问题,

我猜您为自己定义了默认权限(alice在示例中),但是您的开发人员bob在这里充当了一堆s,没有获得必要的权限。解决这个问题的一种方法(正如我们在工作中所做的那样)是做一个

SET ROLE TO schema_owner;
Run Code Online (Sandbox Code Playgroud)

每次在架构中创建新对象之前。这应该是所有开发人员都属于的角色(否则您会收到错误消息)。

注意\dp是一个psql命令。