我是Postgres的新手并试图迁移我们的
MySQL数据库.在
MySQL中,我可以为低权限用户授予SELECT,UPDATE,INSERT和DELETE权限,并允许这些授权应用于指定数据库中的所有表.我必须在Postgres中遗漏一些东西,因为看起来我必须一次为每个表授予这些权限.每个数据库有许多数据库和数百个表,这似乎是一项艰巨的任务,只是为了起步.此外,一旦数据库处于运行状态,添加表就会频繁发生,除非绝对必要,否则我不希望每次都授予权限.
这怎么做得最好?
首先,您必须能够连接到数据库才能运行查询.这可以通过以下方式实现
REVOKE CONNECT ON DATABASE your_database FROM PUBLIC; GRANT CONNECT ON DATABASE database_name TO user_name;
REVOKE是必要的because
The key word PUBLIC indicates that the privileges are to be granted to
all roles,including those that might be created later. PUBLIC can be
thought of as an implicitly defined group that always includes all
roles. Any particular role will have the sum of privileges granted
directly to it,privileges granted to any role it is presently a
member of,and privileges granted to PUBLIC.
如果您真的想将用户限制为DML语句,那么您还需要做更多的事情:
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM PUBLIC; GRANT SELECT,INSERT,DELETE ON ALL TABLES IN SCHEMA public TO user_name;
这些假设您将只有一个模式(默认情况下名为“public”).
正如杰克道格拉斯指出的那样,上面只给出了现有表的特权.要在将来的表中实现相同的目标,您必须使用define default privileges:
ALTER DEFAULT PRIVILEGES FOR ROLE some_role -- Alternatively "FOR USER" IN SCHEMA public GRANT SELECT,DELETE ON TABLES TO user_name;
这里,some_role是创建表的角色,而user_name是获取权限的角色.定义此项,您必须以some_role或其成员身份登录.
最后,你必须对序列做同样的事情(感谢PlaidFan指出它) – 这里是你需要的USAGE特权.