2

Following on from this earlier question I'm on PostgreSQL 8.4 and am having trouble with updatable views.

I have a view:

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

And want to update it from my application throw Geoserver. But get a error:

<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>

So views in PostgresSql are not updatable. I need create a rule or trigger to update the view.

I tried this:

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

but it didn't help, I'm still getting the same error.

Where is my mistake?

4

3 回答 3

2

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

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

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

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

于 2012-07-27T05:25:14.760 回答
2

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

尝试UPDATE从 psql 对您的视图进行手册。如果这可行,并且如果您使用与 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.

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

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

于 2012-07-27T06:10:09.677 回答
0

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

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

这真的对我有用!

于 2014-04-20T17:21:48.847 回答