【问题标题】:Change a column participating in a view or rule更改参与视图或规则的列
【发布时间】:2018-03-11 09:12:07
【问题描述】:

我正在使用一个名为 giswater 的工具来模拟我们的下水道和风暴网络。这些工具从 gui 中的几个简单输入构建数据库,其中一个是 SRID。几何列都是 xy,我想让它们都知道 ZM。当我运行 alter table 命令更新几何时,出现错误“无法更改参与视图或规则的列” 无论如何要强制进行此更改并忽略错误?我尝试将视图更改为不引用该列,并尝试添加一个新的几何列以在进行更改时临时切换视图。显然我不能在视图中删除一列或将其更改为另一列。我还尝试将架构写入 SQL,然后编辑 linestring 的 sql 行并指向 linestringzm 和 pointzm 并使用 psql 运行文件以更新架构;我得到的只是使用“psql -U postgres -d utility -1 -f \i Z:......\xyz_test.sql”拒绝访问 还尝试了 pg_restore。 无论如何只是使用 pg_admin4 强制更改?或其他建议?

【问题讨论】:

  • 你可以通过直接更新pg_attribute来强制更改,但我不建议这样做。为什么不简单地删除视图并使用新的表结构重新创建它?
  • 这是 1 个示例,有很多视图不确定有多少引用“the_geom”弧。 arc 是表示管道的所有线串几何图形,每种类型的管道都有几个视图,总共有几个视图。节点的方式相同,两者都需要更新才能制作完整的 3D 模型。我确实找到了另一种工作,有点。我找到了 gui 用来创建数据库的 sql 脚本。我进入了制作表格并将几何列更改为 zm 的那些。如何直接更新 pg_attribute,为什么不推荐?

标签: postgresql postgis alter-table alter-column


【解决方案1】:

我不熟悉您使用的工具,但我建议使用以下命令检查引用您的表的所有对象(视图和规则)。

SELECT DISTINCT so.name FROM syscmets sc INNER JOIN sysobjects 所以 ON sc.id=so.id WHERE sc.TEXT LIKE '%tablename%'

然后在尝试更改表之前备份这些对象并完全删除它们。

【讨论】:

  • 如果我对您的理解正确,代码应该返回所有引用的对象,备份它们,删除它们,更新,然后恢复它们?
  • 不,它会返回错误,因为这些表在 PostgreSQL 中不存在。假设这些是 pg 表,它只会找到可能引用您想要更改的表的对象。
  • 我无法让命令工作;话虽如此,我不确定这是我的能力还是命令本身。必须有某种方法可以做到这一点......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2011-02-13
  • 2015-04-03
  • 2013-12-21
相关资源
最近更新 更多