首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle对象创建和FlashBack

Oracle对象创建和FlashBack
EN

Stack Overflow用户
提问于 2017-04-27 19:08:29
回答 2查看 108关注 0票数 0

我需要从Oracle的另一个模式中的另一个表以及它的索引和约束中创建一个表。我知道CTAS语法,但它不带索引和约束。有什么办法可以做到吗?

另外,有没有办法在删除后闪回过程、触发器或包?

EN

回答 2

Stack Overflow用户

发布于 2017-04-27 19:13:19

复制整个Oracle表(结构、内容、索引、约束、触发器等)的最简单方法是使用Oracle的导出和导入实用程序(expdp和impdp)。这些是使用您提供的参数在数据库服务器上运行的命令行实用程序。或者,您可以使用OEM (Oracle Enterprise Manager)为您运行这些工具。*请注意,它们依赖于至少定义了一个“逻辑目录”,其中“转储”文件可以通过导出写入和通过导入读取。

当您想要将表从一个模式复制到另一个模式,或从一个数据库复制到另一个数据库,并保持相同的表名时,这种方法非常有效。但是,如果您的目标是在相同的模式中创建一个复制表,但是使用不同的名称,那么这个过程就会变得更加复杂。您仍然可以使用export,但是使用import而不是直接执行实际导入时,您可以让import为您创建一个文本文件,其中包含它在导出文件中找到的所有SQL命令。然后编辑该文本文件以更改需要更改的索引、约束和触发器名称,并将这些命令中的表名更改为新的table_name (但不要更改"create table...“中的表名)。命令)。然后将现有表重命名为其他名称,并只运行"create table ...“命令(具有原始table_name)从脚本文件中。接下来,运行import以仅获取数据。然后将新表重命名为所需的名称,并将原始表重命名为其原始名称。然后,手动运行脚本文件中的其他SQL脚本。在进行实际的数据导入时,您不希望这些触发器、约束和索引存在。

票数 0
EN

Stack Overflow用户

发布于 2017-04-27 20:04:21

最简单的方法是像对待任何其他应用程序代码一样对待DDL语句,并将它们作为脚本保存在源代码控制存储库中。

然而,事后很容易变得明智。如果您工作的环境中的模式有点像是一个自由的火区,那么有多种选择。

最好的方法是使用DBMS_METADATA重新创建DDL语句。这些可以保存为脚本,在其他模式中运行,并且-至关重要的是-存储在某个地方,该位置得到备份,理想情况下是源代码控制。

生成表及其依赖对象的所有DDL是相当简单的。DBMS_METADATA函数返回clobs,这并不理想,但足够简单,可以在SQL*Plus中假脱机:

代码语言:javascript
复制
SQL> set long 10000 
SQL> set heading off
SQL> spool create_tab_t23.sql
SQL> select dbms_metadata.get_ddl('TABLE', 'T23') from dual;
SQL> select dbms_metadata.get_dependent_ddl('INDEX', 'T23') from dual;
SQL> select dbms_metadata.get_dependent_ddl('TRIGGER', 'T23') from dual; 
SQL> spool off

必须指定单个对象类型,这有点让人反胃。幸运的是,大多数IDE (Oracle SQL Developer、PLSQL Developer、TOAD等)都提供了方便的右键菜单选项来为我们处理所有这些问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43656057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档