繁体   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