ITPub博客

首页 > 数据库 > 国内数据库 > 【YashanDB 知识库】对比 Oracle 和 YashanDB 对象不一致的方法

【YashanDB 知识库】对比 Oracle 和 YashanDB 对象不一致的方法

原创 国内数据库 作者:崖山数据库系统YashanDB 时间:2025-02-07 17:09:53 0 删除 编辑

“本文内容来自 YashanDB 官网,原文内容请见  https://www.yashandb.com/newsinfo/7323370.html?templateId=171...

前言
通过 YMP 迁移 Oracle 到 YashanDB 对象后,YMP 已经提供了校验功能,推荐使用 YMP 的校验功能。如果需要更复杂的对比方法,可采用本文中的对比思路和方法。

思路
保存 Oracle 的 DBA_* 数据字典视图到某用户的表,然后通过 YMP 传到 YashanDB,最后使用 YashanDB 的 DBeaver 图形界面通过 SQL 来查询不一致。

方法
1、在 Oracle 执行,保存 Oracle 的 DBA_* 数据字典视图到 Oracle 用户的表

create user oracle identified by welcome1;grant dba, resource, connect to oracle; 
create table oracle.dba_objects as select * from sys.dba_objects;create table oracle.dba_tables as select * from sys.dba_tables;create table oracle.dba_indexes as select * from sys.dba_indexes;create table oracle.dba_ind_columns as SELECT INDEX_OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, COLUMN_LENGTH, DESCEND FROM SYS.DBA_IND_COLUMNS;create table oracle.dba_constraints as SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, INDEX_NAME, INDEX_OWNER, R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS, DEFERRABLE, DEFERRED, VALIDATED, GENERATED FROM SYS.DBA_CONSTRAINTS;create table oracle.dba_cons_columns as SELECT OWNER, CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, POSITION FROM SYS.DBA_CONS_COLUMNS; 
create table oracle.dba_types as select * from sys.dba_types;create table oracle.dba_views as SELECT OWNER, VIEW_NAME, TEXT_LENGTH, TEXT_VC FROM SYS.DBA_VIEWS;create table oracle.dba_sequences as select * from sys.dba_sequences;create table oracle.dba_source as select * from sys.dba_source;create table oracle.dba_triggers as SELECT OWNER, TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, TABLE_OWNER, BASE_OBJECT_TYPE, TABLE_NAME, COLUMN_NAME, REFERENCING_NAMES, WHEN_CLAUSE, STATUS, DESCRIPTION, ACTION_TYPE FROM SYS.DBA_TRIGGERS;

2、通过 YMP 将 Oracle 用户下的第一步保存的数据字典信息表同步到 YashanDB 数据库的 Oracle 用户

3、在 YashanDB 执行,保存 SYS 的 DBA_* 数据字典视图到 Yashan 用户的表

create user yashan identified by welcome1;grant dba to yashan; 
create table yashan.dba_objects as select * from sys.dba_objects;create table yashan.dba_tables as select * from sys.dba_tables;create table yashan.dba_indexes as select * from sys.dba_indexes;create table yashan.dba_ind_columns as SELECT INDEX_OWNER, INDEX_NAME, TABLE_OWNER, TABLE_NAME, COLUMN_NAME, COLUMN_POSITION, COLUMN_LENGTH, DESCEND FROM SYS.DBA_IND_COLUMNS;create table yashan.dba_constraints as SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, INDEX_NAME, INDEX_OWNER, R_OWNER, R_CONSTRAINT_NAME, DELETE_RULE, STATUS, DEFERRABLE, DEFERRED, VALIDATED, GENERATED FROM SYS.DBA_CONSTRAINTS;create table yashan.dba_cons_columns as SELECT OWNER, CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME, POSITION FROM SYS.DBA_CONS_COLUMNS; 
create table yashan.dba_types as select * from sys.dba_types;create table yashan.dba_views as SELECT OWNER, VIEW_NAME, TEXT_LENGTH, TEXT FROM SYS.DBA_VIEWS;create table yashan.dba_sequences as select * from sys.dba_sequences;create table yashan.dba_source as select * from sys.dba_source;create table yashan.dba_triggers as SELECT OWNER, TRIGGER_NAME, TRIGGER_TYPE, TRIGGERING_EVENT, TABLE_OWNER, BASE_OBJECT_TYPE, TABLE_NAME, COLUMN_NAME, REFERENCING_NAMES, WHEN_CLAUSE, STATUS, DESCRIPTION, ACTION_TYPE FROM SYS.DBA_TRIGGERS;

