官网文档相关概念
测试样例
创建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
文章被以下合辑收录
评论
