PostgreSQL其实没有只读用户的语法,那么PostgreSQL提供了用户/角色属性来达到只读用户的效果,步骤如下:
1. 创建一个用户名为<readonlyuser>,密码为<your_own_password>的用户
CREATE USER <readonlyuser> WITH ENCRYPTED PASSWORD '<your_own_password>';
2. 修改用户只读事务属性
ALTER USER <readonlyuser> SET default_transaction_read_only=on;
3. 设置USAGE权限给到
<readonlyuser>
GRANT USAGE ON SCHEMA public to <readonlyuser>
;
4. 在对应的数据库中,授予权限,如select。
GRANT SELECT ON ALL TABLES IN SCHEMA public TO <readonlyuser>;
注意:这个语句有可能在使用云数据库RDS PostgreSQL版和HybirdDB for PostgreSQL会遇到ha_health_check(系统表,超级用户权限)授权失败,也可以用下面存储过程进行grant:
CREATE OR REPLACE FUNCTION grant_tables()
RETURNS int AS
$$
DECLARE
r RECORD;
count int;
BEGIN
count := 0;
FOR r IN SELECT tablename FROM pg_tables where tablename not like 'ha_health_check' LOOP
RAISE NOTICE 'tablename: %', r.tablename;
EXECUTE 'grant SELECT on ' || r.tablename || ' to <readonlyuser> ';
count := count + 1;
END LOOP;
RETURN count;
END;
$$
LANGUAGE 'plpgsql' VOLATILE;
select * from grant_tables()
更多参考 PostgreSQL 批量权限 管理方法。