2013-11-28 34 views
2

決定在集羣中將多個現有表格連接在一起。在保留現有觸發器的情況下重命名錶格

這顯然意味着需要重新創建表以便它們可以聚集在一起,但是應該保留現有的數據。

當然,我假設程序是沿着線的東西:在一個不同的名字

  • 備份現有的表(通過重命名或東西)
  • 在舊的名字創建一個新的聚集表
  • 從備份表複製所有數據到新創建的一個

但是當前表分配了相當多的觸發器(並糾正我,如果我這裏錯了,但)當我將在該表上執行重命名操作時,我假設所有按照便利順序分配給它的觸發器都會重構它們以匹配新名稱。

在這種情況下,完美的場景可能是因爲觸發器在被重命名後暫時將它們自己從表中「分離」出來(仍指向那個時候不存在的舊錶名),然後將當新創建的聚簇表出現時再次起作用。

但是我不確定這是否可能。

所以這裏的問題是:重命名錶時,我可以保留觸發器,還是我應該手動處理它們?

+0

難道你不能只複製舊錶作爲備份,然後改變現有的表,改變後複製舊的數據? – Armunin

回答

2

是的你是正確的:當你重命名一個表時,它的關聯觸發器仍然會引用同一個表。 (注意觸發器名稱本身不會被重命名)。

我有這個問題,所以我寫了一個腳本,利用DMBS_METADATA.GET_DDL來提取表的觸發器代碼。這個過程是:

對於每個表T

  1. 對於每個觸發器,約束,檢查約束,上 T提取物非PK索引使用DMBS_METADATA.GET_DDL
  2. 表重命名TOLD_TABLE_NAME
  3. 到DDL
  4. 創建新表(如果要遷移 數據,可以使用CTAS)
  5. 刪除(或重命名)a LL觸發器,約束,索引從提取DDL OLD_TABLE_NAME
  6. 運行並重新創建觸發器,約束,對新 表索引
+0

謝謝,我可能不得不建立一個這樣的腳本。 另一件需要注意的是,如果我爲表創建視圖並將觸發器移動到視圖而不是表,我可以重命名錶並且視圖不會跟隨,觸發器將與現在重命名的表分離。 之後,當我使用與舊的名稱相同的名稱創建一個新表格時,該視圖將與觸發器一起對齊。 –

2

的觸發器不按名稱,只有創建它們做了DDL引用表。它們引用表格的內部標識符,因此當您重命名錶格時,觸發器根本不會改變。但是,如果您從數據庫反向設計觸發器的DDL,代碼當然會引用表的新名稱。如果觸發器中的代碼專門引用表名,則不會更改,但希望不是這種情況。

所以當然觸發器不能從表中的關聯,而你能做的最好的是出口的DDL觸發器,索引權限等。

同樣索引不直接引用的表名。

這聽起來像是一個潛在的問題,因爲這會讓你重新運行授予權限所需的腳本,創建索引,應用觸發器等重命名錶並刪除關聯後所需的腳本架構項目。

相關問題