注册
实用的达梦数据库常用对象定义的批量获取脚本
专栏/数据追梦之路/ 文章详情 /

实用的达梦数据库常用对象定义的批量获取脚本

Tomliu 2026/05/12 103 0 0
摘要 运维工作中总会越到这样的需求场景,怎么批量获取对象定义,批量来检索定义中特殊内容或者批量复制定义到其他环境中运行,就是需要用SQL的方式来处理,怎么解?

达梦数据库提供了各类对象定义的查看函数,这里废话不多说,上干货。

表对象定义

单个对象查看

--方式一:
SQL> sp_tabledef('SYSDBA','TEST');
--方式二:
SQL> SELECT dbms_metadata.get_ddl('TABLE','TEST','SYSDBA');

批量查看

BEGIN
    EXECUTE IMMEDIATE 'DROP   TABLE IF EXISTS CHAR_TAB';
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE CHAR_TAB(C1 VARCHAR) ON COMMIT PRESERVE ROWS';
    FOR I IN (SELECT OBJECT_NAME 
       FROM ALL_OBJECTS 
      WHERE OWNER='SYSDBA' 
        AND OBJECT_TYPE='TABLE') 
    LOOP
        EXECUTE IMMEDIATE 'INSERT INTO CHAR_TAB SELECT TO_CHAR(DBMS_METADATA.GET_DDL(''TABLE'','''||I.OBJECT_NAME||''',''SYSDBA''));';
    END LOOP;
END;
SELECT * FROM CHAR_TAB;

索引对象

单个查看

--方式一:创建索引后,可以通过 INDEXDEF 系统函数查看索引的定义。 
INDEXDEF(INDEX_ID int, PREFLAG int); 
--INDEX_ID 为索引 ID,PREFLAG 表示返回信息中是否增加模式名前缀。
--索引ID查看方法
select name,id,subtype$ from sysobjects where subtype$='INDEX' and name='IND_EMP_DEP';
--方式二:使用DBMS_METADATA.GET_DDL查看索引DDL
---如果是全文索引,请将TYPE值调整为CONTEXT_INDEX
SELECT DBMS_METADATA.GET_DDL('INDEX','INDEX_NAME','SCHEMA');

批量查看

---如果是全文索引,请将TYPE值调整为CONTEXT_INDEX
BEGIN
    EXECUTE IMMEDIATE 'DROP   TABLE IF EXISTS CHAR_TAB';
    EXECUTE IMMEDIATE 'CREATE GLOBAL TEMPORARY TABLE CHAR_TAB(C1 TEXT) ON COMMIT PRESERVE ROWS';
        FOR I IN (select OBJECT_NAME from "SYS"."ALL_OBJECTS" where owner='SYSDBA' AND OBJECT_TYPE='INDEX' and "OBJECT_NAME" not like 'INDEX33%') 
    LOOP
        EXECUTE IMMEDIATE 'INSERT INTO CHAR_TAB SELECT TO_CHAR(DBMS_METADATA.GET_DDL(''INDEX'','''||I.OBJECT_NAME||''',''SYSDBA''));';
    END LOOP;
END;

SELECT TO_CHAR(C1) FROM CHAR_TAB;

DROP   TABLE IF EXISTS CHAR_TAB;

其他对象

看到这里其实大家会发现DBMS_METADATA.GET_DDL方法会比较通用(完整语法参考《DM8系统包使用手册》),不同类型对象只需要调整TYPE类型,如TABLE、INDEX、VIEW、SEQUENCE、MATERIALIZED_VIEW、MATERIALIZED_VIEW_LOG等即可实现对特定某类对象的定义获取,结合前面2个获取批量定义的语句块,就能轻松实现数据库对象定义的批量获取。
当然其他对象也是有专用的内置函数来获取,比如CONTEXT_INDEX_DEF --全文索引
SEQDEF --序列
INDEXDEF --索引
CONSDEF --约束
CHECKDEF --检查
1、获取对象ID

select name,id,subtype$ from sysobjects where subtype$='对象类型' and name='对象名';

2、查看ddl(xxxDEF换成具体获取ddl函数如INDEXDEF、CONSDEF等)

select xxxDEF(id,1)
评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服