【问题标题】:Deep Clone tables from Remote Oracle to Local Oracle XE with schemas使用模式从远程 Oracle 深度克隆表到本地 Oracle XE
【发布时间】:2021-11-20 08:28:09
【问题描述】:

我当前的任务涉及从远程 (Prod) Oracle DB 到我的本地 (Dev) XE Db(包括数据),并且 - 如果可能的话 - 甚至将它们全部作为我可以执行的一个脚本或文件(如果需要,我希望他们接受一个已编译的程序)。

我知道create table <name> as select * from <name>@<link> 和等效的插入,这可能是复制数据的最佳选择,但不是定义

我四处搜索并偶然发现了 dbms_metadata.get_ddl() 这有点帮助,但我还没有弄清楚如何使用它连接到远程数据库,也没有找到如何从其他架构。

我总共有 3 个模式(我的应用程序的主要模式(我们将称为“MY”,公司的基础数据(我们将称为“COMP”和同事的相关应用程序(我们将称为"COLL"))

我尝试了here 的脚本,看起来很有希望,但正如我所说,我还没有弄清楚如何连接到远程和不同的模式(公司是最难的,因为我不知道'不知道能不能登录,只有select权限

SELECT DBMS_METADATA.GET_DDL('TABLE', table_name, owner)
FROM all_tables WHERE owner = UPPER('&1');

当我用不同的所有者尝试 get_ddl 时,sql 开发人员给了我错误:

“在模式 %s 中找不到 TABLE 类型的对象 %s”,其中第一个 %s 是 (第二个 %s) 模式 (COMP) 中的第一个表

【问题讨论】:

标签: sql oracle oracle11g


【解决方案1】:

Dbms_metadata 是不错的选择。但是为了将它与 dblink 一起使用,您必须编写更多代码。 首先你的远程用户(dblinku 用户)应该有 select_catalog_role。

以下示例不是完整的解决方案,它应该仅适用于每个请求的对象。欲了解更多详情,请参阅 dbms_metadata 手册。

Declare 
    h1      NUMBER;   
    table_name varchar2(100) :='table_name';
    from_schema varchar2(100) :='schema_name';
    db_link  varchar2(100) :='db_link_name';
    xml     CLOB;          
    begin
    h1 := DBMS_METADATA.OPEN('TABLE',network_link => db_link ); --open context with db link name. 
    DBMS_METADATA.SET_FILTER(h1,'NAME',table_name);
    DBMS_METADATA.SET_FILTER(h1,'SCHEMA',from_schema);
    xml := DBMS_METADATA.FETCH_CLOB(h1);
     DBMS_OUTPUT.PUT_LINE(h1);
    IF xml IS not NULL THEN 
       DBMS_OUTPUT.PUT_LINE(xml);
      END IF;
    DBMS_METADATA.CLOSE(h1);
    end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多