日常工作中,我们通常开给研发2个账号(一个只读账号,读写账号)
读写账号自不必说, ,每次用这个账号建表后,自然就用了CRUD的权限。
但是,只读账号稍微费事点,如果我们处理不好的话,每次新加表都要再执行一次对只读账号的重新授权操作。好在PG为我们考虑好了这个场景,也是有方法解决的。
看下面例子:
使用postgres超级账号登录PG,创建2个业务账号
create user rw login password '123456'; -- 创建读写账号
create user rd login password '123456'; -- 创建只读账号
create database ticket; -- 创建测试用数据库
alter database ticket owner to rw ; -- 将ticket库owner改为 rw账号
c ticket -- 切换到ticket库下
grant select on all tables in schema public to rd ; # 对rd账号授权,当前已有的表的只读权限 (注意:这个命令对于当前已有的表生效。对于后期新创建的表,是没有加其它的授权)
alter role rd set default_transaction_read_only=true; -- 给rd用户设置只读模式
然后,我们使用rw账号登录PG:
c ticket
create table t (a int , b int ) ; -- 尝试创建一张新表
ticket=> select * from t; 这里看到是可以执行查询的
a | b
--- ---
(0 rows)
然后,再开一个窗口,使用rd账号登录PG:
c ticket
ticket=> select * from t; 这里看到提示居然没有查询的权限了
这时候,如果我们rd账号需要访问t表,则需要使用rw账号再次执行下 grant SELECT on TABLE t to rd ; 命令,才能将rd账号授予t表的select授权
更好用的解决方法(即,避免每次新加表后都要执行一次grant授权操作):
使用rw账号登录PG
c ticket
ALTER DEFAULT PRIVILEGES IN SCHEMA public grant select on tables to rd; -- 对于后期使用rw账号创建的表, rd账号都可以读取的(注意: 如果使用postgres超级账号创建的表的话,rd账号还是不能读取的)
执行完上面的ALTER DEFAULT PRIVILEGES 命令操作后,使用rw账号再去创建一个新的表,可以看到:
代码语言:javascript复制ticket=> create table tb55(a int, b int);
ticket=> dp tb55
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
-------- ------ ------- ------------------- ------------------- ----------
public | tb55 | table | rw=arwdDxt/rw | |
| | | rd=r/rw | |
参考:
http://postgres.cn/docs/10/sql-alterdefaultprivileges.html
https://www.postgresql.org/docs/11/runtime-config-client.html