返回首页

gbase数据、南大通用产品文档:GBase8c

更新日期:2024年09月11日

行级访问控制
行级访问控制特性将数据库访问控制精确到数据表行级别,
使数据库达到行级访问控制
的能力。不同用户执行相同的SQL 查询操作,读取到的结果是不同的。
用户可以在数据表创建行访问控制(Row Level Security)策略,该策略是指针对特定数据
库用户、特定SQL 操作生效的表达式。当数据库用户对数据表访问时,若SQL 满足数据表
特定的Row Level Security 策略,在查询优化阶段将满足条件的表达式,按照属性
(PERMISSIVE | RESTRICTIVE)类型,通过AND 或OR 方式拼接,应用到执行计划上。
行级访问控制的目的是控制表中行级数据可见性,通过在数据表上预定义Filter,在查
询优化阶段将满足条件的表达式应用到执行计划上,影响最终的执行结果。当前受影响的
SQL 语句包括SELECT,UPDATE,DELETE。
示例:
某表中汇总了不同用户的数据,
但是不同用户只能查看自身相关的数据信息,不
能查看其他用户的数据信息。
--创建用户alice, bob, peter
postgres=# CREATE USER alice PASSWORD 'xxxxxxxxx';

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
171
postgres=# CREATE USER bob PASSWORD 'xxxxxxxxx';
postgres=# CREATE USER peter PASSWORD 'xxxxxxxxx';
--创建表all_data,包含不同用户数据信息
postgres=# CREATE TABLE all_data(id int, role varchar(100), data varchar(100));
--向数据表插入数据
postgres=# INSERT INTO all_data VALUES(1, 'alice', 'alice data');
postgres=# INSERT INTO all_data VALUES(2, 'bob', 'bob data');
postgres=# INSERT INTO all_data VALUES(3, 'peter', 'peter data');
--将表all_data 的读取权限赋予alice,bob 和peter 用户
postgres=# GRANT SELECT ON all_data TO alice, bob, peter;
--打开行访问控制策略开关
postgres=# ALTER TABLE all_data ENABLE ROW LEVEL SECURITY;
--创建行访问控制策略,当前用户只能查看用户自身的数据
postgres=# CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role
= CURRENT_USER);
--查看表详细信息
postgres=# \d+ all_data
Table "public.all_data"
Column |
Type| Modifiers | Storage | Stats target | Description
--------+------------------------+-----------+----------+--------------+-------------
USING (((role)::name = "current_user"())) Has OIDs: no
Location Nodes: ALL DATANODES
Options: orientation=row, compression=no, enable_rowsecurity=true
--切换至用户alice,执行SQL"SELECT * FROM public.all_data"
gbase=> SELECT * FROM public.all_data;
id | role | data
----+-------+------------
1 | alice | alice data (1 row)
gbase=> EXPLAIN(COSTS OFF) SELECT * FROM public.all_data; QUERY PLAN
----------------------------------------------------------------
Streaming (type: GATHER) Node/s: All datanodes
-> Seq Scan on all_data
Filter: ((role)::name = 'alice'::name)
Notice: This query is influenced by row level security feature (5 rows)
--切换至用户peter,执行SQL"SELECT * FROM public.all_data"
gbase=> SELECT * FROM public.all_data;
id | role | data
----+-------+------------
3 | peter | peter data (1 row)
gbase=> EXPLAIN(COSTS OFF) SELECT * FROM public.all_data; QUERY PLAN
----------------------------------------------------------------

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
172
Streaming (type: GATHER) Node/s: All datanodes
-> Seq Scan on all_data
Filter: ((role)::name = 'peter'::name)
Notice: This query is influenced by row level security feature (5 rows)
PG_STATISTIC系统表和PG_STATISTIC_EXT系统表存储了统计对象的一些敏感信息,
如高频值MCV。若创建行级访问控制后,将这两张系统表的查询权限授予普通用户,则普
通用户仍然可以通过访问这两张系统表,得到统计对象里的这些信息。

(SQL 管理 API)
随同 admin() 或 task() 函数,使用 tenant create 参数来创建 tenant 数据库。
语法

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 829 -

元素
描述
关键考虑
database_name
tenant 数据库名。
在数据库服务器的数据库名中必须是唯一
的。该数据库标记为 tenant 数据库。
dbspace
dbspace 的名称。
罗列要在其中存储永久用户数据的一个或多
个 dbspace。
用逗号分隔 dbspace 名。
每一
dbspace 必须存在且为空。
tenant 数据库必须存储在一个或多个专
用的 dbspace 中。
仅在 tenant 数据库中
创建的对象可存储在该专用的 dbspace
中。
blobspace
blobspace 的名称。
如果 tenant 数据库会包含简单大对象,则

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 830 -
元素
描述
关键考虑
罗列一个或多个 blobspace。用逗号分隔
blobspace 名称。
每一 blobspace 必须存在
且为空。
仅存储在 tenant 数据库表中的简单大对
象可存储在该专用的 blobspace 中。
sbspace
sbspace 的名称。
如果 tenant 数据库会包含智能大对象,则
罗列一个或多个 sbspace。用逗号分隔
sbspace。每一 sbspace 必须存在且为空。
智能大对象可包括 BLOB 或 CLOB 数据,
以及那些过大以至于不适合在行中的表统
计信息。 有些 GBase 8s 特性,诸如
Enterprise Replication 和基本文本搜
索,需要 sbspace。
仅存储在 tenant 数据库表中的智能大对
象可存储在专用的 sbspace 中。
vpclass
虚拟处理器类的名称。 在其中为 tenant 数据库运行会话线程的
tenant 虚拟处理器类。如果您省略这个属
性,则在 CPU 虚拟处理器上运行会话线程。

