返回首页

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

更新日期:2024年09月11日

PG_EXTENSION 系统表存储关于所安装扩展的信息。GBase 8c 默认扩展是PLPGSQL

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
784
和MOT_FDW。
名称
类型
描述
oid
oid
数据库对象id。
extname
name
扩展名。
extowner
oid
扩展的所有者。
extnamespace
oid
扩展导出对象的名称空间。
extrelocatable
Boolean
标识此扩展是否可迁移到其他名称空间,tru
e 表示允许。
extversion
text
扩展的版本号。
extconfig
oid[]
扩展的配置信息。
extcondition
text[]
扩展配置信息的过滤条件。


使用file_fdw 需要指定要读取的文件,请先准备好该文件,并让数据库有读取权限。

创建服务器对象:CREATE SERVER

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
1143

创建用户映射:CREATE USER MAPPING

创建外表:CREATE FOREIGN TABLE 外表的表结构需要与指定的文件的数据保持一
致。

对外表做查询操作,写操作不被允许。

删除外表:DROP FOREIGN TABLE

删除用户映射:DROP USER MAPPING

删除服务器对象:DROP SERVER

功能描述

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
934
对表创建行访问控制策略。
当对表创建了行访问控制策略,只有打开该表的行访问控制开关(ALTER TABLE …
ENABLE ROW LEVEL SECURITY),策略才能生效。否则不生效。
当前行访问控制影响数据表的读取操作(SELECT、UPDATE、DELETE),暂不影响数据
表的写入操作(INSERT、MERGE INTO)。表所有者或系统管理员可以在USING 子句中创建
表达式,
在客户端执行数据表读取操作时,
数据库后台在查询重写阶段会将满足条件的表达
式拼接并应用到执行计划中。针对数据表的每一条元组,当USING 表达式返回TRUE 时,
元组对当前用户可见,当USING 表达式返回FALSE 或NULL 时,元组对当前用户不可见。
行访问控制策略名称是针对表的,
同一个数据表上不能有同名的行访问控制策略;
对不
同的数据表,可以有同名的行访问控制策略。
行访问控制策略可以应用到指定的操作(SELECT、UPDATE、DELETE、ALL),ALL
表示会影响SELECT、UPDATE、DELETE 三种操作;定义行访问控制策略时,若未指定受
影响的相关操作,默认为ALL。
行访问控制策略可以应用到指定的用户(角色),
也可应用到全部用户(PUBLIC);
定义行
访问控制策略时,若未指定受影响的用户,默认为PUBLIC。
注意事项

支持对行存表、行存分区表、列存表、列存分区表、unlogged 表、hash 表定义行访问控
制策略。

不支持外表、本地临时表定义行访问控制策略。

不支持对视图定义行访问控制策略。

同一张表上可以创建多个行访问控制策略,一张表最多创建100 个行访问控制策略。

系统管理员不受行访问控制影响,可以查看表的全量数据。

通过SQL 语句、视图、函数、存储过程查询包含行访问控制策略的表,都会受影响。
语法格式
CREATE [ ROW LEVEL SECURITY ] POLICY policy_name ON table_name

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
935
[ AS { PERMISSIVE | RESTRICTIVE } ]
[ FOR { ALL | SELECT | UPDATE | DELETE } ]
[ TO { role_name | PUBLIC } [, ...] ]
USING ( using_expression )
参数说明

policy_name
行访问控制策略名称,同一个数据表上行访问控制策略名称不能相同。

table_name
行访问控制策略的表名。

PERMISSIVE | RESTRICTIVE
PERMISSIVE 指定行访问控制策略为宽容性策略,宽容性策略的条件用OR 表达式拼
接。
RESTRICTIVE 指定行访问控制策略为限制性策略,限制性策略的条件用AND 表达式
拼接。拼接方式如下:
(using_expression_permissive_1 OR using_expression_permissive_2 ...) AND
(using_expression_restrictive_1 AND using_expression_restrictive_2 ...)
缺省值为PERMISSIVE。

