暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 作为数据迁移的一部分,如何比较同一服务器中两种不同模式中的表

ASKTOM 2020-08-19
255

问题描述

团队:

我们使用的数据库版本:

甲骨文数据库11g版本11.2.0.4.0-64位生产

以下是示例表生成脚本,以供参考:

我有两个名称为USER_A和USER_B的数据库用户,并且在两个数据库用户中都有一个名称为EMP的表。
Create table语句如下所示:
CREATE TABLE user_a.emp
(
empno     NUMBER(4),
ename     VARCHAR2(10 BYTE) DEFAULT 'XYZ',
job       VARCHAR2(9 BYTE),
mgr       NUMBER(4),
hiredate  DATE,
sal       NUMBER(7,2),
comm      NUMBER(7,2),
deptno    NUMBER(2)
);


CREATE TABLE user_b.emp
(
empno     NUMBER(4),
ename     VARCHAR2(10 BYTE) DEFAULT 'XYZ',
job       VARCHAR2(9 BYTE),
mgr       NUMBER(4),
hiredate  DATE,
sal       NUMBER(7,2),
comm      NUMBER(7,2),
dept_name    VARCHAR2(50) DEFAULT 'ACCOUNTING',
dept_location VARCHAR2(50)
);

在进一步观察中,我们看到user_a.emp表具有deptno列,而user_b.emp表没有deptno列。
user_b.emp表具有在user_a.emp表中不存在的dept_name和dept_location列。

要求:

有人可以协助我编写2个alter语句 (动态),其中一个alter语句是生成列名以及数据类型和default_values
它们存在于user_b.emp表中,而不存在于user_a.emp表中。我需要这个alter语句来添加缺少的列。表的大小很小,但是我们的项目迁移表有很多列。

和另一个alter语句生成沿其数据类型和default_values存在于user_a.emp表中而不存在于user_b.emp表中的列名。

这将有助于我使表格保持同步

专家解答

编写一个完全自动化的过程来做到这一点是棘手的,也是有风险的。

例如,用户A有

deptno    NUMBER(2)


而用户B有:

dept_name    VARCHAR2(50) DEFAULT 'ACCOUNTING',
dept_location VARCHAR2(50)


添加dept_name和dept_location时是否应该删除deptno?确实,您希望有人查看这些差异并进行通话。

你可能也想同步所有的约束,索引等。因此,与其尝试自己滚动,不如使用现有工具。

SQL Developer中的数据库差异选项是执行此操作的好方法 (工具-> 数据库差异...)

为每个用户创建一个连接,您可以比较它们。这包括许多如何进行比较的选项,一个很好的差异报告,以及同步它们的脚本。

https://www.thatjeffsmith.com/archive/2012/09/using-database-diff-to-compare-schemas-when-you-dont-have-the-destination-user-password/
https://blogs.oracle.com/oraclemagazine/make-the-easy-move
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论