说明:
数据库系统使用过程中,有些业务功能在特殊的安全级别情况下,需要对数据库中的函数和存储过程进行加密存储,以保证数据库函数和过程的代码安全性。KingbaseES 数据库,提供了DBMS_DDL扩展插件功能,帮助对数据库中的函数和存储过程进行加密存储。
ddms_ddl扩展介绍:
DBMS_DDL是KingbaseES的一个扩展插件,主要用于创建一个PL/SQL函数、过程。DBMS_DDL系统自带扩展,不需要单独创建。
DBMS_DDL拓展插件不支持PG模式。
ddms_ddl扩展:
DBMS_DDL拓展插件内容:
test=# \dx+ dbms_ddl
对象用于扩展 "dbms_ddl"
对象描述
---------------------------
function wrapped(varchar)
package dbms_ddl
(2 行记录)
DBMS_DDL.WRAP
只加密不执行语句。函数WRAP以CREATE [ OR REPLACE ]语句作为输入,指定创建PL/SQL函数、过程。并返回CREATE [ OR REPLACE ]后面语句的加密语句。
语法格式:
DBMS_DDL.WRAP(ddl VARCHAR2)RETURN VARCHAR2;
参数说明:
ddl:指定用于创建一个PL/SQL包体、函数、过程的CREATE [ OR REPLACE ]语句。
返回值:
返回32k字节以内已加密的字符串。
DBMS_DDL.CREATE_WRAPPED
加密并执行语句。
语法格式
DBMS_DDL.CREATE_WRAPPED(ddl VARCHAR2);
参数说明:
ddl:指定用于创建一个PL/SQL函数、过程的CREATE [ OR REPLACE ]语句。
ddms_ddl示例:
DBMS_DDL.WRAP加密函数体
test=# select dbms_ddl.wrap(
test(# q'[
test'# CREATE PROCEDURE getValue(pid int) AS
test'# BEGIN
test'# select now();
test'# RAISE NOTICE 'pid=%',pid;
test'# END ;
test'# ]');
wrap
--------------------------------------------------------------
+
CREATE PROCEDURE getValue(pid int) AS WRAPPED +
Ysyb9n+AUBSMPkhTULtxOjaiiiMoxXYtRVnTlW2f1dJa/DnOklEoLqQyyouJ+
2oiVpC/nz/w26eThsPQr5juu3g== +
END;
(1 row)
test=# select dbms_ddl.wrap(
test(# q'[
test'# CREATE FUNCTION getName(pid int) RETURN VARCHAR2 AS
test'# DECLARE
test'# nam varchar(10);
test'# BEGIN
test'# SELECT 'return='|| to_char(pid) INTO nam FROM dual;
test'# RETURN nam;
test'# EXCEPTION
test'# WHEN no_data_found THEN
test'# RETURN 'NOFUOUND';
test'# WHEN OTHERS THEN
test'# RETURN 'OTHERS';
test'# END ;
test'# ]');
wrap
--------------------------------------------------------------
+
CREATE FUNCTION getname(pid int) RETURN VARCHAR2 AS WRAPPED +
jLdZaVH1HEkWXnhly2vcpWdyh1HhWuG91+ijKCp4cjvAE17MFcj9Meti/eJ9+
P7Giz2aysfFssGzKIYFokBykv1teJ7WJ8/dcoUpWFMgcjJT1slOzvIETLAtJ+
RgIhuXS7UcvJA+And0M7wAqPIcO+hGDVGtrobdjyWEsjj67x6/J/UArN8fy6+
4Kno4qUsLY8Dw7W+BSbAa3Ton60ynUemm6EtjlhQuqucXQVJsFtL1A9LU4vN+
3NlmM1eD0QLZbi7T166n7crOcK4iZcBm3bhVqJbJMrHlfO1y8s+mCGEUIZw=+
END;
(1 行记录)
DBMS_DDL.CREATE_WRAPPED加密并执行函数体
test=# CALL dbms_ddl.CREATE_WRAPPED(
test(# q'[
test'# CREATE PROCEDURE getValue(pid int) AS
test'# BEGIN
test'# select now();
test'# RAISE NOTICE 'pid=%',pid;
test'# END ;
test'# ]');
CALL
test=# \sf getValue
CREATE OR REPLACE PROCEDURE public.getvalue(pid integer)
AS WRAPPED
w5K/gWuBfiREAZ+LBYFLtu01ayNoHgqoSDf9ZtsG+KuFntIAS2i7Zji6CygE
HViaQ1VF6XfYrvHde1cmY2zxqw==
END
test=# CALL dbms_ddl.CREATE_WRAPPED(
test(# q'[
test'# CREATE FUNCTION getName(pid int) RETURN VARCHAR2 AS
test'# DECLARE
test'# nam varchar(10);
test'# BEGIN
test'# SELECT 'return='|| to_char(pid) INTO nam FROM dual;
test'# RETURN nam;
test'# EXCEPTION
test'# WHEN no_data_found THEN
test'# RETURN 'NOFUOUND';
test'# WHEN OTHERS THEN
test'# RETURN 'OTHERS';
test'# END ;
test'# ]');
CALL
test=# \sf getName
CREATE OR REPLACE FUNCTION public.getname(pid integer)
RETURNS varchar
AS WRAPPED
jLdZaVH1HEkWXnhly2vcpWdyh1HhWuG91+ijKCp4cjvAE17MFcj9Meti/eJ9
P7Giz2aysfFssGzKIYFokBykv1teJ7WJ8/dcoUpWFMgcjJT1slOzvIETLAtJ
RgIhuXS7UcvJA+And0M7wAqPIcO+hGDVGtrobdjyWEsjj67x6/J/UArN8fy6
4Kno4qUsLY8Dw7W+BSbAa3Ton60ynUemm6EtjlhQuqucXQVJsFtL1A9LU4vN
3NlmM1eD0QLZbi7T166n7crOcK4iZcBm3bhVqJbJMrHlfO1y8s+mCGEUIZw=
END
加密函数调用
test=# call getValue(110);
注意: pid=110
now
-------------------------------
2022-12-10 14:53:03.645849+08
(1 行记录)
CALL
test=# select getName(120);
getname
------------
return=120
(1 行记录)