一、学习目标
时间过的很快,今天进入本次实训的第六天,第六天的实训内容重点依然是对openGauss体系结构的理解,用户登录数据库后,一次只能连接一个数据库,在不创建dblink的情况下,是无法在一个库中去访问其他数据库中的表,这一点也和其它数据库相同。
Oracle数据库可以直接使用dblink,但像MySQL如果需要使用dblink,需要更换相应存储引擎来实现,对于PG类,如使用dblink,需要安装编译相应插件才行。
课后我会抽时间熟悉openGauss对dblink插件的编译和安装,到时也会专门为此写篇文章。
再附上一个openGauss的逻辑结构图:
二、测试练习
2.1 创建表空间及数据库
[omm@opengauss-node1 ~]$ gsql -d presdb -p 26000
gsql ((openGauss 3.1.0 build 4e931f9a) compiled at 2022-09-29 14:19:24 commit 0 last mr )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
presdb=# CREATE TABLESPACE music_tbs RELATIVE LOCATION 'db/music_tbs';
CREATE TABLESPACE
presdb=# CREATE DATABASE musicdb WITH TABLESPACE = music_tbs;
CREATE DATABASE
presdb=# CREATE DATABASE musicdb1 WITH TABLESPACE = music_tbs;
CREATE DATABASE
presdb=# CREATE DATABASE musicdb2 WITH TABLESPACE = music_tbs;
CREATE DATABASE
presdb=# \db
List of tablespaces
Name | Owner | Location
------------+---------+--------------------------------
music_tbs | omm | db/music_tbs
musicdbtbs | omm | data/musicdbtbs
pg_default | omm |
pg_global | omm |
tbs1 | preuser | /opt/gaussdb/install/data/tbs1
tbs2 | preuser | /opt/gaussdb/install/data/tbs2
(6 rows)
presdb=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+---------+----------+---------+-------+-------------------
musicdb | omm | UTF8 | C | C |
musicdb1 | omm | UTF8 | C | C |
musicdb10 | omm | UTF8 | C | C |
musicdb2 | omm | UTF8 | C | C |
postgres | omm | UTF8 | C | C |
presdb | preuser | UTF8 | C | C |
template0 | omm | UTF8 | C | C | =c/omm +
| | | | | omm=CTc/omm
template1 | omm | UTF8 | C | C | =c/omm +
| | | | | omm=CTc/omm
(8 rows)

2.2 创建用户并授权
presdb=# CREATE USER user1 IDENTIFIED BY 'kunpeng@1234';
CREATE ROLE
presdb=# ALTER USER user1 SYSADMIN;
ALTER ROLE

2.3 切换不同库并建表并插入数据
presdb=# \c musicdb1 user1
Password for user user1:
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "musicdb1" as user "user1".
musicdb1=> create table t11(col1 char(20));
CREATE TABLE
musicdb1=> insert into t11 values('Hello openGauss! 11');
INSERT 0 1
musicdb1=> select * from t11;
col1
----------------------
Hello openGauss! 11
(1 row)
musicdb1=> \c musicdb2 user1
Password for user user1:
Non-SSL connection (SSL connection is recommended when requiring high-security)
You are now connected to database "musicdb2" as user "user1".
musicdb2=> create table t21(col1 char(20));
CREATE TABLE
musicdb2=> insert into t21 values('Hello openGauss! 22');
INSERT 0 1
musicdb2=> select * from t21;
col1
----------------------
Hello openGauss! 22
(1 row)

2.4 测试跨库查询数据
musicdb2=> select * from musicdb2.public.t21;
col1
----------------------
Hello openGauss! 22
(1 row)
musicdb2=> select * from musicdb1.public.t21;
ERROR: cross-database references are not implemented: "musicdb1.public.t21"
LINE 1: select * from musicdb1.public.t21;

三、课程总结
通过上述测试,可以看到,在不指定表所属用户的情况下,openGauss的表会默认创建在public下。
openGauss对于public是这样描述。
PUBLIC可看做是一个隐含定义好的组,它总是包括所有角色。任何角色或用户都将拥有通过GRANT直接赋予的权限和所属的权限,再加上PUBLIC的权限。
如果声明了WITH GRANT OPTION,则被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC,这是openGauss特有的属性。
openGauss会将某些类型的对象上的权限授予PUBLIC。默认情况下,对表、表字段、序列、外部数据源、外部服务器、模式或表空间对象的权限不会授予PUBLIC,而以下这些对象的权限会授予PUBLIC:数据库的CONNECT权限和CREATE TEMP TABLE权限、函数的EXECUTE特权、语言和数据类型(包括域)的USAGE特权。当然,对象拥有者可以撤销默认授予PUBLIC的权限并专门授予权限给其他用户。为了更安全,建议在同一个事务中创建对象并设置权限,这样其他用户就没有时间窗口使用该对象。
另外,如果未创建dblink,是无法使用用户在当前库下去对其它库下的表进行增删改查操作的。





