2012-07-27 20 views
2

this earlier question繼續我在PostgreSQL 8.4上,並且在更新視圖時遇到問題。GeoServer不會寫入我的PostgreSQL可更新視圖

我有一個觀點:

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 

,但它並沒有幫助,我仍然得到同樣的錯誤。

哪裏是我的錯?

+2

1)請添加表格定義和一些數據到您的問題。 2)我似乎忘記了更新中的id字段(是FK ...?)3)您還應該爲插入和刪除案例創建規則。 4)錯誤來源於你的框架,它檢查目錄並得出結論:filedata_view是一個視圖(並且認爲視圖是RO),首先嚐試從命令行調用它。 5)總是在規則中使用完全限定的名字(例如:'where fd.num = NEW.num') – wildplasser 2012-07-27 07:39:24

回答

2

首先,我完全同意弗蘭克的看法。使用9.1和一個表格觸發器。但是,這兩種觀點都不可能解決您的問題。

嘗試在你的psql視圖上做一個手冊UPDATE。如果這是有效的,並且如果你使用相同的用戶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.conflog_statement = 'all'和重裝的PostgreSQL。重新測試,然後查看日誌,看看開放空間在做什麼。

如果事實證明它正在檢測視圖,則可以通過將ON SELECT規則添加到空表中來解決問題。該表格就像一個視圖一樣工作,但GeoServer將無法將其視爲視圖並可能同意寫入該視圖。

+0

所有你說的都是對的。在psql中,我可以使用RULE在VIEW中插入記錄。但Geoserver不明白,不能插入。我覺得簡單卻不合理:不使用VIEW只是創建另一個表,並在與geoserver一起使用它。我希望Geoserver能夠更好地使用pSql 9.1 /並且感謝您糾正我的英語。 – 2012-07-27 07:32:42

+0

@KliverMax GeoServer只有在你向他們報告這個問題時纔會有所改進。如果他們正在檢測視圖並假設所有視圖都是隻讀的,那麼PostgreSQL 9.1將不會改進。您可能想嘗試在表上使用「ON SELECT」規則來製作GeoServer無法識別的視圖實際上是視圖。 – 2012-07-27 08:41:57

2

請勿使用此規則,但使用trigger。您至少需要版本9.1,舊版本不支持視圖上的觸發器。

A trigger is a specification that the database should automatically execute a particular function whenever a certain type of operation is performed. Triggers can be attached to both tables and views.

On tables, triggers can be defined to execute either before or after any INSERT, UPDATE, or DELETE operation, either once per modified row, or once per SQL statement. UPDATE triggers can moreover be set to fire only if certain columns are mentioned in the SET clause of the UPDATE statement. Triggers can also fire for TRUNCATE statements. If a trigger event occurs, the trigger's function is called at the appropriate time to handle the event.

有傳言說,規則將在一段時間內成爲EOL。

+0

Wow @Frank就Postgres而言,您是真正的生活知識庫! – LisMorski 2012-07-27 05:32:29

+0

看起來OP正在使用8.4 - 您對該版本的建議是什麼? – user272735 2012-07-27 05:35:14

+0

是的,我只能使用8.4版本。 – 2012-07-27 05:37:30