DBMS_METADATA
功能描述
DBMS_METADATA包提供了一种从数据库字典中检索元数据作为XML或创建DDL并提交XML以重新创建对象的方法。该内置包包含以下模块:
子程序 | 描述 |
---|---|
GET_DDL | 获取创建对象的原数据的DDL语句。 |
GET_DEPENDENT_DDL | 获取授权给某用户的物体的权限的DDL。 |
GET_GRANTED_DDL | 获取用户的授权信息。 |
注意事项
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
子程序语法格式
GET_DDL
语法格式
DBMS_METADATA.GET_DDL (
object_type IN VARCHAR2,
name IN VARCHAR2,
schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL')
RETURN CLOB;
object_type支持如下类型:
table:表。
- 不支持列存表,临时表。
- 不包含指定storage、collate、row movment。
- 列名限制仅支持not null与default number。
- 仅支持分区表中分区列为数字类型。
index:索引。暂不支持显示索引为不可用的DDL。
constraint:主键。当前仅支持4种:primary key、 unique、 foreign 、 check
view:视图。
user:用户。
role:角色。
不支持区分user与role。
tablespace:表空间。
materialized_view:物化视图。
不支持增量物化视图。
dblink:远程连接定义。
trigger:触发器。
sequence:序列。
不支持large sequence,不支持owned。
function:函数。
package:包。
procedure:存储过程。
package_body:包体。
示例
1、创建表空间。
create tablespace space_1103409 relative location 'tablespace/tablespace_1';
2、创建表。
create table tab1_1103409(id int,c1 char(8)) tablespace space_1103409;
3、调用get_ddl。
select DBMS_METADATA.GET_DDL('TABLE','tab1_1103409','public');
返回结果为:
get_ddl
-----------------------------------------------------------------------------------------
create table "public"."tab1_1103409" ("id" int4, "c1" bpchar(8)) with(orientation=row,compression=no,fillfactor=80) tables
pace "space_1103409"
(1 row)
GET_DEPENDENT_DDL
语法格式
DBMS_METADATA.GET_DEPENDENT_DDL (
object_type IN VARCHAR2,
base_object_name IN VARCHAR2,
base_object_schema IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL',
object_count IN NUMBER DEFAULT 10000)
RETURN CLOB;
object_type支持如下类型:
object_grant:检查赋权情况。
当前版本支持对table和sequence赋权情况的检查。
index:索引。仅限用于表类型。
constraint:主键。仅限用于表类型。
示例
1、创建表。
create table tab_1103856(c1 int,c2 int);
2、创建用户。
create user use1_1103856 password 'Aa@123456';
create user use2_1103856 password 'Aa@123456';
create user use3_1103856 password 'Aa@123456';
3、将表的权限赋给public。
grant select,insert,update,delete on table tab_1103856 to public;
4、将表的权限赋予用户。
grant select,insert,update,delete on table tab_1103856 to use1_1103856;
grant truncate,alter,drop,comment,index,vacuum on tab_1103856 to use2_1103856;
grant all on tab_1103856 to use3_1103856 with grant option;
5、调用函数。
select DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT','tab_1103856','public');
返回结果为:
get_dependent_ddl
--------------------------------------------------------------------------------------
grant insert on table "public"."tab_1103856" to "public" +
grant select on table "public"."tab_1103856" to "public" +
grant update on table "public"."tab_1103856" to "public" +
grant delete on table "public"."tab_1103856" to "public" +
grant insert on table "public"."tab_1103856" to "use1_1103856" +
grant select on table "public"."tab_1103856" to "use1_1103856" +
grant update on table "public"."tab_1103856" to "use1_1103856" +
grant delete on table "public"."tab_1103856" to "use1_1103856" +
grant truncate on table "public"."tab_1103856" to "use2_1103856" +
grant alter on table "public"."tab_1103856" to "use2_1103856" +
grant drop on table "public"."tab_1103856" to "use2_1103856" +
grant comment on table "public"."tab_1103856" to "use2_1103856" +
grant index on table "public"."tab_1103856" to "use2_1103856" +
grant vacuum on table "public"."tab_1103856" to "use2_1103856" +
grant insert on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant select on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant update on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant delete on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant truncate on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant references on table "public"."tab_1103856" to "use3_1103856" with grant option+
grant trigger on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant alter on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant drop on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant comment on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant index on table "public"."tab_1103856" to "use3_1103856" with grant option +
grant vacuum on table "public"."tab_1103856" to "use3_1103856" with grant option
(1 row)
GET_GRANTED_DDL
语法格式
DBMS_METADATA.GET_GRANTED_DDL (
object_type IN VARCHAR2,
grantee IN VARCHAR2 DEFAULT NULL,
version IN VARCHAR2 DEFAULT 'COMPATIBLE',
model IN VARCHAR2 DEFAULT 'ORACLE',
transform IN VARCHAR2 DEFAULT 'DDL',
object_count IN NUMBER DEFAULT 10000)
RETURN CLOB;
object_type支持如下类型:
- system_grant:系统权限授予。
object_grant:对象授予。
当前版本object_grant仅支持对SEQUENCE、FUNCTION、PROCEDURE、TABLESPACE、DATABASE五种对象类型 进行赋权情况的检查。
role_grant:角色授予。
示例
1、创建用户。
create user use_1103894 password 'Aa@123456';
create user use1_1103894 password 'Aa@123456';
create user use2_1103894 password 'Aa@123456';
2、创建数据库。
create database db_1103894;
3、赋权用户权限。
grant create on database db_1103894 to use_1103894;
grant alter on database db_1103894 to use_1103894;
grant drop on database db_1103894 to use_1103894;
grant connect on database db_1103894 to use_1103894;
grant temporary on database db_1103894 to use_1103894;
grant temp on database db_1103894 to use_1103894;
grant comment on database db_1103894 to use_1103894;
grant drop on database db_1103894 to use1_1103894;
grant connect on database db_1103894 to use1_1103894;
grant temporary on database db_1103894 to use1_1103894;
grant temp on database db_1103894 to use1_1103894;
grant comment on database db_1103894 to use1_1103894;
grant all on database db_1103894 to use2_1103894 with grant option;
4、调用函数(use_1103894)。
select DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','use_1103894') from dual;
返回结果为:
get_granted_ddl
-----------------------------------------------------
grant all on database "db_1103894" to "use_1103894"
(1 row)
5、调用函数(use1_1103894)。
select DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','use1_1103894') from dual;
返回结果为:
get_granted_ddl
----------------------------------------------------------
grant drop on database "db_1103894" to "use1_1103894" +
grant comment on database "db_1103894" to "use1_1103894"+
grant temp on database "db_1103894" to "use1_1103894" +
grant connect on database "db_1103894" to "use1_1103894"
(1 row)
6、调用函数(use2_1103894)。
select DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','use2_1103894') from dual;
返回结果为:
get_granted_ddl
------------------------------------------------------------------------
grant all on database "db_1103894" to "use2_1103894" with grant option
(1 row)
参数说明
object_type | 对象类型。 |
---|---|
name | 对象名称。 |
schema | 对象架构,默认为 NULL。 |
version | 要提取的元数据版本,默认为'COMPATIBLE'(此参数无实际效果)。 |
model | 要使用的对象模型,默认为'ORACLE'(此参数无实际效果)。 |
transfom | 输出上的转换名称,GET*XML 默认为 NULL,GET*DDL默认为DDL,GET*SXML 默认为 SXML(如果在 GET_DDL中指定为NULL,则会输出XML 格式,同样,在 GET_XML 中指定为DDL,也会输出为 sql语句格式(此参数无实际效果)。 |
base_object_name | 基础对象名称。 |
base_object_schema | 基础对象架构。 |
grantee | 授予的用户,默认为当前用户。 |
object_count | 要返回的最大对象数默认 10000(此参数无实际效果,object_count 无限制)。 |
示例
在存储过程中调用内置包。
1、创建表。
create table tab_1103905(id int,c1 char(8));
2、创建用户。
create user use_1103905 password 'Aa@123456';
3、将表的权限赋予用户。
grant insert,update on table tab_1103905 to use_1103905;
4、创建存储过程。
create or replace procedure pro_1103905(n int)
as
c1 record;
c2 record;
c3 record;
begin
if n>5 then
select DBMS_METADATA.GET_DDL('TABLE','tab_1103905','public') into c1;
select DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT','tab_1103905','public') into c2;
select DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT','use_1103905') into c3;
raise notice '%',c1;
raise notice '%',c2;
raise notice '%',c3;
else
raise notice 'No action!';
end if;
end;
/
5、调用存储过程,入参为6。
call pro_1103905(6);
返回结果为:
NOTICE: ("create table ""public"".""tab_1103905"" (""id"" int4, ""c1"" bpchar(8)) with(orientation=row,compression=no,fillfactor=80) ")
NOTICE: ("grant insert on table ""public"".""tab_1103905"" to ""use_1103905""
grant update on table ""public"".""tab_1103905"" to ""use_1103905""")
NOTICE: ("grant insert on table ""public"".""tab_1103905"" to ""use_1103905""
grant update on table ""public"".""tab_1103905"" to ""use_1103905""")
pro_1103905
-------------
(1 row)
6、调用存储过程,入参为3。
call pro_1103905(3);
返回结果为:
NOTICE: No action!
pro_1103905
-------------
(1 row)