返回首页

gbase数据、南大通用产品文档:GBase8a脱敏规则

更新日期:2024年09月11日

函数按照不同的处理逻辑,脱敏规则的获取方式也不相同,大致可分为两类。
1.
控制流函数可以直接返回脱敏列,而非对脱敏列进行比较和计算,这时函数会
将脱敏列的脱敏规则应用到其他返回值。这类函数有case when/decode、if、
ifnull、nvl 和coalesce 函数。举例如下:
select case col when 1 then '123' when 2 then '456' when 3 then mask_col else '789' end from t;
说明
其中col 为非脱敏列,mask_col 为脱敏列,“123”、“456”、“789” 为常量。
上面查询中case when 函数可能的返回值为’123’、’456’、’789’和mask_col,返
回值中包含了脱敏列,这时会对常量’123’、’456’和’789’按照脱敏列mask_col
的脱敏规则进行脱敏。

当这类函数的返回值中有多个脱敏列(不同列)时,该函数将使用默认脱敏规
则(不考虑多列脱敏规则是否完全相同)。
比如:
select nvl(mask_col1, mask_col2) from t;
nvl 函数将使用默认脱敏规则。

select nvl(mask_col1, mask_col1) from t;
nvl 函数仍将使用mask_col1 的脱敏规则。

当这类函数的返回值中既包含脱敏列,同时也包含非脱敏列(不是常量)时,
该函数也将使用默认脱敏规则。
比如:
select coalesce(col, mask_col) from t;
coalesce 函数将使用默认脱敏规则。

当这类函数的返回值中类型不完全相同时,
将会依据数据类型的转换规则进行

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
465
转换,
如果转换后的数据类型与脱敏列的原始类型不一致
(只考虑string、
real、
decimal 和int 四个级别,而不考虑更细的数据类型),则使用默认脱敏。
比如:
select coalesce(mask_int_col, 'abcdef') from t;
coalesce 函数返回值为string,
与mask_int_col 的类型(int)不一致,
所以coalesce
将使用默认脱敏。
默认脱敏时,
并不是将mask_int_col 的值转换为string,
而是直接返回string 类
型的默认脱敏值(xxxx)。
控制流函数类型转换规则:

任何一个参数为string 时,则按string 进行运算;

没有string 时,如果存在real,按real 进行运算;

没有string 和real 时,如果存在decimal,按decimal 进行运算;

日期时间类型算作string 类型。
控制流函数只对所有可能的返回值进行脱敏,对控制逻辑中的其他参数不脱
敏,比如case when 函数中只对then 和else 进行脱敏,对case 和when 分支中
的参数不脱敏。

Union、
Intersect 和Minus 运算时,
对应列的脱敏规则选取与控制流函数的脱敏
规则一致。
比如:
select mask_int_col from t union select mask_int_col as col from t;
将使用mask_int_col 的脱敏规则,而:
select mask_int_col from t union select mask_int_col+1 from t;
将使用默认脱敏。
2.
绝大部分函数是对参数进行比较或者计算,比如一些字符串函数、比较函数、
数值函数、时间和日期函数、OLAP 函数和聚集函数等,这类函数的参数如果
有脱敏列,函数将使用默认脱敏规则对返回值进行脱敏,而非对脱敏列脱敏后
参与运算。
举例如下:
select concat(mask_col, '123') from t;
其中mask_col 为脱敏列,’123’为常量。
上面查询中concat 函数并非将脱敏后的mask_col 字符串连接常量’123’,而是
对concat 返回值进行默认脱敏。
由于concat 返回值是字符类型,
所以上述结果
除mask_col 为NULL 的情况外(NULL 值情况返回值为NULL),始终返

