[英]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.