暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MogDB基于依赖规则限制无法对存在视图的表DDL的问题解决

BBK 2024-08-16
58

[[toc]]

适用范围

MogDB5.0.+

问题概述

数据库中对象表上存在视图时,业务需要对表结构进行维护时报错:

ERROR:  cannot alter type of a column used by a view or rule
DETAIL:  rule _RETURN on view v_test_view_table_ddl depends on column "name"
复制

此报错内容适于物所有版本MogDB。

解决方案

MogDB5.0.1始新增加特性
支持视图与其依赖项解耦,在其依赖项发生变更时视图可以通过触发条件自动编译。该特性通过新增的SIGHUP级别GUC参数view_independent控制启用,默认关闭。参数取值为true时,支持单独更新视图依赖项;取值为false时,行为保持前向兼容,即修改视图依赖项时报错。

  • 当此特性启用时:

    • 视图的依赖项可以单独进行修改,比如修改表、修改视图、修改函数等,无需强制删除视图;
    • 支持查询视图时自动编译或者手动通过SQL语句(ALTER VIEW view_name COMPILE)编译视图。

实验验证

步骤 1 创建表

MogDB=# create table test_view_table_ddl (id int,name varchar(200));
CREATE TABLE
复制

步骤 2 创建视图

MogDB=# create view v_test_view_table_ddl as select * from test_view_table_ddl;
CREATE VIEW
复制

步骤 3 修改表结构

MogDB=# alter table test_view_table_ddl modify name varchar(300);
ERROR:  cannot alter type of a column used by a view or rule
DETAIL:  rule _RETURN on view v_test_view_table_ddl depends on column "name"
复制

步骤 4 启动新特性

MogDB=# alter system set view_independent=on;
ALTER SYSTEM SET
复制

步骤 5 修改表结构

MogDB=# alter table test_view_table_ddl modify name varchar(300);
WARNING:  pgxc_maintenance_mode is not allowed in  postgresql.conf.  Set to default (false).
ALTER TABLE
复制

步骤 6 验证表结构是否变更成功

可见字段name长度已经从200变更为300

MogDB=# \d test_view_table_ddl
     Table "public.test_view_table_ddl"
 Column |          Type          | Modifiers 
--------+------------------------+-----------
 id     | integer                | 
 name   | character varying(300) | 
复制

参考文档

https://docs.mogdb.io/zh/mogdb/v5.0/5.0.1

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论