GBase 8a MPP Cluster 产品手册
4 管理员指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
466
回’xxxx’。
再比如select mask_col > 1 from t; 将依据函数“>”的返回值类型使用默认脱
敏规则,所以除mask_col 为NULL 值外,始终返回0。
脱敏列脱敏后如果超过脱敏列的最大长度,则自动截断为脱敏列的最大长度。
比如脱敏列定义为:
mask_col varchar(5) masked with (function ='partial(2,"xxxx",2)')
则值“abcde”理论上应脱敏为“abxxxxde”,脱敏后的长度超过了最大长度5,
自动截断为“abxxx”。
同样,对于一些可设置长度的函数脱敏时也会被截断,比如:
select left(mask_col, 2) from t;
left 函数将使用默认脱敏,理论上应脱敏为“xxxx”,但超过了left 函数设置
的最大长度,所以自动截断为“xx”。

导出数据时,只有指定了format 参数为3 时,才可以指定字段包围符。此参数无默
认值,如果导出时不指定此参数,导出的数据不会被字段包围符包围。本节的示例
都基于以下表结构和数据内容。
DROP TABLE IF EXISTS message;
COMMIT;
CREATE TABLE
message(id int, name varchar2(20), message varchar2(50));
INSERT INTO message VALUES(1,'Tom','I am Tom');
INSERT INTO message VALUES(2,'小明','HHHH"KKKK');
INSERT INTO message VALUES(3,'Peter','Hello!Hello!');
INSERT INTO message VALUES(4,'Yama','send mail');
INSERT INTO message VALUES(5,'Hellen','');
INSERT INTO message VALUES(6,'','');
INSERT INTO message VALUES(7,'Seven','a book store');
INSERT INTO message VALUES(8,'MMEE','yes');
INSERT INTO message VALUES(9,'George','Thank you.');
INSERT INTO message VALUES(10,'Lastman','no message');
COMMIT;

还可以在使用常量的 SQL 表达式中的任意位置使用 LENGTH 、USER 、CURRENT 、
SYSDATE 和 TODAY 函数。另外,可以在 SELECT 语句中包括 DBSERVERNAME 函数
来显示当前数据库所驻留的数据库服务器的名称。
还可以使用这些函数来选择全部由常量值组成的表达式或包括列数据的表达式。在一个实
例中,对于所有输出行,结果相同。
另外,
可以使用 HEX 函数返回表达式的十六进制编码,
使用 ROUND 函数来返回表达式的
四舍五入值,使用 TRUNC 函数来返回表达式的截断值。有关上述函数的更多信息,请参
阅《GBase 8s SQL 指南:语法》。

LENGTH 函数
在下列查询中,LENGTH 函数针对 company 的长度大于 15 的每个行计算组
合 fname 和 lname 列的字节数。
图: 查询
SELECT customer_num,
LENGTH (fname) + LENGTH (lname) namelength
FROM customer

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 105 -
WHERE LENGTH (company) > 15;
图: 查询结果
customer_num namelength

101 11
105 13
107 11
112 14
115 11
118 10
119 10
120 10
122 12
124 11
125 10
126 12
127 10
128 11
尽管 LENGTH 函数在使用 DB-Access 时可能不是非常有用,
但用于确定程序和报告的长度
时它就非常重要。LENGTH 函数返回 CHARACTER 或 VARCHAR 字符串的剪切长度以
及 TEXT 或 BYTE 字符串中的全部字节数。
GBase 8s 还支持 CHAR_LENGTH 函数,该函数在其字符串参数中返回逻辑字符数而不是
返回字节数。该函数在单个逻辑字符可能需要多个单字节存储的语言环境中非常有用。有
关 CHAR_LENGTH 函数的更多信息,
请参阅
《GBase 8s SQL 指南:
语法》

《GBase 8s GLS
用户指南》。

USER 函数
当想要定义仅包含包括您的用户标识行的表的受限视图时,使用 USER 函数。有关如何创
建视图的信息,请参阅《GBase 8s 数据库设计和实现指南》和《 GBase 8s SQL 指南:语
法》 中的 GRANT 和 CREATE VIEW 语句。
下列查询返回执行查询的用户的用户名(登录用户名),对表中的每行重复一次。
图: 查询
SELECT * FROM cust_calls
WHERE user_id = USER;
如果当前用户的用户名是 richc,该查询仅检索 cust_calls 表中 user_id = richc 的行。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 106 -
图: 查询结果
customer_num 110
call_dtime 1998-07-07 10:24
user_id richc
call_code L
call_descr Order placed one month ago (6/7) not received.
res_dtime 1998-07-07 10:30
res_descr Checked with shipping (Ed Smith). Order sent yesterday-we
were waiting for goods from ANZ. Next time will call with
delay if necessary

