2017-04-27 56 views
0

我需要從另一個表中創建一個表及其在Oracle中另一個模式中的索引和約束。我知道CTAS語法,但它並不需要它的索引和約束。有什麼辦法可以做到嗎?Oracle對象創建和FlashBack

而且是有任何方式回火過程,觸發器或包丟棄後?

回答

0

複製整個Oracle表(結構,內容,指標,constraintes,觸發器等),最簡單的方法是使用Oracle的導出和導入utiilities(EXPDP和IMPDP)。這些是使用您提供的參數在數據庫服務器上運行的命令行實用程序。或者,您可以使用OEM(Oracle企業管理器)爲您運行這些。請注意,它們依賴至少定義一個「邏輯目錄」,其中可以通過導出來讀取「轉儲」文件,並通過導入來讀取「轉儲」文件。

當你想將表從一個模式複製到另一個,或從一個數據庫到另一個數據庫,並保持相同的表名這種方法會奏效。但是,如果您的目標是在同一個模式中創建一個副本表,但名稱不同,那麼過程會變得更加複雜。您仍然可以使用導出,但隨後使用導入而不是直接進行實際導入,您可以使用導入爲您創建一個包含在導出文件中找到的所有SQL命令的文本文件。然後編輯該文本文件以更改需要更改的索引,約束和觸發器名稱,並將這些命令中的表名更改爲新的table_name(但不要更改「create table ...」命令中的表名)。然後將現有表重命名爲其他名稱,並從腳本文件運行「create table ...」命令(使用原始table_name)。接下來,運行import來獲取數據。然後將新表重命名爲您想要的名稱,並將原始表重命名爲其原始名稱。之後,您將手動運行腳本文件中的其他SQL腳本。在進行實際數據導入時,您不希望使用這些觸發器,約束和索引。

+0

謝謝噸的答案!我可以只用expdp/impdp的一個示例語法將具有相同名稱的表從同一個數據庫中的一個模式複製到另一個模式中? –

+0

impdp user/pass schemas = schema1 directory = dumpdir \ remap_schema = schema1:schema2 \ dumpfile = schema1.dmp \ logfile = impdp_schema2.log – MileP

+0

這是一個如何導入架構的示例。更多信息可以在這裏找到:http://dba-oracle.com/t_oracle_expdp_tips.htm。我希望它會幫助你。 – MileP

0

最簡單的方法是把DDL語句像任何其他部分的應用程序代碼,並讓他們在一個源控制庫腳本。

但是,在事件發生後很容易明智。如果你在一個模式是一個免費的防火區域的環境中工作,有多種選擇。

的最好的事情就是用DBMS_METADATA重新創建DDL語句。這些可以保存爲腳本,以其他架構運行,並且 - 關鍵性地 - 存儲在備份的地方,理想的源代碼控制。

要生成所有的表及其相關對象的DDL是相當簡單。該DBMS_METADATA函數返回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(Oracle SQL Developer,PLSQL Developer,TOAD等)都提供了方便的右鍵菜單選項來處理所有這些。