【问题标题】:Changing Schema Name to higher environments将架构名称更改为更高的环境
【发布时间】:2014-08-28 13:48:03
【问题描述】:

我在 Oracle 数据库中的开发环境中有一个架构。

在我的开发环境中,我的模式名称是 prabhu_order。因此,当我让 ddl 推广上层环境时,它会以 prabhu_order.table1、prabhu_order.table2... 等形式出现

在我所有的高级环境中,它只是 ORDER。

现在我正在使用 ctrl replace 来更改架构名称。当我有 50 个 ddls 时,我害怕这样做......

请给我一个更改架构名称的方法!

【问题讨论】:

  • 你是如何获得 DDL 和 dbms_metadata 的?
  • 是的,使用 metadata.get_DDL
  • replace('prabhu_order.', 'order.')?
  • 替换以外的任何其他方式

标签: sql oracle plsql


【解决方案1】:

Ben 使用 replace 的建议似乎很明智,但如果您出于某种原因不想这样做,您可以通过编程方式进行 - 只是需要更多的工作和更多的代码。

由于您使用dbms_metadata 包来提取DDL,您可以使用set_remap_param 过程来修改DDL 的呈现方式;但它不像set_transform_param 那样用于临时查询那么简单,因为它似乎不适用于默认会话句柄。其中一个选项是REMAP_SCHEMA,因此您可以在提取 DDL 时更改架构,就像使用数据泵一样。

如果我创建一个虚拟表,在会话级别设置一些简单的转换,然后调用 get_ddl 我得到:

create table t42(id number);

begin
  dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
    name => 'PRETTY', value => FALSE);
  dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
    name => 'SEGMENT_ATTRIBUTES', value => FALSE);
  dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
    name => 'STORAGE', value => FALSE);
  dbms_metadata.set_transform_param(
    transform_handle => DBMS_METADATA.SESSION_TRANSFORM,
    name => 'SQLTERMINATOR', value => TRUE);
end;
/

select dbms_metadata.get_ddl('TABLE', 'T42') from dual;

DBMS_METADATA.GET_DDL('TABLE','T42')                                           
--------------------------------------------------------------------------------

  CREATE TABLE "STACKOVERFLOW"."T42" ("ID" NUMBER) ;     

这显然有我的架构,STACKOVERFLOW。使用 PL/SQL 块,我可以将其重新映射到 order,并且我正在使用 SQL*Plus VARIABLE 来检索和显示文本:

variable c clob

declare
  l_handle number;
  l_transform_handle number;
begin
  l_handle := dbms_metadata.open(object_type => 'TABLE');

  -- identify the object you want
  dbms_metadata.set_filter(l_handle, 'SCHEMA', USER);
  dbms_metadata.set_filter(l_handle, 'NAME', 'T42');

  -- set up a MODIFY transform and apply REMAP_SCHEMA to it
  l_transform_handle := dbms_metadata.add_transform(handle => l_handle,
    name => 'MODIFY');
  dbms_metadata.set_remap_param(transform_handle => l_transform_handle,
    name => 'REMAP_SCHEMA', old_value => USER, new_value => 'ORDER');
  -- switch back from XML to DDL
  l_transform_handle := dbms_metadata.add_transform(l_handle, 'DDL');

  -- set other 'pretty' transforms, to taste
  dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
    name => 'PRETTY', value => FALSE);
  dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
    name => 'SEGMENT_ATTRIBUTES', value => FALSE);
  dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
    name => 'STORAGE', value => FALSE);
  dbms_metadata.set_transform_param(transform_handle => l_transform_handle,
    name => 'SQLTERMINATOR', value => TRUE);

  :c := dbms_metadata.fetch_clob(handle => l_handle);
  dbms_metadata.close(l_handle);
end;
/

所以现在c 变量保存了 DDL:

print c

C
---------------------------------------------

  CREATE TABLE "ORDER"."T42" ("ID" NUMBER) ;

除了使用匿名块和 SQL*Plus 变量之外,您还可以将其转换为一个函数,该函数接受对象类型和对象名称并将 DDL 作为 CLOB 返回。

您可能更喜欢根本不指定架构,如果将其放入源代码控制中,或者可能在其他环境中使用,这将更加有用。为此,只需将 null 作为新架构传递:

  dbms_metadata.set_remap_param(transform_handle => l_transform_handle,
    name => 'REMAP_SCHEMA', old_value => USER, new_value => null);

C
-------------------------------------

  CREATE TABLE "T42" ("ID" NUMBER) ;

【讨论】:

  • This discussion 可能是我以前见过这种方法的地方。并且还显示了一个函数版本。
  • 非常感谢,亚历克斯!!同意鲍勃的替换,但我遇到了一些问题。好吧,这有点冗长,但我觉得没有风险..再次感谢。 Stakeoverflow 确实是一个学习和成长的平台。继续努力:-)
猜你喜欢
  • 2013-09-14
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 2017-12-16
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多