2

この以前の質問に続いて、私は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

しかし、それは役に立ちませんでした、私はまだ同じエラーを受け取っています。

私の間違いはどこにありますか?

4

3 に答える 3

2

このためのルールを使用するのではなく、トリガーを使用します。少なくともバージョン9.1が必要です。古いバージョンは、ビューのトリガーをサポートしていません。

トリガーは、特定のタイプの操作が実行されるたびに、データベースが特定の機能を自動的に実行する必要があるという仕様です。トリガーは、テーブルとビューの両方にアタッチできます。

テーブルでは、トリガーは、INSERT、UPDATE、またはDELETE操作の前または後に、変更された行ごとに1回、またはSQLステートメントごとに1回実行するように定義できます。さらに、UPDATEトリガーは、UPDATEステートメントのSET句で特定の列が指定されている場合にのみ起動するように設定できます。トリガーは、TRUNCATEステートメントに対しても起動できます。トリガーイベントが発生すると、適切なタイミングでトリガーの関数が呼び出され、イベントが処理されます。

噂では、ルールはしばらくするとEOLになるということです。

于 2012-07-27T05:25:14.760 に答える
2

まず、フランクにこれ以上同意できませんでした。9.1とテーブルトリガーを使用します。ただし、それもビューも問題を解決しない可能性があります。

UPDATEpsqlからのビューでマニュアルを実行してみてください。それが機能し、opengeospatialと同じユーザーIDを使用して接続する場合、問題はopengeospatialが賢すぎて、ビューを更新できないことを「知っている」ことである可能性があります。それか、それが試行中であり、ビューに一致するルールをINSERT追加していません。INSERT

「filedata_viewは読み取り専用です」というメッセージは、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を有効log_statement = 'all'にしてリロードすることは有益かもしれません。postgresql.conf再テストしてから、ログを調べて、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 に答える