我需要在另一个表中创建一个表以及它在Oracle中另一个模式中的索引和约束。我知道CTAS
语法,但它没有采用索引和约束。有没有办法做到这一点?
还有什么方法可以在删除后闪回程序,触发器或包?
答案 0 :(得分:0)
复制整个Oracle表(结构,内容,索引,约束,触发器等)的最简单方法是使用Oracle的导出和导入功能(expdp和impdp)。这些是您使用您提供的参数在数据库服务器上运行的命令行实用程序。或者,您可以使用OEM(Oracle Enterprise Manager)为您运行这些服务。请注意,它们依赖于至少定义一个“逻辑目录”,其中“dump”文件可以通过导出写入并通过导入读取。
如果要将表从一个模式复制到另一个模式,或从一个数据库复制到另一个数据库,并保持相同的表名,则此方法可以正常工作。但是,如果您的目标是在同一模式中创建一个副本表,但名称不同,则该过程会变得更加复杂。您仍然可以使用导出,但是然后使用导入而不是直接执行实际导入,您可以导入为您创建一个文本文件,其中包含它在导出文件中找到的所有SQL命令。然后编辑该文本文件以更改需要更改的索引,约束和触发器名称,并将这些命令中的表名更改为新的table_name(但不要更改“create table ...”命令中的表名称)。然后将现有表重命名为其他表,并从脚本文件中仅运行“create table ...”命令(使用原始table_name)。接下来,运行import以获取数据。然后将新表重命名为您希望它具有的名称,并将原始表重命名为其原始名称。之后,您从脚本文件手动运行其他SQL脚本。在执行实际数据导入时,您不希望使用这些触发器,约束和索引。
答案 1 :(得分:0)
最简单的方法是像处理任何其他应用程序代码一样处理DDL语句,并将它们作为脚本保存在源代码控制存储库中。
然而,事件发生后很容易明智。如果您在架构有点自由火区的环境中工作,则有多种选择。
最好的方法是使用DBMS_METADATA重新创建DDL语句。这些可以保存为脚本,在其他模式中运行,并且 - 至关重要 - 存储在备份的地方,理想情况下是源代码控制。
为表生成所有DDL及其依赖对象相当简单。 DBMS_METADATA函数返回clobs,这不是理想的,但足够简单,可以在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(Oracle SQL Developer,PLSQL Developer,TOAD等)提供了方便的右键单击菜单选项来为我们处理所有这些。