Oracle对象创建和闪回

Oracle对象创建和闪回,oracle,plsql,ddl,Oracle,Plsql,Ddl,我需要从另一个表创建一个表,并在Oracle的另一个模式中创建它的索引和约束。我知道CTAS语法,但它没有索引和约束。有什么办法吗 还有什么方法可以在删除后闪回过程、触发器或包?复制整个Oracle表(结构、内容、索引、约束、触发器等)的最简单方法是使用Oracle的导出和导入实用程序(expdp和impdp)。这些是使用提供的参数在数据库服务器上运行的命令行实用程序。或者,您可以使用OEM(Oracle Enterprise Manager)为您运行这些。请注意,它们依赖于至少定义了一个“逻辑

我需要从另一个表创建一个表,并在Oracle的另一个模式中创建它的索引和约束。我知道
CTAS
语法,但它没有索引和约束。有什么办法吗


还有什么方法可以在删除后闪回过程、触发器或包?

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


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

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

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

最好的方法是重新创建DDL语句。这些可以保存为脚本,在其他模式中运行,关键是存储在某个可以备份的地方,理想情况下是源代码控制

为一个表及其依赖对象生成所有DDL相当简单。DBMS_元数据函数返回CLOB,这并不理想,但足够简单,可以在SQL*Plus中将其输出:

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(oraclesqldeveloper、plsqldeveloper、TOAD等)都提供了方便的右键单击菜单选项来为我们处理所有这些问题

谢谢你的回答!!!我可以用expdp/impdp的一个示例语法在同一个DB内将具有相同名称的表从一个模式复制到另一个模式吗?impdp user/pass schemas=schema1 directory=dumpdir\remap\u schema=schema1:schema2\dumpfile=schema1.dmp\logfile=impdp\u schema2.log这是一个如何导入模式的示例。更多信息可在此处找到:。我希望它能对您有所帮助。对于导出,将是这样的:expdp user/pass schemas=directory=dumpdir\dumpfile=.dmp\logfile=expdp\uu.log