返回首页

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

更新日期:2024年09月11日

使用gsql 操作密态数据库
步骤1 以操作系统用户gbase 登录数据库主节点。
步骤2 执行以下命令打开密态开关,连接密态数据库。
gsql -p PORT postgres -r -C
步骤3 创建客户端主密钥CMK 和列加密密钥CEK。具体涉及到的新增创建CMK 的语法
参考《GBase 8c V5_3.0.0_SQL 手册》CREATE CLIENT MASTER KEY 章节,创建的CEK
的语法参考《GBase 8c V5_3.0.0_SQL 手册》CREATE COLUMN ENCRYPTION KEY
--创建客户端加密主密钥(CMK)
postgres=# CREATE CLIENT MASTER KEY ImgCMK1 WITH (KEY_STORE = localkms,
KEY_PATH ="key_path_value1", ALGORITHM = RSA_2048);
postgres=# CREATE CLIENT MASTER KEY ImgCMK WITH (KEY_STORE = localkms,
KEY_PATH ="key_path_value2", ALGORITHM = RSA_2048);
postgres=# CREATE COLUMN ENCRYPTION KEY ImgCEK1 WITH VALUES
(CLIENT_MASTER_KEY = ImgCMK1, ALGORITHM =
AEAD_AES_256_CBC_HMAC_SHA256);
CREATE COLUMN ENCRYPTION KEY
查询存储密钥信息的系统表结果如下。
postgres=# SELECT * FROM gs_client_global_keys;
global_key_name | key_namespace | key_owner |
key_acl |
create_date
-----------------+---------------+-----------+---------+----------------------------
imgcmk1
| 2200
|
10
| 2022-06-06 11:04:00.656617
imgcmk
| 2200
|
10
| 2022-06-06 11:04:05.389746
(2 rows)

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
200
postgres=# SELECT column_key_name,column_key_distributed_id ,global_key_id,key_owner
FROM gs_column_keys;
column_key_name | column_key_distributed_id | global_key_id | key_owner
-----------------+---------------------------+---------------+-----------
imgcmk1
|
|
10
|
2022-06-06 11:04:00.656617
imgcmk
|
|
10
|
2022-06-06 11:04:05.389746
(2 rows)
postgres=# SELECT column_key_name,column_key_distributed_id ,global_key_id,key_owner
FROM gs_column_keys;
column_key_name | column_key_distributed_id | global_key_id | key_owner
-----------------+---------------------------+---------------+-----------
imgcek1
|
760411027
|
16392
|
10
imgcek
|
3618369306 |
16398
|
10
(2 rows)
步骤4 创建加密表。
postgres=# CREATE TABLE creditcard_info (id_number
int, name text encrypted with
(column_encryption_key = ImgCEK, encryption_type = DETERMINISTIC), credit_card
varchar(19) encrypted with (column_encryption_key = ImgCEK1, encryption_type =
DETERMINISTIC));
NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'id_number' as the distribution
column by default.
HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.
CREATE TABLE
查询表的详细信息如下,Modifiers 值为encrypted 则表示该列是加密列。
postgres=# \d creditcard_info
Table "public.creditcard_info" Column
|
Type| Modifiers
-------------+-------------------+------------
id_number | integer
name
| text
credit_card | character varying | encrypted
步骤5 向加密表插入数据并进行等值查询。
postgres=# INSERT INTO creditcard_info VALUES (1,'joe','6217986500001288393');
INSERT 0 1
postgres=# INSERT INTO creditcard_info VALUES (2, 'joy','62199856783491543233');
INSERT 0 1
postgres=# select * from creditcard_info where name = 'joe';
id_number | name |
credit_card
-----------+------+---------------------

GBase 8c V5 开发者手册
南大通用数据技术股份有限公司
201
1 | joe | 6217986500001288393
(1 row)
注意:使用非密态客户端查看该加密表数据时是密文
postgres=# select id_number,name from creditcard_info;
id_number | name
-----------+--------------------
1 |
\x011aefabd754ded0a536a96664790622487c4d366d313aecd5839e410a46d29cba96a60e48310
00000ee7905 6a114c9a6c041bb552b78052e912a8b730609142074c63791abebd0d38
2 |
\x011aefabd76853108eb406c0f90e7c773b71648fa6e2b8028cf634b49aec65b4fcfb376f3531000
000f7471c868 6682de215d09aa87113f6fb03884be2031ef4dd967afc6f7901646b
(2 rows)
步骤6 (可选)对加密表进行alter 和update 操作。
postgres=# ALTER TABLE creditcard_info ADD COLUMN age int ENCRYPTED WITH
(COLUMN_ENCRYPTION_KEY = ImgCEK, ENCRYPTION_TYPE = DETERMINISTIC);
ALTER TABLE
postgres=# \d creditcard_info
Table "public.creditcard_info" Column
| Type| Modifiers
-------------+-------------------+------------
id_number | integer
name
| text
credit_card | character varying | encrypted
age
| integer
| encrypted
postgres=# ALTER TABLE creditcard_info DROP COLUMN age;
ALTER TABLE
postgres=# update creditcard_info set credit_card = '154320000011111111' where name = 'joy';
UPDATE 1
postgres=# select * from creditcard_info where name = 'joy';
id_number | name | credit_card
-----------+------+-------------------
2 | joy | 154320000011111111
(1 row)
----结束

转换数据库服务器时,若干修改将使数据库的格式无法兼容较旧的版本。
gadmin -b 命令可以修改数据,
这样较早版本的数据库服务器就可以访问这些数
据。
转换数据库服务器时,若干修改将使数据库的格式无法兼容较旧的版本。
gadmin -b 命令可以修改数据,
这样较早版本的数据库服务器就可以访问这些数
据。在某些情况下,不同版本之间的数据库格式是兼容的,因此不需要 gadmin
-b 命令。输入 gadmin -b 可查看数据库服务器可用的选项的用法消息。
该实用程序不会还原不影响兼容性的对数据布局所作的更改。
在用户可以使用较早版本的数据库服务器存取数据之前,您必须还原数据
库。
有关其他 gadmin 选项的信息,请参阅《GBase 8s 管理员参考》中的
gadmin 实用程序。

您可使用与将行插入到不基于 ROW 类型的表内的相同方法,将行插入到类型的表内。
当类型的表包含一 row 类型列
(定义该类型的表的命名了的 ROW 类型包含嵌套的 ROW
类型)时,您插入到 row 类型列的方法,与为不基于 ROW 类型的表插入 row 类型列的
方法相同。下列部分,在列上插入的语法规则,描述如何执行插入到 row 类型列内。
此部分为示例使用 row 类型 zip_t、address_t 和 employee_t,以及 类型的表 employee。下
图展示创建 row 类型和表的 SQL 语法。
图: 创建 row 类型和表的 SQL 语法。
CREATE ROW TYPE zip_t
(

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

z_code CHAR(5),
z_suffix CHAR(4)
);

CREATE ROW TYPE address_t
(
street VARCHAR(20),
city VARCHAR(20),
state CHAR(2),
zip zip_t
);

CREATE ROW TYPE employee_t
(
name VARCHAR(30),
address address_t,
salary INTEGER
);

CREATE TABLE employee OF TYPE employee_t;