[英]Dirty way to alter table to change column type in Postgres
我有一個大表(幾百萬條記錄)的情況,我需要將一個列數據類型從varchar (250)更新為text 。 但是這里有個竅門,基於這個表創建了多個視圖,這些視圖也用於一些其他視圖和一些程序,所以刪除級聯並只是簡單地重新創建它不是一種選擇。 還有其他棘手/骯臟的方法來改變它嗎?
主要問題:
-- 要獲取相關功能/程序的列表,請使用以下內容:
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.