Postgres中的基本概念
角色是全局对象,可以访问数据库群集中的所有数据库-如果具有所需的权限.
一个cluster可以容纳databases个人,它可以容纳schemas个人.不同数据库中的模式(即使名称相同)是无关的.授予模式的权限仅适用于当前数据库(授予时的当前数据库)中的此特定模式.
默认情况下,每个数据库都以模式public
开始.这是一种惯例,许多设置都是以此为起点的.除此之外,模式public
只是与任何其他模式一样的模式.
Coming from MySQL, you may want to start with a single schema public
, effectively ignoring the schema layer completely. I am using dozens of schema per database regularly.
Schemas are a bit (but not completely) like directories in the file system.
一旦您使用了多个模式,请务必了解search_path
设置:
默认权限
Per documentation on GRANT
:个
PostgreSQL将某些类型对象的默认权限授予
所有这些默认值都可以更改为ALTER DEFAULT PRIVILEGES
:
集团角色
Like @Craig commented,最好将GRANT
个权限授予一个组角色,然后使该角色的一个特定用户成员成为其成员(GRANT
表示组角色为用户角色).这样,处理和撤销某些任务所需的特权Bundle 就更简单了.
组角色只是另一个没有登录的角色.添加登录以将其转换为用户角色.更多信息:
预定义角色
Update: Postgres 14或更高版本添加了新的predefined roles(正式的"默认角色")pg_read_all_data
和pg_write_all_data
,以简化下面的一些内容.请参见:
配方
比方说,我们有一个新的数据库mydb
、一个组mygrp
和一个用户myusr
.
以超级用户身份连接到相关数据库时(例如postgres
):
REVOKE ALL ON DATABASE mydb FROM public; -- shut out the general public
GRANT CONNECT ON DATABASE mydb TO mygrp; -- since we revoked from public
GRANT USAGE ON SCHEMA public TO mygrp;
要像您写的那样分配"a user all privileges to all tables"(我可能会更严格):
GRANT ALL ON ALL TABLES IN SCHEMA public TO mygrp;
GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO mygrp; -- don't forget those
要为将来的对象设置默认权限,请运行every role以在此方案中创建对象:
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON TABLES TO mygrp;
ALTER DEFAULT PRIVILEGES FOR ROLE myusr IN SCHEMA public
GRANT ALL ON SEQUENCES TO mygrp;
-- more roles?
现在,将组授予用户:
GRANT mygrp TO myusr;
相关答案:
替代(非标准)设置
来自MySQL,由于您希望保持对数据库的权限分离,因此您可能会喜欢这个非标准设置db_user_namespace
.Per documentation:个
此参数启用每个数据库的用户名.默认情况下,该选项处于禁用状态.
仔细阅读手册.我不使用这个设置.它不会使上述内容无效.