2016-05-19 47 views
0

我正在爲redshift中的所有表格添加distkey/sortkey並希望自動執行此操作。我正在做以下幾點:如何在深度複製表格時遷移依賴視圖

ALTER TABLE table RENAME TO tmp_table; 
CREATE TABLE table 
distkey(id) 
sortkey(id) 
AS 
select * from tmp_table; 
DROP TABLE tmp_table; 

這很好,除了視圖沒有被遷移。當你使用ALTER TABLE時,現有的視圖會指向tmp_table。理想情況下,我想按照之前的方式恢復視圖,可能在同一個查詢事務中或作爲腳本的一部分。

+0

注意,CREATE TABLE ..一樣不保留NOT NULL設置。新表中的所有列將被創建爲NULL。另外我的猜測是列編碼/壓縮設置將不會被保留。 – jhncz

回答

0

在遷移過程:

  1. 對於每個視圖下執行:

    select definition from pg_views where viewname = 'my_view'; 
    
  2. 和存儲所有結果。

  3. 執行所有的觀點:

    drop view 'my_view'; // or rename only to have a rollback option 
    
  4. 改變你的表

  5. 執行步驟獲得的創建視圖命令2

+0

我結束了CREATE OR REPLACE VIEW而不是刪除視圖並重新創建它。有沒有辦法從pg_views替換選擇定義,其中viewname ='my_view';有什麼可以找到依賴於表的所有視圖的名稱?現在我正在從pg_views中進行選擇定義,其中像'%table%'這樣的定義。我正在看一些涉及pg_depend類的東西,但沒有弄清楚。 – bugzpodder

+0

你將如何做權限和評論? pgAdmin III在這方面做得很好。 – PhilHibbs

0

只需放下並重新創建視圖即可。這可能是腳本的一部分。

視圖可能不構成交易的一部分,因此可能需要進行一些測試。

+0

感謝您的回覆。如果我只知道視圖名稱,可以詳細說明如何重新創建另一個視圖?例如上面的CREATE TABLE AS示例,您不需要指定所有列,是否有重新創建視圖的方法,而不會混淆並挖掘實際查詢的內容? – bugzpodder

+0

你可以嘗試使用'psql'連接,然後看到:[如何在PostgreSQL中查看CREATE VIEW代碼以查看視圖?](https://stackoverflow.com/questions/14634322/how-to-see-the-創建視圖代碼的一個查看在Postgresql) –