暂无图片
暂无图片
6
暂无图片
暂无图片
1
暂无图片

理解MogDB中user/role/schema之间关系

原创 董宏伟 云和恩墨 2023-06-15
520

官网文档相关概念

管理用户及权限 | MogDB Docs

测试样例

创建user,自动创建同名role和schema

MogDB=# CREATE USER enmo1 IDENTIFIED BY 'enmo@2023';
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=# CREATE USER enmo2 IDENTIFIED BY 'enmo@2023';
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=# CREATE USER enmo3 IDENTIFIED BY 'enmo@2023';
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=# 
复制

检查创建结果,自动创建出同名的role。系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA。
角色是拥有数据库对象和权限的实体。在不同的环境中角色可以认为是一个用户,一个组或者兼顾两者。

-- list roles
MogDB=# \du
                                                              List of roles
 Role name |                                                    Attributes                                                    | Member of 
-----------+------------------------------------------------------------------------------------------------------------------+-----------
 enmo      | Sysadmin                                                                                                         | {}
 enmo1     |                                                                                                                  | {}
 enmo2     |                                                                                                                  | {}
 enmo3     |                                                                                                                  | {}
 jack      |                                                                                                                  | {}
 omm       | Sysadmin, Create role, Create DB, Replication, Administer audit, Monitoradmin, Operatoradmin, Policyadmin, UseFT | {}
 tpcc_usr  | Sysadmin                                                                                                         | {}

MogDB=# 
-- list schemas
MogDB=# \dn
     List of schemas
      Name       | Owner 
-----------------+-------
 blockchain      | omm
 cstore          | omm
 db4ai           | omm
 dbe_perf        | omm
 dbe_pldebugger  | omm
 dbe_pldeveloper | omm
 enmo            | enmo
 enmo1           | enmo1
 enmo2           | enmo2
 enmo3           | enmo3
 jack            | jack
 pkg_service     | omm
 public          | omm
 snapshot        | omm
 sqladvisor      | omm
(15 rows)

MogDB=# 
MogDB=# select usename from pg_user;  
   usename   
-------------
 omm
 jack
 tpcc_usr
 enmo
 enmo2
 enmo3
 enmo1
 enmo_norole
(8 rows)

MogDB=# select rolname from pg_roles;
         rolname          
--------------------------
 gs_role_copy_files
 gs_role_signal_backend
 gs_role_tablespace
 gs_role_replication
 gs_role_account_lock
 gs_role_pldebugger
 gs_role_directory_create
 gs_role_directory_drop
 omm
 jack
 tpcc_usr
 enmo
 enmo2
 enmo3
 enmo1
 enmo_norole
(16 rows)

MogDB=#
复制

先创建role后,创建同名user报错

\du 命令显示出的如果仅是role,则会包含Cannot login属性,角色无登录权限

MogDB=# CREATE role test with CREATEROLE  IDENTIFIED BY 'enmo@2023';
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
CREATE ROLE
MogDB=# 
MogDB=# select rolname from pg_roles;
         rolname          
--------------------------
 gs_role_copy_files
 gs_role_signal_backend
 gs_role_tablespace
 gs_role_replication
 gs_role_account_lock
 gs_role_pldebugger
 gs_role_directory_create
 gs_role_directory_drop
 omm
 jack
 tpcc_usr
 enmo
 enmo2
 enmo3
 enmo1
 test
(16 rows)

MogDB=# select usename from pg_user;
 usename  
----------
 omm
 jack
 tpcc_usr
 enmo
 enmo2
 enmo3
 enmo1
(7 rows)

MogDB=# CREATE user test with CREATEROLE  IDENTIFIED BY 'enmo@2023';
ERROR:  role "test" already exists
MogDB=#

MogDB=# \du
                                                              List of roles
 Role name |                                                    Attributes                                                    | Member of 
-----------+------------------------------------------------------------------------------------------------------------------+-----------
 enmo      | Sysadmin                                                                                                         | {}
 enmo1     |                                                                                                                  | {}
 enmo2     |                                                                                                                  | {}
 enmo3     |                                                                                                                  | {}
 jack      |                                                                                                                  | {}
 omm       | Sysadmin, Create role, Create DB, Replication, Administer audit, Monitoradmin, Operatoradmin, Policyadmin, UseFT | {}
 test      | Create role, Cannot login                                                                                        | {}
 test1     | Create role, Cannot login                                                                                        | {}
 tpcc_usr  | Sysadmin                                                                                                         | {}

MogDB=#
复制

创建user后,系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA

MogDB=# \dn
     List of schemas
      Name       | Owner 
-----------------+-------
 blockchain      | omm
 cstore          | omm
 db4ai           | omm
 dbe_perf        | omm
 dbe_pldebugger  | omm
 dbe_pldeveloper | omm
 enmo            | enmo
 enmo1           | enmo1
 enmo2           | enmo2
 enmo3           | enmo3
 jack            | jack
 pkg_service     | omm
 public          | omm
 snapshot        | omm
 sqladvisor      | omm
(15 rows)

MogDB=#
--切换数据库后看买不到schema
MogDB=# \c testdb
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "testdb" as user "omm".
testdb=# \dn
     List of schemas
      Name       | Owner 
-----------------+-------
 blockchain      | omm
 cstore          | omm
 db4ai           | omm
 dbe_perf        | omm
 dbe_pldebugger  | omm
 dbe_pldeveloper | omm
 pkg_service     | omm
 public          | omm
 snapshot        | omm
 sqladvisor      | omm
(10 rows)

testdb=#
复制

schema单独创建方式

  • AUTHORIZATION user_name
    指定模式的所有者。当不指定schema_name时,把user_name当作模式名,此时user_name只能是角色名。
    取值范围: 已存在的用户名/角色名。

如果不指定AUTHORIZATION,则授权用户为当前已连接用户。并且schema名字和用户名可以不同。

testdb=# CREATE SCHEMA s1;
CREATE SCHEMA
testdb=# 
testdb=# CREATE SCHEMA AUTHORIZATION jack;
CREATE SCHEMA
testdb=# 
testdb=# CREATE SCHEMA AUTHORIZATION test;
CREATE SCHEMA
testdb=# \dn
     List of schemas
      Name       | Owner 
-----------------+-------
 blockchain      | omm
 cstore          | omm
 db4ai           | omm
 dbe_perf        | omm
 dbe_pldebugger  | omm
 dbe_pldeveloper | omm
 jack            | jack
 pkg_service     | omm
 public          | omm
 s1              | omm
 snapshot        | omm
 sqladvisor      | omm
 test            | test
(13 rows)

testdb=# 

--验证,如果不指定AUTHORIZATION,则授权用户为当前已连接用户。并且schema名字和用户名可以不同。
MogDB=# ALTER USER enmo1 SYSADMIN;
ALTER ROLE
MogDB=#
MogDB=# \c testdb enmo1
Password for user enmo1: 
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "testdb" as user "enmo1".
testdb=>
testdb=> CREATE SCHEMA s2;
CREATE SCHEMA
testdb=> create schema enmo1;
CREATE SCHEMA
testdb=> \dn
     List of schemas
      Name       | Owner 
-----------------+-------
 blockchain      | omm
 cstore          | omm
 db4ai           | omm
 dbe_perf        | omm
 dbe_pldebugger  | omm
 dbe_pldeveloper | omm
 enmo1           | enmo1
 jack            | jack
 pkg_service     | omm
 public          | omm
 s1              | omm
 s2              | enmo1
 snapshot        | omm
 sqladvisor      | omm
 test            | test
(15 rows)

testdb=> 
复制

先创建schema后,创建同名user报错

testdb=> create user s1 IDENTIFIED BY 'enmo@2023';
NOTICE:  The encrypted password contains MD5 ciphertext, which is not secure.
ERROR:  schema "s1" already exists
testdb=> 
复制

创建表默认schema测试

  • 搜索路径

搜索路径定义在search_path参数中,参数取值形式为采用逗号分隔的Schema名称列表。如果创建对象时未指定目标Schema,则将该对象会被添加到搜索路径中列出的第一个Schema中。当不同Schema中存在同名的对象时,查询对象未指定Schema的情况下,将从搜索路径中包含该对象的第一个Schema中返回对象。

要查看当前搜索路径,请使用SHOW。

MogDB=# SHOW SEARCH_PATH;
 search_path
----------------
 "$user",public
(1 row)
复制

search_path参数的默认值为: "user",public。user表示与当前会话用户名同名的Schema名,如果这样的模式不存在,$user将被忽略。所以默认情况下,用户连接数据库后,如果数据库下存在同名Schema,则对象会添加到同名Schema下,否则对象被添加到Public Schema下。

testdb=> create table t1(col1 char(10));
CREATE TABLE
testdb=> insert into t1 values('Hello!');
INSERT 0 1
testdb=> 
testdb=> create table s1.t1(col1 char(10));
CREATE TABLE
testdb=> insert into s1.t1 values('Hello!');
INSERT 0 1
testdb=> \dt+
                                      List of relations
 Schema | Name | Type  | Owner |    Size    |             Storage              | Description 
--------+------+-------+-------+------------+----------------------------------+-------------
 enmo1  | t1   | table | enmo1 | 8192 bytes | {orientation=row,compression=no} | 
(1 row)
testdb=>  select * from pg_tables where tablename='t1';
 schemaname | tablename | tableowner | tablespace | hasindexes | hasrules | hastriggers | tablecreator |            created            |         last_ddl_time         
------------+-----------+------------+------------+------------+----------+-------------+--------------+-------------------------------+-------------------------------
 s1         | t1        | enmo1      |            | f          | f        | f           | enmo1        | 2023-06-15 16:30:05.510558+08 | 2023-06-15 16:30:05.510558+08
 enmo1      | t1        | enmo1      |            | f          | f        | f           | enmo1        | 2023-06-15 16:28:03.908975+08 | 2023-06-15 16:28:03.908975+08
(2 rows)

testdb=>  

testdb=> SET SEARCH_PATH TO s1,public;
SET
testdb=> SHOW SEARCH_PATH;
 search_path 
-------------
 s1, public
(1 row)

testdb=> \dt+
                                      List of relations
 Schema | Name | Type  | Owner |    Size    |             Storage              | Description 
--------+------+-------+-------+------------+----------------------------------+-------------
 s1     | t1   | table | enmo1 | 8192 bytes | {orientation=row,compression=no} | 
(1 row)

testdb=> 
复制

总结

MogDB包含一个或多个已命名数据库。用户和角色在整个MogDB范围内是共享的,但是其数据并不共享。即用户可以连接任何数据库,但当连接成功后,任何用户都只能访问连接请求里声明的那个数据库。
角色是一组用户的集合。通过GRANT把角色授予用户后,用户即具有了角色的所有权限。
Schema又称作模式。通过管理Schema,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的Schema下而不引起冲突。


订阅号:DongDB手记
墨天轮:https://www.modb.pro/u/231198

最后修改时间:2023-06-16 10:59:41
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
2人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

huayumicheng
暂无图片
1年前
评论
暂无图片 0
理解MogDB中user/role/schema之间关系
1年前
暂无图片 点赞
评论
董宏伟
暂无图片
关注
暂无图片
获得了149次点赞
暂无图片
内容获得22次评论
暂无图片
获得了154次收藏
TA的专栏
MogDB
收录7篇内容
Oracle高可用
收录13篇内容
目录
  • 官网文档相关概念
  • 测试样例
    • 创建user,自动创建同名role和schema
    • 先创建role后,创建同名user报错
    • 创建user后,系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA
    • schema单独创建方式
    • 先创建schema后,创建同名user报错
    • 创建表默认schema测试
  • 总结