更改其他视图中使用的列的类型

2023-12-25

create table base (name character varying(255));                                                                                                                                                        
create view v1 as select *, now() from base;                                                        
create view v2 as select * from v1 where name = 'joe';
alter table base alter column name type text;                                                       

给出这个错误:

cannot alter type of a column used by a view or rule
DETAIL:  rule _RETURN on view v1 depends on column "name"

这有点烦人,因为现在我必须重新创建引用该视图的所有视图base.name柱子。当我的视图引用其他视图时,这尤其令人烦恼。

我希望能够做的是这样的:

select recreate_views('v1', 'v2', 'alter table base alter column name type text');

让函数获取 v1 和 v2 的视图定义,删除它们,运行指定的代码,然后重新创建 v1 和 v2。如果我可以使用 Ruby,我可能会让该函数采用函数/块/lambda,例如

recreate_views 'v1', 'v2' do
  alter table base alter column name type text
end

这样的事情可能吗?是否有实用程序可以做类似的事情?


我认为这符合您的要求,尽管我将视图列表移至 args 末尾以与 VARIADIC 语义兼容。

CREATE OR REPLACE FUNCTION recreate_views(run_me text, VARIADIC views text[])
  RETURNS void
AS  $$
DECLARE
  view_defs text[];
  i integer;
  def text;
BEGIN
  for i in array_lower(views,1) .. array_upper(views,1) loop
    select definition into def from pg_views where viewname = views[i];
    view_defs[i] := def;
    EXECUTE 'DROP VIEW ' || views[i];
  end loop;

  EXECUTE run_me;

  for i in reverse array_upper(views,1) .. array_lower(views,1) loop
    def = 'CREATE OR REPLACE VIEW ' || quote_ident( views[i] ) || ' AS ' || view_defs[i];
    EXECUTE def;
  end loop;

END
$$
LANGUAGE plpgsql;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更改其他视图中使用的列的类型 的相关文章

随机推荐

  • -webkit-transform 在 Internet Explorer 中不起作用

    我发现 webkit transform rotateZ 10deg 在 Internet Explorer 9 中不起作用 可以使用什么来代替 CSS3 你有没有尝试过 ms transform rotateZ 10deg As webk
  • 打印图像c#.net

    我在 PictureBox 中有一张图像 我想打印它 无需格式化 无需任何操作 只需打印即可 我一直在谷歌上搜索 但一无所获 只有人们打印表格 文本或报告 private string imgSrc public string ImgSrc
  • jMeter 未将变量应用于标头管理器

    我在 Mac 上使用 Apache JMeter 3 2 r1790748 我有一个setUp Thread Group进行身份验证调用 该调用有效并正确输出令牌 现在我需要将该令牌传递给HTTP Header Manager我拨打的所有电
  • 如何模拟私有 dao 变量?

    我有一个dao create 在测试方法时调用我想要模拟的方法 但我错过了一些东西 因为我仍然得到 NPE 这里有什么问题吗 class MyService Inject private Dao dao public void myMeth
  • 如何关闭特定列的 ag-grid 快速过滤器

    AG grid 有 快速过滤 https www ag grid com javascript grid filter quick 功能 本质上是一个搜索所有列的自由文本搜索过滤器 问题是 在某些列中 我有日期时间值 但我不想搜索这些列中的
  • 在 linq 中选择两列之间的最大值

    我在产品表中有 dateSend 列和 dateEdit 列 我可以使用以下代码选择 max dateSend from pro in Products ToList select new pro DateSend Max 但我在 date
  • PHP 的 var_dump / print_r 输出是乱码 - 编码问题?

    我遇到的问题是服务器上的输出var dump and print r出来完全是乱码 print r输出纯粹的乱码 例如 W 8 等 同时var dump至少给出string 1664 后面是类似的胡言乱语 尽管这次用双引号引起来 这看起来像
  • 聚合广告点击次数和浏览次数

    下表跟踪每个广告系列的点击次数和浏览次数 record id advert id type 1 100 click 2 102 click 3 100 view 4 100 view 5 102 view 6 100 view 7 101
  • 如何在 git 中显示标签的完整历史记录?

    git 中的标签显然可以通过简单地删除它们然后重新标记来从一个提交移动到另一个提交 例如 git tag m Version 1 0 v1 0 abcd123 git push tags git tag d v1 0 git tag m C
  • 在 iOS 中获取蓝牙低功耗外设的 MAC 地址

    我目前正在开发一个基于蓝牙低功耗设备的 iOS 应用程序 为了获得唯一的标识符来比较所获得的外设 我必须获取外设的 MAC 地址 据观察 外围设备的 UUID 属性在不同的 iOS 设备上有所不同 并且外围设备要获得 UUID 它必须至少连
  • Python 3 unicode 编解码器在 tkinter 中绑定鼠标滚轮时出错

    在 MacOS 上使用 Python 3 6 tkinter 我在画布中创建了一个框架并将滚动条绑定到它 这一切都很好 问题是当光标位于可滚动框架中时我尝试捕获 MouseWheel 事件 我设置了一个绑定 main window bind
  • LoadError:不兼容的库版本 - nokogiri

    当我尝试时遇到以下错误 run rake db migrate Log rake aborted LoadError incompatible library version home ubuntu rvm gems ruby 2 3 1
  • 处理 Cassandra 时间戳

    最近我开始研究 cassandra 并且在使用 cql 和 Java 处理 cassandra 时间戳时遇到一些问题 下面是我的示例 cassandra 表架构 CREATE TABLE emp empid int create date
  • 防止 Adblock 阻止跟踪像素

    我目前在一个提供横幅的平台工作 但这些并不是您在每个网站上看到的那些烦人的横幅 它们是交互式横幅 仅当您单击它时才会展开 问题是 adblock 并没有阻止横幅本身 而是阻止了我注入横幅的跟踪像素 为什么我想解决这个问题 好吧 传递那条横幅
  • Clojure 中的自定义异常?

    我一直在尝试在 Clojure 中创建用户定义的异常 但遇到了各种各样的问题 我尝试了这里概述的方法 http en wikibooks org wiki Clojure Programming Concepts User Defined
  • Android 发布构建自动化

    我在一个文件夹中有十个 Android 项目 对于每个项目 我可以使用ant debug来建造它 所以编写一个简单的脚本来编译所有这些项目是没有问题的 我每天都使用 Hudson 来构建这些项目 而且效果很好 但现在我们的项目需要进入发布阶
  • 在 Visual Studio (2013) 中定义“CustomDictionary.xml”架构的正确方法?

    我正在使用自定义词典 CustomDictionary xml https learn microsoft com en us visualstudio code quality how to customize the code anal
  • 证书随机未正确创建

    我创建了一个自定义 httpclient 用于接收自定义信任存储 并将其用于它尝试访问的所有 ssl 站点 这是代码 public class MyHttpClient extends DefaultHttpClient private C
  • Eclipse 3.5+ - 注释处理器:无法导入生成的类

    我正在使用第 3 方注释处理器从项目中的注释类生成元数据代码 java 文件 我已经通过 Eclipse 属性 gt Java 编译器 gt 注解处理 成功配置了处理器 并且代码生成工作正常 代码是自动创建和生成的 此外 Eclipse 成
  • 更改其他视图中使用的列的类型

    create table base name character varying 255 create view v1 as select now from base create view v2 as select from v1 whe