在哪里可以找到合适的指南,教程或视频系列?
您将在手册中找到所有内容。下面的链接。
当然,这不是一件小事,有时会造成混乱。这是用例的配方:
食谱
我想对其进行配置,以便只有hostdb_admin
可以创建(和删除和更改)表。默认情况下,
它hostdb_mgr
可以读取,插入,更新和删除所有表;
并且hostdb_usr
只能读取所有表(和视图)。
作为超级用户postgres
:
CREATE USER schma_admin WITH PASSWORD 'youwish';
-- CREATE USER schma_admin WITH PASSWORD 'youwish' CREATEDB CREATEROLE; -- see below
CREATE USER schma_mgr WITH PASSWORD 'youwish2';
CREATE USER schma_usr WITH PASSWORD 'youwish3';
如果您想要一个功能更强大的管理员,该管理员还可以管理数据库和角色,请添加角色属性CREATEDB
和CREATEROLE
上面的内容。
将每个角色授予下一个更高的级别,因此所有级别至少“继承”来自下一个更低级别的特权集(级联):
GRANT schma_usr TO schma_mgr;
GRANT schma_mgr TO schma_admin;
CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public; -- see notes below!
GRANT CONNECT ON DATABASE hostdb TO schma_usr; -- others inherit
\connect hostdb -- psql syntax
我正在命名架构schma
(不会hostdb
引起混淆)。选择任何名称。(可选)成为schma_admin
架构的所有者:
CREATE SCHEMA schma AUTHORIZATION schma_admin;
SET search_path = schma; -- see notes
ALTER ROLE schma_admin IN DATABASE hostdb SET search_path = schma; -- not inherited
ALTER ROLE schma_mgr IN DATABASE hostdb SET search_path = schma;
ALTER ROLE schma_usr IN DATABASE hostdb SET search_path = schma;
GRANT USAGE ON SCHEMA schma TO schma_usr;
GRANT CREATE ON SCHEMA schma TO schma_admin;
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT SELECT ON TABLES TO schma_usr; -- only read
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT INSERT, UPDATE, DELETE, TRUNCATE ON TABLES TO schma_mgr; -- + write, TRUNCATE optional
ALTER DEFAULT PRIVILEGES FOR ROLE schma_admin
GRANT USAGE, SELECT, UPDATE ON SEQUENCES TO schma_mgr; -- SELECT, UPDATE are optional
有关详细信息,and drop and alter
请参见以下注释。
随着事情的发展,我还将对在TRIGGERS
,存储过程VIEWS
以及其他对象上施加类似的限制提出疑问。
...(但请注意,该ALL TABLES
视图包括视图和外部表)。
对于可更新的视图:
请注意,在视图上执行插入,更新或删除的用户必须在视图上具有相应的插入,更新或删除特权。另外,视图的所有者必须对基础基本关系具有相关的特权,但是执行更新的用户不需要对基础基本关系的任何许可(请参阅
第38.5节)。
触发器也很特殊。您需要TRIGGER
表上的特权,并且:
但是我们已经过度扩大了这个问题的范围...
重要笔记
所有权
如果要允许schma_admin
(单独)删除和更改表,请让角色拥有所有对象。文档:
删除对象或以任何方式更改其定义的权利不视为可授予的特权;它是所有者固有的,不能被授予或撤销。(但是,通过授予或撤消拥有对象的角色的成员资格,可以获得类似的效果;请参见下文。)所有者也隐式拥有该对象的所有授予选项。
ALTER TABLE some_tbl OWNER TO schma_admin;
或以角色schma_admin
开始创建所有对象,然后无需显式设置所有者。它还简化了默认权限,您只需为一个角色设置即可:
预先存在的对象
默认特权仅适用于新创建的对象,并且仅适用于使用它们创建的特定角色。您还需要调整现有对象的权限:
如果创建的对象没有DEFAULT PRIVILEGES
设置角色(例如superuser),则同样适用postgres
。重新分配所有权schma_admin
,并手动设置权限-或者设置DEFAULT PRIVILEGES
为postgres
和:(同时连接到正确的DB!)
ALTER DEFAULT PRIVILEGES FOR ROLE postgres GRANT ... -- etc.
默认权限
您缺少该ALTER DEFAULT PRIVILEGES
命令的重要方面。除非另有说明,否则它适用于当前角色:
默认特权仅适用于当前数据库。因此,您不会与数据库集群中的其他数据库混淆。文档:
对于当前数据库中创建的所有对象
您可能还想为FUNCTIONS
和设置默认特权TYPES
(不只是TABLES
和SEQUENCES
),但是可能不需要这些特权。
的默认权限 PUBLIC
授予的默认特权PUBLIC
是基本的,并且被某些人高估了。文档:
PostgreSQL授予某些对象类型的默认特权
PUBLIC
。默认情况下,对表,列,模式或表空间不授予任何特权PUBLIC
。对于其他类型,默认权限授予PUBLIC
如下:CONNECT
和CREATE TEMP TABLE
为数据库; EXECUTE
功能特权;和USAGE
语言特权。
大胆强调我的。通常,上面的一个命令足以覆盖所有内容:
REVOKE ALL ON DATABASE hostdb FROM public;
特别是,不会PUBLIC
为新架构授予默认权限。名为“ public”的默认模式以的ALL
特权开头可能会造成混淆PUBLIC
。这只是一个便利功能,可以简化新创建数据库的入门。它不会以任何方式影响其他架构。您可以在模板数据库中撤消这些特权template1
,然后在没有它们的情况下启动该集群中所有新创建的数据库:
\connect template1
REVOKE ALL ON SCHEMA public FROM public;
特权 TEMP
由于我们对撤销所有权限hostdb
从PUBLIC
,普通用户无法创建临时表,除非我们明确地允许它。您可能想要也可能不想添加:
GRANT TEMP ON DATABASE hostdb TO schma_mgr;
search_path
不要忘记设置search_path
。如果集群中只有一个数据库,则可以在中设置全局默认值postgresql.conf
。否则(更有可能)将其设置为数据库的属性,或者仅将其设置为所涉及的角色,甚至是两者的组合。细节:
schma, public
如果您也使用公共模式,或者甚至(不太可能),则可能需要将其设置为$user, schma, public
...
另一种选择是使用默认模式“ public”,该模式应与默认设置一起使用,search_path
除非您更改了默认设置。PUBLIC
在这种情况下,请记住撤销特权。
有关
public
假角色。可以将所有其他角色(用户,组-这些都是相同的)视为成员。尝试通过例如删除特权REVOKE CREATE ON SCHEMA hostdb FROM public
。与您一样,撤销数据库级别的权限仅会禁用某些数据库级别的权限,而不会影响架构或表。