簡體   English   中英

在 Postgres 中更改表以更改列類型的骯臟方法

[英]Dirty way to alter table to change column type in Postgres

我有一個大表(幾百萬條記錄)的情況,我需要將一個列數據類型從varchar (250)更新為text 但是這里有個竅門,基於這個表創建了多個視圖,這些視圖也用於一些其他視圖和一些程序,所以刪除級聯並只是簡單地重新創建它不是一種選擇。 還有其他棘手/骯臟的方法來改變它嗎?

主要問題:

  1. 多久可以進行維護。
  2. 這張桌子占用多少空間? 表空間還剩下多少可用空間?

-- 要獲取相關功能/程序的列表,請使用以下內容:

SELECT n.nspname, p.proname, p.prosrc
FROM pg_proc p 
LEFT JOIN pg_namespace n ON n.oid = p.pronamespace 
WHERE p.prosrc ilike '%Table_xxx%';

--你也可以在pgAdmin中檢查對象依賴

--要獲取依賴視圖的列表,請使用以下內容:

SELECT table_schema, table_name, pg_get_viewdef(table_schema||'.'||table_name, true)
FROM information_schema.tables 
WHERE table_type = 'VIEW'
AND pg_get_viewdef(table_schema||'.'||table_name, true) ilike '%Table_xxx%';

--所以現在你有了一個依賴對象的列表。 您可以測試您的更新。

--不要忘記DCL(你需要測試它或者只使用pgAdmin):

SELECT 'GRANT '||privilege_type||' ON '||table_schema||'.'||table_name||' TO '||grantee||';'
FROM information_schema.role_table_grants 
WHERE table_name='Table_xxx';

- 下一步。 (如果你有足夠的維護時間:)

--在單筆交易中:

--drop 依賴對象

--更改列類型

ALTER TABLE Table_xxx ALTER COLUMN c_xxx TYPE 文本;

--重新創建依賴對象

--恢復DCL

- 下一步。 (如果您需要修改很多列並且您有足夠的空間和時間)您可以:

--創建臨時轉換表:

--停止您的 ETL 進程。

--在單筆交易中:

--進行轉換:

-- 刪除依賴對象

CREATE TABLE Table_xxx_tmp AS SELECT c_1, c_xxx::text, c_n FROM Table_xxx;

-- 替換表:

ALTER TABLE TABLE Table_xxx rename to Table_xxx_old;
ALTER TABLE TABLE Table_xxx_tmp rename to Table_xxx;

--重新創建依賴對象(+觸發器等)

--4次恢復DCL

--啟動您的 ETL 流程。

——但這里的主要內容:用你的頭腦思考。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM