官网文档相关概念
测试样例
创建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




