金仓数据库KingbaseES支持查看存储过程函数定义完整性介绍
关键字:
KingbaseES、kdb_ddl、存储过程和函数定义查看
1.KDB_DDL插件
kdb_ddl插件功能支持了数据库对象:FUNCTION,PACKAGE,PROCEDURE,TRIGGER,TYPE,VIEW的完整DDL脚本的查看功能,通过一系列的接口函数可以获取目标对象的删除、创建及授权语句。
插件的创建语句:create extension kdb_ddl;
2.功能介绍
kdb_ddl插件支持了一系列的接口函数,可以获取完整的数据库对象DDL脚本、数据库对象创建语句、数据库对象删除语句、数据库对象授权语句。 在脚本语句中,依次为删除语句,创建语句和授权语句。其中删除语句可以根据用户提供的选项决定是否显示,以及是否添加if exists子句。 对象的创建语句包括:
- 通过注释的方式标明当前对象的类型、名称、属主和在当前数据库中的状态
- 通过注释的方式标明被当前对象直接依赖的对象和直接依赖当前对象的对象的信息,包括对象的类型和名称。
- 当前对象的属主设置语句,用户可通过选项参数指定是否显示设置属主语句;
- 当前对象的注释语句(comment),当数据库对象不存在注释语句时,则不显示注释语句;
- 视图和表,可以通过选项指定if not exists子句;
- 加密的数据库对象,获取到的创建语句为密文。
- 通过接口脚本返回的创建语句中,如果语法规则支持or replace字段,则总会含有or replace字段,无论该对象的原始创建语句是否包含该字段,如函数、存储过程、触发器、包、视图、对象类型、可变数组和嵌套表类型。如果语法规则不支持or replace字段,则不包含该字段,如枚举类型、范围类型等。
授权语句跟在对象的创建语句之后,用户也可以通过选项参数指定是否显示授权语句。
注:对象依赖的对象的显示规则,依赖于对象状态开关,可通过参ORA_FUNC_STYLE控制,具体规则如下:
对象状态关闭时,PLSQL对象的参数,返回值,参数默认值中包含的数据库对象,可显示依赖关系。
对象状态开启时,PLSQL对象的参数,返回值,参数默认值以及内部所有引用当前对象的对象,均可显示依赖关系。
3.使用示例
以存储过程为例,来介绍一下数据库对象查看完整性的使用,其他对象使用类似,只需将接口函数的参数值,换成对应的对象即可。
步骤1:创建kdb_ddl插件,开启对象状态开关
create extension kdb_ddl;
set ora_func_style =on;
步骤2:创建自定义类型my_obj_type1,创建存储过程pr1,依赖表t1,其中一个参数类型为my_obj_type1,成功创建
\set SQLTERM ;
create table t1(id int,name varchar(50));
\set SQLTERM /
CREATE OR REPLACE TYPE my_obj_type1 AS OBJECT(
idno NUMBER,
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone VARCHAR2(20),
MEMBER PROCEDURE display_details);
/
\set SQLTERM /
CREATE OR REPLACE TYPE BODY my_obj_type1 AS
MEMBER PROCEDURE display_details IS
BEGIN
DBMS_OUTPUT.PUT_LINE(TO_CHAR(idno) || ' ' || first_name || ' ' || last_name);
DBMS_OUTPUT.PUT_LINE(email || ' ' || phone);
END;
END;
/
\set SQLTERM /
CREATE OR REPLACE PROCEDURE pr1(p1 int,p2 MY_obj_type1) AS
v1 int;
v2 varchar(50) :='test in procedure';
v3 MY_obj_type1;
BEGIN
DBMS_OUTPUT.PUT_LINE( '----insert into table----');
INSERT INTO t1 VALUES(p1,v2);
v3 :=my_obj_type1(65, 'Verna', 'Mills', 'vmills@example.com', '1-650-555-0125');
v3.display_details();
DBMS_OUTPUT.PUT_LINE( '----assign use p2----');
v3 :=p2;
v3.display_details();
END;
/
给存储过程添加comment语句,执行以下sql:
COMMENT ON PROCEDURE pr1 IS 'TEST GET DDL';
创建用户testu1,并授予其pr1的execute权限
CREATE USER testu1;
GRANT EXECUTE ON PROCEDURE pr1 TO testu1;
步骤3:查看存储过程完整的定义语句
\set SQLTERM ;
SELECT kdb_ddl.ddlx_script('pr1','PUBLIC','procedure','');
步骤4:仅查看存储过程的创建语句
SELECT kdb_ddl.ddlx_create('pr1','PUBLIC','procedure','');
步骤五:查看存储过程的删除语句
SELECT kdb_ddl.ddlx_drop('pr1','PUBLIC','procedure','');
步骤六:查看存储过程的授权语句
SELECT kdb_ddl.ddlx_grants('pr1','PUBLIC','procedure');