customer_num 119
call_dtime 1998-07-01 15:00
user_id richc
call_code B
call_descr Bill does not reflect credit from previous order
res_dtime 1998-07-02 08:21
res_descr Spoke with Jane Akant in Finance. She found the error and
is
sending new bill to customer

TODAY 函数
TODAY 函数返回当前系统日期。如果下列查询是在当前系统日期为 1998 年 7 月 10 日
时发出的,它返回这一行。
图: 查询
SELECT * FROM orders WHERE order_date = TODAY;
图: 查询结果
order_num 1018
order_date 07/10/1998
customer_num 121
ship_instruct SW corner of Biltmore Mall
backlog n
po_num S22942
ship_date 07/13/1998
ship_weight 70.50

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 107 -
ship_charge $20.00
paid_date 08/06/1998

DBSERVERNAME 和 SITENAME 函数
可以在 SELECT 语句中包含 DBSERVERNAME
(或它的同义词 SITENAME)
函数来查询
数据库服务器的名称。
可以查询 DBSERVERNAME 以找到具有行的任何表,
包括系统目录
表。
在下列查询中,
将标签 server 指定给 DBSERVERNAME 表达式并且也从 systables 系统目录
表中选择 tabid 列。此表描述数据库表,tabid 就是表标识。
图: 查询
SELECT DBSERVERNAME server, tabid
FROM systables
WHERE tabid <= 4;
图: 查询结果
server tabid

montague 1
montague 2
montague 3
montague 4
WHERE 子句限制显示的行数。否则,可能会对 systables 表的每一行显示数据库服务器名
一次。

HEX 函数
在下列查询中,HEX 函数返回 customer 中两列的十六进制格式,如下所示。
图: 查询
SELECT HEX (customer_num) hexnum, HEX (zipcode) hexzip
FROM customer;
图: 查询结果
hexnum hexzip

0x00000065 0x00016F86
0x00000066 0x00016FA5
0x00000067 0x0001705F

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 108 -
0x00000068 0x00016F4A
0x00000069 0x00016F46
0x0000006A 0x00016F6F


DBINFO 函数
可以在 SELECT 与中调用 DBINFO 函数来查询下列任何信息:

与 tblspace 号或表达式对应的 dbspace 的名称

表中插入的最后一个 SERIAL 、SERIAL8 或 BIGSERIAL 值

SELECT 、
INSERT 、
DELETE 、
UPDATE 、
MERGE 、
EXECUTE FUNCTION 、
EXECUTE PROCEDURE 或 EXECUTE ROUTINE 语句处理的行数

当前会话的会话 ID

会话连接的当前的数据库的名称

INSERT 、UPDATE 或 DELETE 语句是否作为应答事务一部分正在执行

数据库服务器在其上运行的主计算机的名称

操作系统的类型和主计算机的名称

全球标准时间(UTC)格式的本地时区和当前日期和时间

对应于指定的整型列或指定的 UTC 时间值的 DATETIME 值
(作为自 1970-01-01
00:00:00+00:00 的秒数)

客户机应用程序连接至的数据库服务器的精确版本或指定完整版本字符串的组件
可以在 SQL 语句中和 SPL 例程中的任何地方使用 DBINFO 函数。
下列查询显示可以和如何使用 DBINFO 函数来找出数据库服务器在其上运行的主计算机的
名称。
图: 查询
SELECT FIRST 1 DBINFO('dbhostname') FROM systables;
图: 查询结果
(constant)

