在RDS PostgreSQL 9.6中将创建表权限限制为新创建的用户

在RDS PostgreSQL 9.6中将创建表权限限制为新创建的用户,postgresql,rds,database-permissions,postgres-9.6,Postgresql,Rds,Database Permissions,Postgres 9.6,在RDS PostgreSQL 9.6中创建只读用户时,我遇到了一个问题。我正在执行以下SQL命令: ---- ###### CREATE ROLE ################ CREATE ROLE readonlyrole_dev; -- Grant access to existing tables GRANT USAGE ON SCHEMA public TO readonlyrole_dev; GRANT SELECT ON ALL TABLES IN SCHEMA publi

在RDS PostgreSQL 9.6中创建只读用户时,我遇到了一个问题。我正在执行以下SQL命令:

---- ###### CREATE ROLE ################
CREATE ROLE readonlyrole_dev;

-- Grant access to existing tables
GRANT USAGE ON SCHEMA public TO readonlyrole_dev;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonlyrole_dev;

-- set the privileges that will be applied to objects created in the future.
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonlyrole_dev;



CREATE USER readonly_dev WITH PASSWORD 'welcome1';
GRANT readonlyrole_dev TO readonly_dev;
当我使用
readonly\u dev
用户登录时,默认情况下它有创建新表的权限,但我不想这样做。我想保持
只读\u dev
仅为只读用户

注意:要撤销我正在执行的用户的访问权限

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
这也撤销了所有老用户的创建对象权限。我只想从新创建的用户撤消创建权限


我该怎么做呢?

你不能这么做,也没有必要这么做

只需拒绝用户对所有模式的
CREATE
权限。为此,您应该使用用户组-将所有有权创建表的用户放入在架构上具有所需权限的组中,并从
PUBLIC
中撤销
create


如果您坚持必须这样做,请尝试创建一个事件触发器,每当某个用户试图创建表时,该触发器就会引发异常。

谢谢您的回复。您能否指定如何将所有现有用户从公共组移动到另一个组?如果在数据库中创建新对象,它将如何影响现有用户的权限?您将不得不运行许多
GRANT
语句。数据库中的新对象始终具有默认权限,除非您使用
alterdefaultprivileges
更改该权限。那么事件触发器呢。我可以开发这样一个触发器,它只会在特定用户登录时触发吗?谢谢。事件触发器对我来说工作正常。创建或替换函数public.abort_any_command()将事件_触发器语言plpgsql返回为$FUNCTION$BEGIN,如果(选择当前用户)=“readonly_dev”,则引发异常“command%已禁用”,tg_标记;如果结束;结束$函数$CREATE EVENT TRIGGER abort_ddl ON ddl_command_start EXECUTE PROCEDURE abort_any_command();