1. DBMS_DDL插件简介
DBMS_DDL是KingbaseES的一个扩展插件,主要用于创建一个PL/SQL包体、函数、过程。
DBMS_DDL拓展插件不支持PG模式。
2. 加密函数WRAP
2.1. 概述
DBMS_DDL包里的加密函数WRAP,以CREATE [ OR REPLACE]语句作为输入,对SQL语句进行加密操作。
2.2. DBMS_DDL.WRAP
2.2.1. 功能描述
只加密不执行语句。
函数WRAP以CREATE [ OR REPLACE ]语句作为输入,指定创建PL/SQL包体、函数、过程。并返回CREATE [ OR REPLACE ]后面语句的加密语句。
2.2.2. 语法格式
语法格式:
DBMS_DDL.WRAP(ddl VARCHAR2)RETURN VARCHAR2;
参数说明:
ddl:指定用于创建一个PL/SQL包体、函数、过程的CREATE [ OR REPLACE ]语句。
返回值:
返回32k字节以内已加密的字符串。
注意事项:
-
任何试图调用这些PL/SQL代码的语句都应使用标准的包名SYS.DBMS_DDL以避免与本地定义的DBMS_DDL同义。
-
不能对trigger进行加密,如果需要对trigger进行加密请直接加密函数,然后通过触发器去调用该函数即可。
-
支持$$...$$的pg语法加密。可以加密使用$$..$$的pg语法的plsql对象或plpgsql对象。
异常:
如果不是CREATE [ OR REPLACE ]指定的PL/SQL语句,则报错:“向DBMS_DDL.WRAP 输入的内容不是合法的 PL/SQL 单元”。
2.3. DBMS_DDL.CREATE_WRAPPED
2.3.1. 功能描述
加密并执行语句。
过程CREATE_WRAPPED的功能是创建一个PL/SQL包体、函数、过程。它的实现流程是将输入参数的CREATE [ OR REPLACE ]语句转换为加密后的CREATE [ OR REPLACE ]语句,并执行转换后语句。实际上,该过程将封装PL/SQL文本与创建PL/SQL语句合为一体。
2.3.2. 语法格式
DBMS_DDL.CREATE_WRAPPED(ddl VARCHAR2);
参数说明:
ddl:指定用于创建一个PL/SQL包体、函数、过程的CREATE [ OR REPLACE ]语句。
注意事项:
-
任何试图调用这些PL/SQL代码都应使用标准的包名SYS.DBMS_DDL以避免与本地定义的DBMS_DDL同义。
-
CREATE_WRAPPED过程与WRAP函数一次只能输入单条PL/SQL或PL/pgSQL语句。
-
不能对trigger进行加密,如果需要对trigger进行加密请先加密函数,然后通过触发器去调用该函数。
-
支持$$...$$的pg语法加密。可以加密使用$$..$$的pg语法的plsql对象或plpgsql对象。
异常:
如果不是CREATE [ OR REPLACE ]指定的PL/SQL语句,则报错:“向DBMS_DDL.WRAP 输入的内容不是合法的 PL/SQL 单元”。并报出异常‘DBMS_DDL.MALFORMED_WRAP_INPUT’。
2.4. 示例
exec dbms_ddl.create_wrapped(
'create or replace function func4 return int is
begin
NULL;
return 3;
end;');
select dbms_ddl.wrap(
'create or replace function func4 return int is
begin
NULL;
return 3;
end;');
wrap
--------------------------------------------------------------
create or replace function func4 return int is WRAPPED +
590+pcWmbfjjFfKLnAxofbim0uq4teexAzkLpn7wcNqAlKlAYyrlj8HgjiK1+
2hZVKQ+iebVYIOC3/+hwN5sf9A== +
END;
(1 row)
exec dbms_ddl.create_wrapped(
'CREATE OR replace function func_test() returns int AS $$
BEGIN
return 1;
END $$language plpgsql;');
select dbms_ddl.wrap(
'CREATE OR replace function func_test() returns int AS $$
BEGIN
return 1;
END $$language plpgsql;');
wrap
------------------------------------------------------------------
CREATE OR replace function func_test() returns int AS $$ WRAPPED+
0YtnOX/Sg9VBhTNPXjO6/i6a2NCnaS+3HFqfoc8Pf1k= +
END; +
$$language plpgsql;
(1 row)