【问题标题】:GeoServer won't write to my PostgreSQL updateable viewGeoServer 无法写入我的 PostgreSQL 可更新视图
【发布时间】:2012-07-25 18:44:13
【问题描述】:

this earlier question 开始,我使用的是 PostgreSQL 8.4,但无法更新视图。

我有一个看法:

CREATE VIEW filedata_view
AS SELECT num, id, ST_TRANSFORM(the_geom,900913) AS the_geom
FROM filedata

并且想从我的应用程序抛出 Geoserver 更新它。但是报错:

<ServiceExceptionReport version="1.2.0" xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/wfs/1.0.0/OGC-exception.xsd">
 <ServiceException> {http://www.opengeospatial.net/cite}filedata_view is read-only    </ServiceException>
</ServiceExceptionReport>

所以 PostgresSql 中的视图是不可更新的。我需要创建规则或触发器来更新视图。

我试过了:

CREATE OR REPLACE RULE ins_view_2 AS
ON UPDATE TO filedata_view DO INSTEAD  UPDATE filedata SET the_geom=ST_TRANSFORM(NEW.the_geom,70066)
WHERE num=NEW.num

但这没有帮助,我仍然遇到同样的错误。

我的错误在哪里?

【问题讨论】:

  • 1) 请将表格定义和一些数据添加到您的问题中。 2)我似乎忘记了更新中的 id 字段(是 FK ...?) 3)您还应该为插入和删除案例创建规则。 4)错误源于您的框架,它检查目录并得出结论 filedata_view 是视图(并认为视图是 RO),请尝试首先从命令行调用它。 5) 在规则中始终使用完全限定名称(例如:where fd.num=NEW.num

标签: postgresql postgis geoserver postgresql-8.4


【解决方案1】:

不要为此使用规则,而是使用trigger。您至少需要 9.1 版本,旧版本不支持视图触发器。

触发器是数据库应自动执行的规范 每当某种类型的操作被执行时,执行一个特定的功能 执行。触发器可以附加到表和视图。

在表上,触发器可以定义为在之前或之后执行 任何 INSERT、UPDATE 或 DELETE 操作,每个修改的行一次, 或每个 SQL 语句一次。此外,可以将 UPDATE 触发器设置为触发 仅当 UPDATE 的 SET 子句中提到某些列时 陈述。触发器也可以触发 TRUNCATE 语句。如果一个 触发事件发生时,触发的函数在 适当的时间来处理事件。

有传言说,规则将在一段时间后 EOL。

【讨论】:

  • 哇,@Frank,就 Postgres 而言,你是一个真正的活生生的知识库!
  • 看起来 OP 正在使用 8.4 - 您对该版本有何建议?
  • 是的,我只能使用 8.4 版本。
  • “不要使用规则,使用触发器”对我来说听起来太迫切了。这是流行的意见。规则还不错,对大多数人来说太难理解了。而且非常难用。但是,如果需要并且正确使用,它们可以提供一个相对干净的替代弹珠机的替代品,而弹珠机可能是由触发器滥用造成的。
【解决方案2】:

首先,我完全同意弗兰克的观点。使用 9.1,和一个表触发器。但是,这和视图都可能无法解决您的问题。

尝试从 psql 对您的视图执行手动 UPDATE。如果这可行,并且如果您使用与 opengeospatial 相同的用户 ID 进行连接,那么我会说问题可能是 opengeospatial 太聪明了,并且“知道”视图无法更新。要么是这样,要么它正在尝试 INSERT 并且您尚未在视图中添加匹配的 INSERT 规则。

消息“filedata_view is read-only”不是 PostgreSQL 可能产生的消息。我想知道 opengeospatial 是否使用 JDBC 元数据(假设它是 Java)或 INFORMATION_SCHEMA 或类似来查询架构,确定 filedata_view 是一个视图,并得出结论它因此无法更新它。

如果是来自 PostgreSQL 的消息,它会改为:

# UPDATE customer_v SET customer_number = 1234; 
ERROR:  cannot update view "the_view" 
HINT:  You need an unconditional ON UPDATE DO INSTEAD rule or an INSTEAD OF UPDATE trigger.

postgresql.conf 中启用log_statement = 'all' 并重新加载postgresql 可能会提供一些信息。重新测试,然后查看日志,看看 opengeospatial 到底在做什么。

如果它检测到一个视图,您也许可以通过将ON SELECT 规则添加到一个空表来解决该问题。该表将像视图一样工作,但 GeoServer 无法判断它是视图,并且可能同意写入。

【讨论】:

  • 你说的都是对的。在 psql 中,我可以使用 RULE 在 VIEW 中插入记录。但Geoserver 不明白这一点,无法插入。我发现简单但不合理的方法:不要使用 VIEW 只需创建另一个表并将其与 geoserver 一起使用。我希望 Geoserver 能更好地与 pSql 9.1/ 一起工作,感谢您纠正我的英语。
  • @KliverMax GeoServer 只有在您向他们报告此问题时才会有所改善。如果他们正在检测视图并假设所有视图都是只读的,则 PostgreSQL 9.1 不会改进。您可能想尝试在表上使用 ON SELECT 规则来创建 GeoServer 无法判断的视图实际上是视图。
【解决方案3】:

如果您的 Postgres >= 9.3,您可以使用 GeoServer 更新来自视图的功能,至少当视图是另一个表的子集时(我认为这不适用于连接或复合字段..)。

方法如下:http://osgeo-org.1560.x6.nabble.com/postgresql-postgis-views-and-primary-keys-td3796362.html

这真的对我有用!

【讨论】:

    猜你喜欢
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2021-10-13
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多