4、利用数据库能力,直接对比 Oracle 用户和 YashanDB 用户的差异。以下只是参考 SQL,请根据需要更改以下 SQL:
1)查询视图差异

SELECT
        object_type,
        owner,
        object_name,
        o_status,
        y_statusFROM
        (        SELECT
                nvl(o.object_type, y.object_type) object_type,
                nvl(o.owner, y.owner) owner,
                nvl(o.object_name, y.object_name) object_name,
                o.status o_status,
                y.status y_status        FROM
                (                SELECT
                        object_type,
                        owner,
                        object_name,                        status
                FROM
                        oracle.DBA_OBJECTS                WHERE
                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                        AND OBJECT_TYPE = 'VIEW') o        FULL OUTER JOIN
        (                SELECT
                        object_type,
                        owner,
                        object_name,                        status
                FROM
                        yashan.DBA_OBJECTS                WHERE
                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                                AND OBJECT_TYPE = 'VIEW') yON
                o.object_type = y.object_type                AND o.owner = y.owner                AND o.object_name = y.object_name        ORDER BY
                o.object_type,
                o.owner,
                o.object_name
)WHERE
        nvl(o_status, 'NOT_EXISTS_IN_ORACLE') != nvl(y_status, 'NOT_EXISTS_IN_YASHAN')
;

2)查询 PROCEDURE 差异

SELECT
        object_type,
        owner,
        object_name,
        o_status,
        y_statusFROM
        (        SELECT
                nvl(o.object_type, y.object_type) object_type,
                nvl(o.owner, y.owner) owner,
                nvl(o.object_name, y.object_name) object_name,
                o.status o_status,
                y.status y_status        FROM
                (                SELECT
                        object_type,
                        owner,
                        object_name,                        status
                FROM
                        oracle.DBA_OBJECTS                WHERE
                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                        AND OBJECT_TYPE = 'PROCEDURE') o        FULL OUTER JOIN
        (                SELECT
                        object_type,
                        owner,
                        object_name,                        status
                FROM
                        yashan.DBA_OBJECTS                WHERE
                        OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                                AND OBJECT_TYPE = 'PROCUDURE') yON
                o.object_type = y.object_type                AND o.owner = y.owner                AND o.object_name = y.object_name        ORDER BY
                o.object_type,
                o.owner,
                o.object_name
)WHERE
        nvl(o_status, 'NOT_EXISTS_IN_ORACLE') != nvl(y_status, 'NOT_EXISTS_IN_YASHAN')

3)查询 INDEX 差异

SELECT
        TABLE_OWNER,
        TABLE_NAME,
        o_index_colum_list,
        y_index_colum_listFROM
        (        SELECT
                nvl(o.TABLE_OWNER, y.TABLE_OWNER) TABLE_OWNER,
                nvl(o.TABLE_NAME, y.TABLE_NAME) TABLE_NAME,
                o.index_colum_list o_index_colum_list,
                y.index_colum_list y_index_colum_list        FROM
                (                SELECT
                        TABLE_OWNER,
                        TABLE_NAME,                        LISTAGG(COLUMN_NAME, ',') WITHIN GROUP(                ORDER BY
                        COLUMN_POSITION) index_colum_list                FROM
                        oracle.DBA_IND_COLUMNS                WHERE
                        TABLE_OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                GROUP BY
                        TABLE_OWNER,
                        TABLE_NAME) o        FULL OUTER JOIN(                SELECT
                        TABLE_OWNER,
                        TABLE_NAME,                        LISTAGG(COLUMN_NAME, ',') WITHIN GROUP(                ORDER BY
                        COLUMN_POSITION) index_colum_list                FROM
                        yashan.DBA_IND_COLUMNS                WHERE
                        TABLE_OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                GROUP BY
                        TABLE_OWNER,
                        TABLE_NAME) yON
                o.TABLE_OWNER = y.TABLE_OWNER                AND o.TABLE_NAME = y.TABLE_NAME        ORDER BY
                1,                2)WHERE
        nvl(o_index_colum_list, 'NOT_EXISTS_IN_ORACLE') != nvl(y_index_colum_list, 'NOT_EXISTS_IN_YASHAN')