vpclass_name 限定为 8 字符。最多可创
建 200 个 tenant 虚拟处理器。
如果 vpclass_name 是唯一的,则您可创
建新的 tenant 虚拟处理器类。如果存在
vpclass_name,则该 tenant 数据库与其
他 tenant 数据库共享该类。
vps
要运行的虚拟处理器
数。
如果您未包括 num=vps 属性,
则启动一个虚
拟处理器。

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 831 -
元素
描述
关键考虑
tempdbspace
临时 dbspace 的名称。
罗列要在其中存储临时用户数据的一个或多
个临时 dbspace。用逗号分隔临时 dbspace
名称。如果省略这个属性,则临时表存储在
由 DBSPACETEMP 配置参数或环境变量指定
的临时 dbspace 中。
您可通过设置 DBSPACETEMP 环境变量取
代会话的 dbspacetemp 属性。
tempsbspace
临时 sbspace 的名称。
罗列在其中存储临时智能大对象的一个或多
个临时 sbspace。用逗号分隔临时 sbspace
名称。如果您省略这个属性,则临时智能大
对象存储在由 SBSPACETEMP 配置参数指定
的临时 sbspaces 中。
locks
对于没有 DBA 权限的
用户,会话的锁的最大
数。
locks 的值必须为 500 -
2147483647。如果
您省略这个属性,则由
SESSION_LIMIT_LOCKS 配置参数设置锁的数
目。
如果 SESSION_LIMIT_LOCKS 配置参数未
设置,则会话的锁的最大数目为
2147483647。
您可通过设置 IFX_SESSION_LIMIT_LOCKS
环境选项取代会话的
session_limit_locks 属性。
log_mode
日志模式定义:
UNBUFFERED
无缓冲区的数据库日
志记录。
这是缺省值。

ANSI
符合 ANSI 的数据库
日志记录。
如果您省略这个属性,则日志记录模式为无
缓冲区的。

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 832 -
元素
描述
关键考虑
BUFFERED
有缓冲区的数据库日
志记录。
NONE
无数据库日志记录。
case
大小写定义:
INSENSITIVE
不区分大小写。这是
缺省值。
SENSITIVE
区分大小写。
如果您省略这个属性,则数据库不缺分大小
写。
locale
数据库的语言环境。
locale 的值与 DB_LOCALE 环境变量的值相
同。
如果您省略这个属性。
则由 DB_LOCALE 环
境变量的值设置语言环境。缺省语言环境
为 US English。
catalog_dbspace 存储数据库目录的
dbspace 的名称。必须
是由 dbspace 属性罗
列的 dbspace 的名称。

如果您省略这个属性,
则 dbspace 属性列表
中的第一个 dbspace 包含数据库目录。

用法
您必须拥有 DBA 权限或被授予 TENANT 权限来运行这个命令。
随同 admin() 或 task() 函数,运行 tenant create 参数来创建 tenant 数据库。创建该数据
库的用户被授予 DBA 权限。
您可在 sysadmin 数据库中的 tenant 中查看 tenant 数据库属
性。
下列语句创建名为 companyA 的 tenant 数据库:
EXECUTE FUNCTION task('tenant create', 'companyA',
'{dbspace:"companyA_dbs1,companyA_dbs2,companyA_dbs3",
sbspace:"companyA_sbs",

GBase 8s 管理员参考
南大通用数据技术股份有限公司 - 833 -
vpclass:"tvp_A,num=6",
dbspacetemp:"companyA_tdbs",
session_limit_locks:"1000",
logmode:"ansi"}'
);
该 tenant 数据库有三个专用的 dbspace、一个专用的 sbspace、六个 tenant 虚拟处理器、
一个专用的临时 dbspace,每一会话限定 1000 个锁,且 logmode 为 ANSI。该 tenant 数
据库没有 blobspace,
在由 SBSPACETEMP 配置参数指定的 sbspace 中存储临时智能大对
象,且区分大小写。

1.
新增字符集 GB18030-2005、GB18030-2022
数据库服务器、客户端应用程序C接口(ODBC、GCI)、JAVA接口(JDBC)均支持
GB18030-2022、GB18030-2005 字符集字符的输入输出。
有关详细信息,请参阅《GBase 8s V8.8 What's new_3.5.1》“1.3.1
字符集扩展”中
“新增字符集 GB18030-2005、GB18030-2022”。