该应用程序当前由一个用于更新数据的命令组成。和一个查询它。当然,我还需要以其他方式维护数据库(创建新表,视图,触发器等)。
虽然此应用程序最初是服务器上唯一托管的应用程序,但我宁愿以为将来可能将其托管在带有其他数据库的服务器上,而不愿在将来有必要的情况下稍后进行争夺。
我认为这些这将是一组相当普遍的要求,但是我很难找到一个简单的教程来解释如何在PostgreSQL中使用这种用户/特权分离来设置新数据库。这些参考文件详细介绍了组,用户,角色,数据库,方案和域。但我发现它们令人困惑。
这是我到目前为止已经尝试过的方法(在
psql
中称为“ postgres”):CREATE DATABASE hostdb;
REVOKE ALL ON DATABASE hostdb FROM public;
\connect hostdb
CREATE SCHEMA hostdb;
CREATE USER hostdb_admin WITH PASSWORD 'youwish';
CREATE USER hostdb_mgr WITH PASSWORD 'youwish2';
CREATE USER hostdb_usr WITH PASSWORD 'youwish3';
GRANT ALL PRIVILEGES ON DATABASE hostdb TO hostdb_admin;
GRANT CONNECT ON DATABASE hostdb TO hostdb_mgr, hostdb_usr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO hostdb_mgr;
ALTER DEFAULT PRIVILEGES IN SCHEMA hostdb GRANT SELECT ON TABLES TO hostdb_usr;
但是我没有得到预期的语义。我想对其进行配置,以便仅
hostdb_admin
可以创建(以及删除和更改)表。默认情况下,hostdb_mgr
可以读取,插入,更新和删除所有表;而,当我尝试此操作时,发现我能够以这些用户中的任何一个在
hostdb_usr
中创建表。但是,对于每个用户,我只能读取或修改该用户创建的表-除非使用显式的hostdb
。我猜测
GRANT
和CREATE DATABASE
之间缺少某些内容,可以应用CREATE SCHEMA
到SCHEMA
吗?(随着事情的发展,我也将对
DATABASE
,存储过程,TRIGGERS
以及其他对象施加类似的限制)。在哪里可以找到合适的指南,教程或视频系列?
#1 楼
在哪里可以找到合适的指南,教程或视频系列?
您将在手册中找到所有内容。请点击下面的链接。
当然,这件事并不容易,有时会造成混乱。这是用例的配方:
食谱
我想要对其进行配置,以便只有
hostdb_admin
可以创建(并删除和alter)表;
默认情况下
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
特权,并且:在PostgreSQL 8.4中执行触发器函数需要什么特权?
但是我们已经结束了-扩大此问题的范围...
重要说明
所有权
如果要允许
schma_admin
(单独)删除和更改表,使角色拥有所有对象。文档:删除对象或以任何方式更改其定义的权利不视为可授予的特权;
(但是,通过授予或撤消拥有对象的角色的成员身份,可以获得类似的效果;请参见下文。)
也隐式地具有对象的所有授予选项。
ALTER TABLE some_tbl OWNER TO schma_admin;
或创建所有角色为
schma_admin
的对象,那么您无需设置明确的所有者。它还简化了默认特权,您只需为一个角色设置即可:预先存在的对象
默认特权仅适用于新创建的对象,并且仅适用于与他们一起创建的特定角色。您还需要调整现有对象的权限:
关系
评论
我认为(至少是一部分)问题在于公共伪角色。可以将所有其他角色(用户,组-这些都是相同的)视为成员。尝试从中删除特权,例如,通过public撤销对SCHEMA hostdb的创建。与您一样,撤销数据库级别的权限只会禁用某些数据库级别的权限,而不会影响架构或表。@dezso:关于模式的默认特权,可能存在误解。只有默认模式public恰好带有PUBLIC的特权。除此之外,新架构没有默认权限。因此,这不会影响演示的用例。请参阅答案中的章节。