;

4)查询约束差异

SELECT
        OWENR,
        TABLE_NAME,
        CONSTRAINT_TYPE,
        o_cons_column_list,
        y_cons_column_listFROM
        (        SELECT
                NVL(o.OWNER, y.OWNER) OWENR,
                NVL(o.TABLE_NAME, y.TABLE_NAME) TABLE_NAME,
                NVL(o.CONSTRAINT_TYPE, y.CONSTRAINT_TYPE) CONSTRAINT_TYPE,
                o_cons_column_list,
                y_cons_column_list        FROM
                (                SELECT
                        dc.OWNER,
                        dc.TABLE_NAME,
                        dc.CONSTRAINT_TYPE,
                        dc.CONSTRAINT_NAME,                        listagg(dcc.COLUMN_NAME, ',') WITHIN GROUP(                ORDER BY
                        dcc.POSITION) o_cons_column_list                FROM
                        ORACLE.DBA_CONSTRAINTS dc,
                        oracle.DBA_CONS_COLUMNS dcc                WHERE
                        dc.OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                        AND dc.OWNER = dcc.OWNER                        AND dc.TABLE_NAME = dcc.TABLE_NAME                        AND dc.CONSTRAINT_NAME = dcc.CONSTRAINT_NAME                GROUP BY
                        dc.OWNER,
                        dc.TABLE_NAME,
                        dc.CONSTRAINT_TYPE,
                        dc.CONSTRAINT_NAME) o        FULL OUTER JOIN(                SELECT
                        dc.OWNER,
                        dc.TABLE_NAME,
                        dc.CONSTRAINT_TYPE,
                        dc.CONSTRAINT_NAME,                        listagg(dcc.COLUMN_NAME, ',') WITHIN GROUP(                ORDER BY
                        dcc.POSITION) y_cons_column_list                FROM
                        ORACLE.DBA_CONSTRAINTS dc,
                        oracle.DBA_CONS_COLUMNS dcc                WHERE
                        dc.OWNER IN ('HR', 'OE', 'SH', 'BI', 'PM', 'IX')                                AND dc.OWNER = dcc.OWNER                                AND dc.TABLE_NAME = dcc.TABLE_NAME                                AND dc.CONSTRAINT_NAME = dcc.CONSTRAINT_NAME                        GROUP BY
                                dc.OWNER,
                                dc.TABLE_NAME,
                                dc.CONSTRAINT_TYPE,
                                dc.CONSTRAINT_NAME) yON
                o.OWNER = y.OWNER                AND o.TABLE_NAME = y.TABLE_NAME                AND o.CONSTRAINT_TYPE = y.CONSTRAINT_TYPE                AND o.o_cons_column_list = y.y_cons_column_list
)WHERE
        nvl(o_cons_column_list, 'NOT_EXISTS_IN_ORACLE') != nvl(y_cons_column_list, 'NOT_EXISTS_IN_YASHAN')
;


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70028812/viewspace-3071348/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
崖山数据库系统YashanDB是深圳计算科学研究院完全自主研发设计的新型数据库系统,融入原创理论,支持单机/主备、共享集群、分布式等多种部署方式,覆盖OLTP/HTAP/OLAP交易和分析混合负载场景,为客户提供一站式的企业级融合数据管理解决方案。

注册时间:2023-04-11

  • 博文量
    722
  • 访问量
    639957