返回首页

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 代码的示例在整个出版物中出现。
除非另有说明,
代码不特定于任何单个的 GBase 8s
应用程序开发工具。
如果示例中仅列出 SQL 语句,那么它们将不用分号定界。例如:您可能看到以下示例中
的代码:
CONNECT TO stores_demo
...
DELETE FROM customer
WHERE customer_num = 121
...
COMMIT WORK
DISCONNECT CURRENT
要将此 SQL 代码用于特定产品,必须应用该产品的语法规则。例如,如果使用的是 SQL
API,那么必须在每条语句的开头使用 EXEC SQL,并在每条语句的结尾使用分号(或其
他合适的定界符)。 如果使用的是 DB–Access,那么必须用分号将多条语句隔开。
提示: 代码示例中的省略点表示在整个应用程序中将添加更多的代码,但是不必显示它以描述
正在讨论的概念。
有关使用特定应用程序开发工具或 SQL API 的 SQL 语句的详细指导,
请参阅您的产品文
档。

使用 onstat 命令,
显示有关 RS 辅助服务器的状态信息。
要显示 RS 辅助服务器的数量、
有关已发送到 RS 辅助服务器的数据的信息,
以及有关 RS 辅助服务器已确认接收的内容
的信息,请使用 onstat -g rss 命令。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 426 -
此命令具有显示有关单台服务器或多个辅助服务器的扩展信息的选项。 有关 onstat -g rss
输出的示例,请参阅《GBase 8s 管理员参考》中有关 onstat 实用程序的信息。