lyceum
没有 FIRST 1 子句来限制 tabid 中的值,
将对 systables 表的每一行重复数据库服务器在其上
运行的计算机的主机名。
下列查询显示可以如何使用 DBINFO 函数来找出当前数据库服务
器的完整版号和类型。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 109 -
图: 查询
SELECT FIRST 1 DBINFO('version','full') FROM systables;
有关如何使用 DBINFO 函数查找您当前数据库服务器、数据库会话或数据库的信息的更多
信息,请参阅《GBase 8s SQL 指南:语法》。

DECODE 函数
可以使用 DECODE 函数来将具有一个值的表达式转换为另一个值。DECODE 函数具有以
下格式:
DECODE(test, a, a_value, b, b_value, ..., n, n_value, exp_m )
在通常情况下,
当 a 等于 test 时 DECODE 函数返回 a_value,
当 b 等于 test 时,
返回 b_value,
当 n 等于 test 时返回 n_value 。
如果有若干表达式与 test 匹配,那么 DECODE 返回找到的第一个表达式的 n_value。如果
没有表达式与 test 匹配,
那么 DECODE 返回 exp_m;;如果没有表达式与 test 匹配并且不存
在 exp_m,那么 DECODE 返回 NULL。
限制: DECODE 函数不支持类型为 TEXT 或 BYTE 的参数。
假设包括 emp_id 和 evaluation 列的 employee 表存在。此外还假设对 employee 表执行下列
查询则返回以下所示的行。
图: 查询
SELECT emp_id, evaluation FROM employee;
图: 查询结果
emp_id evaluation

012233 great
012344 poor
012677 NULL
012288 good
012555 very good
在某些情况下,您可能想要转换一组值。例如:假设您想要将前一示例中 evaluation 列的描
述值转换为相应的数字值。
下列查询显示如何使用DECODE 函数来针对 employee 表中的每
一行将 evaluation 列中的值转换为数字值。
图: 查询
SELECT emp_id, DECODE(evaluation, "poor", 0, "fair", 25, "good",
50, "very good", 75, "great", 100, -1) AS evaluation
FROM employee;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 110 -
图: 查询结果
emp_id evaluation

012233 100
012344 0
012677 -1
012288 50
012555 75

可为 DECODE 函数的参数指定任何数据类型,只要这些参数满足以下需求:
参数 test 、a 、b 、... 、n 都具有相同的数据类型或求值为公共兼容的数据类型。
参数 a_value 、
b_value 、
... 、
n_value 都具有相同的数据类型或求值为公共兼容的数据类型。

NVL 函数
可以使用 NVL 函数将求值为 NULL 的表达式转换为您指定的值。
NVL 函数接受两个参数:
第一个参数获取要求值的表达式的名称;
第二个参数指定当第一个参数求值为 NULL 时函
数返回的值。如果第一个参数求值不为 NULL,那么函数将返回第一个参数的值。假设包
括 name 和 address列的 student 表存在。同时假设对 student 表执行以下查询。
图: 查询
SELECT name, address FROM student;
图: 查询结果
name address

John Smith 333 Vista Drive
Lauren Collier 1129 Greenridge Street
Fred Frith NULL
Susan Jordan NULL
以下是包括 NVL 函数的一个示例,
该函数为表 address 列包含 NULL 值的每一行返回一个
新值。
图: 查询
SELECT name, NVL(address, "address is unknown") AS address
FROM student;
图: 查询结果
name address

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 111 -

John Smith 333 Vista Drive
Lauren Collier 1129 Greenridge Street
Fred Frith address is unknown
Susan Jordan address is unknown
可以为 NVL 函数指定任何数据类型,只要这两个参数求值为公共兼容的数据类型。
如果 NVL 函数的两个参数都求值为 NULL,那么函数返回 NULL。
GBase 8s 还支持 NULLIF 函数。该函数类似于 NVL 函数。但语义不同。如果其两个参数相
等,NULLIF 返回 NULL,或者两个参数不相等,将返回第一个参数。有关 NULLIF 函数
的更多信息,请参阅《GBase 8s SQL 指南:语法》。