当前位置:   article > 正文

pg 出现视图依赖表,导致字段不能修改_cannot alter type of a column used by a view or ru

cannot alter type of a column used by a view or rule

昨天接到需求,要修改一个使用已久的的表的字段长度,现有字段长度不能满足需求。

直接使用以下语句会出现报错:

  1. ERROR: cannot alter type of a column used by a view or rule.
  2. rule _RETURN on view 相关依赖视图 depends on column "字段名
  3. 执行sql
  4. alter table tbname alter COLUMN 字段名 type varchar(500) ;

找了几个大佬博客,有大佬做出相关方案,做个整理。

1.只修改字段长度 修改 pg_attribute

通过修改 pg_attribute 基表的方式来绕开这个限制

pg_attribute (详情)

  1. #通过表名查出attrelid
  2. SELECT relname, attname,attnum,attrelid,attname FROM pg_class c,pg_attribute attr WHERE relname = '表名' AND c.oid = attr.attrelid;
  3. #修改字段长度
  4. update pg_attribute set atttypmod =34 WHERE attrelid ='a'::regclass AND attname = '字段名';
  5. #查询修改后长度
  6. SELECT atttypmod FROM pg_attribute WHERE attrelid = '3648177'::regclass AND attname = '字段名';

2.修改字段类型

修改字段类型这种情况多见于执行SQL缓慢,通过执行计划发现是字段类型不匹配产生了隐式在转换,而无法使用上索引。

这种情况就得通过我们之前的方法来实现,把删除视图、修改字段、创建视图放到一个事务下执行,但是如果嵌套的视图比较多就很麻烦。为了克服这个麻烦,就有一个大神级人物写了两个函数来轻松实现了这个问题。由于太多人受到这个“烦恼”问题的困扰,作者得到了极高的赞扬。

BEGIN;

select deps_save_and_drop_dependencies('public', 'a');

alter table a alter name type varchar(30);

select deps_restore_dependencies('public', 'a');

COMMIT

以下是我在自己环境中进行的测试,非常简单就搞定了。

函数可以在github上下载:

https://gist.github.com/mateuszwenus/11187288(PG12之前版本)

https://gist.github.com/briandignan/03ef42e78434658cf27f052e2f0798e8(PG12之后的版本)

如果让我推荐,我还是推荐使用第二种方法,毕竟这个方法比较稳妥一点。也基本上达到了比较完美的地步。就算遇到上百个视图或者像俄罗斯套娃一样的视图你也不用担心了。
 

详情参见原文链接:https://blog.csdn.net/weixin_42367233/article/details/112658042

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/755149
推荐阅读
相关标签
  

闽ICP备14008679号