command
当前行访问控制影响的SQL 操作,
可指定操作包括:
ALL、
SELECT、
UPDATE、
DELETE。
当未指定时,ALL 为默认值,涵盖SELECT、UPDATE、DELETE 操作。
当command 为SELECT 时,SELECT 类操作受行访问控制的影响,只能查看到满足条
件(using_expression 返回值为TRUE)的元组数据,受影响的操作包括SELECT、UPDATE …
RETURNING、DELETE … RETURNING。

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
936
当command 为UPDATE 时,UPDATE 类操作受行访问控制的影响,
只能更新满足条件
(using_expression 返回值为TRUE)的元组数据,受影响的操作包括UPDATE、UPDATE …
RETURNING、SELECT … FOR UPDATE/SHARE。
当command 为DELETE 时,DELETE 类操作受行访问控制的影响,只能删除满足条件
(using_expression 返回值为TRUE)的元组数据,受影响的操作包括DELETE、DELETE …
RETURNING。
行访问控制策略与适配的SQL 语法关系参加下表:
表1 ROW LEVEL SECURITY 策略与适配SQL 语法关系
Command
SELECT/ALL poli
cy
UPDATE/ALL poli
cy
DELETE/ALL poli
cy
SELECT
Existing row
No
No
SELECT FOR UP
DATE/SHARE
Existing row
Existing row
No
UPDATE
No
Existing row
No
UPDATE RETUR
NING
Existing row
Existing row
No
DELETE
No
No
Existing row
DELETE RETUR
NING
Existing row
No
Existing row

role_name
行访问控制影响的数据库用户。
当未指定时,PUBLIC 为默认值,PUBLIC 表示影响所有数据库用户,可以指定多个受
影响的数据库用户。
须知:系统管理员不受行访问控制特性影响。
using_expression

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
937
行访问控制的表达式(返回boolean 值)

条件表达式中不能包含AGG 函数和窗口(WINDOW)函数。在查询重写阶段,如果数
据表的行访问控制开关打开,
满足条件的表达式会添加到计划树中。
针对数据表的每条元组,
会进行表达式计算,只有表达式返回值为TRUE 时,行数据对用户才可见(SELECT、
UPDATE、DELETE)
;当表达式返回FALSE 时,该元组对当前用户不可见,用户无法通过
SELECT 语句查看此元组,无法通过UPDATE 语句更新此元组,无法通过DELETE 语句删
除此元组。
示例
--创建用户alice
gbase=#CREATE USER alice PASSWORD 'xxxxxxxxx';
--创建用户bob
gbase=#CREATE USER bob PASSWORD 'xxxxxxxxx';
--创建数据表all_data
gbase=#CREATE TABLE all_data(id int, role varchar(100), data varchar(100));
--向数据表插入数据
gbase=#INSERT INTO all_data VALUES(1, 'alice', 'alice data');
gbase=#INSERT INTO all_data VALUES(2, 'bob', 'bob data');
gbase=#INSERT INTO all_data VALUES(3, 'peter', 'peter data');
--将表all_data 的读取权限赋予alice 和bob 用户
gbase=#GRANT SELECT ON all_data TO alice, bob;
--打开行访问控制策略开关

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
938
gbase=#ALTER TABLE all_data ENABLE ROW LEVEL SECURITY;
--创建行访问控制策略,当前用户只能查看用户自身的数据
gbase=#CREATE ROW LEVEL SECURITY POLICY all_data_rls ON all_data USING(role =
CURRENT_USER);
--查看表all_data 相关信息
gbase=#\d+ all_data
Table "public.all_data"
Column |
Type
| Modifiers | Storage
| Stats target | Description
--------+------------------------+-----------+----------+--------------+-------------
id
| integer
|
| plain
|
|
role
| character varying(100) |
| extended |
|
data
| character varying(100) |
| extended |
|
Row Level Security Policies:
POLICY "all_data_rls"
USING (((role)::name = "current_user"()))
Has OIDs: no
Options: orientation=row, compression=no, enable_rowsecurity=true
--当前用户执行SELECT 操作
gbase=#SELECT * FROM all_data;
id | role
|
data
----+-------+------------
1 | alice | alice data
2 | bob
| bob data
3 | peter | peter data
(3 rows)

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
939
gbase=#EXPLAIN(COSTS OFF) SELECT * FROM all_data;
QUERY PLAN
----------------------
Seq Scan on all_data
(1 row)
--切换至alice 用户执行SELECT 操作
gbase=#SELECT * FROM all_data;
id | role
|
data
----+-------+------------
1 | alice | alice data
(1 row)
gbase=#EXPLAIN(COSTS OFF) SELECT * FROM all_data;
QUERY PLAN
----------------------------------------------------------------
Seq Scan on all_data
Filter: ((role)::name = 'alice'::name)
Notice: This query is influenced by row level security feature
(3 rows)
相关命令
DROP ROW LEVEL SECURITY POLICY,ALTER ROW LEVEL SECURITY POLICY