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?
First, I couldn’t agree more with Frank. Use 9.1, and a table trigger. However, it’s possible that neither that nor a view will solve your problem.
Try doing a manual
UPDATEon your view from psql. If that works, and if you connect using the same user ID with opengeospatial, then I’d say the issue could be opengeospatial being too clever for its own good and “knowing” that views can’t be updated. Either that, or it’s trying anINSERTand you haven’t added a matchingINSERTrule on your view.The message “filedata_view is read-only” isn’t a message PostgreSQL may produce. I’m wondering if opengeospatial is using JDBC metadata (assuming it’s Java) or INFORMATION_SCHEMA or similar to query the schema, is determining that
filedata_viewis a view, and is concluding that it therefore can’t update it.If it were a message from PostgreSQL it would instead say:
It might be informative to enable
log_statement = 'all'inpostgresql.confand reload postgresql. Re-test, then look in the logs see what exactly opengeospatial is doing.If it turns out it’s detecting a view, you might be able to work around the problem with an
ON SELECTrule added to an empty table. The table will work just like a view, but GeoServer won’t be able to tell it is a view and might agree to write to it.