21

目前我正在使用它来授予权限:

grant select on all tables in schema public to <user_name>;

alter default privileges in schema public grant select on tables to <user_name>;

根据文档,第二条语句应该已经解决了问题。但是,当将新表添加到公共模式时,它不会自动授予 user_name 权限。

我正在使用此用户 (user_name) 将数据复制到另一个数据库。

4

3 回答 3

19

找到了答案。它位于ALTER DEFAULT PRIVILEGES 文档的这一行中。

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

我使用的是来自不同用户的 alter default 权限,而不是创建表的用户。

确保在语句之前将角色设置为创建表的用户alter default privilege

SET ROLE <user_that_creates_new_tables>;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO <user_name>;
于 2013-10-11T03:07:03.910 回答
13

我一直在寻找同样的东西,我找到了解决这个问题的其他方法。基于 postgresql 文档我们可以创建事件触发器,所以当创建新表时,授权查询将自动执行。因此,无论谁创建了新表,其他用户都允许使用它。

CREATE OR REPLACE FUNCTION auto_grant_func()
RETURNS event_trigger AS $$
BEGIN
    grant all on all tables in schema public to <username>;
    grant all on all sequences in schema public to <username>;
    grant select on all tables in schema public to <username>;
    grant select on all sequences in schema public to <username>;
END;
$$ LANGUAGE plpgsql;

CREATE EVENT TRIGGER auto_grant_trigger
    ON ddl_command_end
    WHEN TAG IN ('CREATE TABLE', 'CREATE TABLE AS')
EXECUTE PROCEDURE auto_grant_func();
于 2018-03-15T08:51:20.220 回答
10

要授予默认权限,您需要授予正在创建表的用户。

您将表格创建为SA_user,但将表格读取为READ_user。您的代码需要如下所示:

ALTER DEFAULT PRIVILEGES 
FOR USER SA_user
IN SCHEMA schema_name
GRANT SELECT ON TABLES TO READ_user;

因此,每当SA_user创建表时,它都会授予READ_user.

于 2019-10-16T14:01:18.360 回答