QGISサーバーがUPDATEを送信しています…WFSレイヤーのpostgisにWHERE NULL


9

Windows Server 2012サーバーを実行しています。

PostgreSQL 9.3.5、64ビット

POSTGIS 2.1.3

QGISサーバー2.6.1-2

QGIS Desktop 2.8.3および2.12

QGISデスクトップ2.12を使用してMicrosoft Surface Pro 4タブレットを使用して、Postgresqlデータベースに格納されているいくつかのレイヤーを編集しています。タブレットのレイヤーは、QGISサーバーによって提供されるWFSレイヤーです。

レイヤーにデータを挿入した後で編集をやりすぎて、データをサーバーに強制的に送信して保存すると、データベースで更新が行われないことがあります。

POST httpリクエストがサーバーに正常に到着したことがわかりますが、データベースにコミット(更新)が表示されない場合や、正常に動作してコミットを実行する場合があります。

QGISサーバーのログで確認できます(QGISデスクトップで3つの機能のデータを更新しました):

//QGIS SERVER RECEIVED HTTP POST FROM QGIS DESKTOP

[4852][11:11:19] ********************new request*************** [4852][11:11:19] remote ip: 192.168.144.20 [4852][11:11:19] CONTENT_TYPE: text/xml [4852][11:11:19] HTTP_USER_AGENT: Mozilla/5.0 QGIS/2.8.2-Wien [4852][11:11:19] MAP:D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs
[4852][11:11:19] REQUEST:Transaction
[4852][11:11:19] REQUEST_BODY:<Transaction xmlns="http://www.opengis.net/wfs"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0.0"
service="WFS" xsi:schemaLocation="http://www.qgis.org/gml
http://eudala2.getxo.net/qgis/qgis_mapserv.fcgi.exe?map=D:\OSGeo4W\apps\qgis\bin\alumbrado\alumbrado.qgs&amp;SERVICE=WFS&amp;VERSION=1.0.0&amp;REQUEST=DescribeFeatureType&amp;TYPENAME=getxo_alumbrado_arquetas_registros_cajas&amp;SRSNAME=EPSG:23030"
xmlns:gml="http://www.opengis.net/gml"><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.3"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.4"/></Filter></Update><Update
xmlns="http://www.opengis.net/wfs"
typeName="getxo_alumbrado_arquetas_registros_cajas"><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo</Name><Value
xmlns="http://www.opengis.net/wfs">A</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_tapa</Name><Value
xmlns="http://www.opengis.net/wfs">B</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">estado</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">O</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_tipo_union_electrodo_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">N</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">p_tierra_estado_union_tierra</Name><Value
xmlns="http://www.opengis.net/wfs">D</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">tipo_intervencion</Name><Value
xmlns="http://www.opengis.net/wfs">OTR</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">m_codcalle</Name><Value
xmlns="http://www.opengis.net/wfs">20</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">id_modelo</Name><Value
xmlns="http://www.opengis.net/wfs">0</Value></Property><Property
xmlns="http://www.opengis.net/wfs"><Name
xmlns="http://www.opengis.net/wfs">alumbrado</Name><Value
xmlns="http://www.opengis.net/wfs">t</Value></Property><Filter
xmlns="http://www.opengis.net/ogc"><FeatureId
xmlns="http://www.opengis.net/ogc"
fid="getxo_alumbrado_arquetas_registros_cajas.5"/></Filter></Update></Transaction>
[4852][11:11:19] SERVICE:WFS
[4852][11:11:19] SRSNAME:EPSG:23030
[4852][11:11:19] VERSION:1.0.0
[4852][11:11:22] Request finished in 2977 ms

さて、PostgreSQLログを調べると、更新に何も更新しないWHERE NULL句があることがわかります。

//POSTGRESQL UPDATE QUERIES
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "id_modelo"=0,"alumbrado"='t' WHERE NULL
2016-01-29 11:11:22 CET UBICACIÓN:  exec_simple_query, src\backend\tcop\postgres.c:890
2016-01-29 11:11:22 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_arquetas_registros_cajas" SET "tipo"='A',"tipo_tapa"='B',"estado"='D',"p_tierra_tipo_electrodo_tierra"='O',"p_tierra_tipo_union_electrodo_tierra"='N',"p_tierra_estado_union_tierra"='D',"tipo_intervencion"='OTR',"m_codcalle"='20',"id_modelo"=0,"alumbrado"='t'
WHERE NULL

POSTデータで、QGISサーバーが内部の「fid」番号を使用して更新する必要のある機能を認識していることを確認できます。一方、私のレイヤーには「id」フィールドが主キーとして含まれています。QGISの内部fidから私のレイヤーのIDへのマッピングを行うと、どこかに失われ、where id = 1510を追加する代わりにWHERE nullがクエリに追加されます。

面白いことに、彼らは40日間働いており、この問題は1回しか発生していませんが、先週から毎日この問題が発生しています... 私はクライアントがFiddlesプロキシを使用してPOST httpリクエストを再送信しますが、同じHTTPポストが機能する場合と機能しない場合があります。

私はそれをQGISデスクトップ2.8、2.10、および2.12でテストし、それらすべてで発生しました(QGISサーバーは2.6.1だと思います)。異なるレイヤーでテストした結果も同じでした。

バグがあるのか​​、サーバーで適切に実行していないレイヤーの設定があるのか​​わかりません...


更新2016/03/03

QGISサーバーとQGISデスクトップの両方を2.12.3にアップデートしても問題は解決しません。

何日間ものテストを行った後、問題が発生したときにようやく見つかりました。レイヤーの編集をQGIS(WFS-Tを介して)に保存し、同時にLizmapマップが別のユーザーによってロードされているときに発生します。Lizmapはqgis-serverも使用します。

マップをロードするとき、Lizmapはサーバーをビジー状態にし、WFS-T更新要求が受信されると、QGISサーバーはUPDATE SQLクエリを正しく構築できません。例:

WFS-Tポストの受信時にLizmapがロードされている場合、qgis-serverで生成されるPostgreSQLクエリは次のとおりです。

2016-03-03 11:47:30 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='22' WHERE NULL

一方、WFS-Tが到着したときにqgis-serverがロード中のLizmapにデータを提供していない場合、生成されるPostgreSQLクエリは次のようになります。

2016-03-03 11:46:21 CET LOG:  00000: sentencia: UPDATE "public"."getxo_alumbrado_tendido_canalizacion" SET "diametro"='111' WHERE "id"::text='1' 

where句の違いに注意してください。最初のものは何もしません。2つ目は問題なく動作します。

この問題を修正するために、Apacheまたはqgis-serverの構成ファイルを調整できるかどうかはわかりません。

変更を加えずに、サーバーにより多くのハードウェア(4コアと16 GB RAM)を追加してみました。


OSGEO4Wを使用してすべてのソフトウェアアップデートを作成しています。Iaは、ApacheおよびPHPパッケージが何年も更新されていないことをどこかで読みました。それらを手動で更新して、Apacheまたはphpのバージョンが問題の原因ではないことを確認します。


アップデート2016/03/16

ApacheとPHPパッケージを更新しましたが、問題は解決しません。いくつかのテストを行った後、リズマップマップの読み込み中にエディションの変更を(WFS経由で)保存すると、保存に失敗しますが、リズマップの読み込みが行われていないにもかかわらず、失敗する場合があります(ボリュームが低い場合)。これはQGISサーバー(qgis_mapserv.fcgi.exe)の問題です。


QGISサーバーログが機能するときに表示できますか?私はそれらが同じに見えると仮定していますが、その仮定を確認する必要があります。
alexGIS 2016年

@alexGISはい、同じです。私は問題の解決策を含む回答を書きました。ご協力いただきありがとうございます!
Egidi 2016年

回答:


7

最後に、QGISの開発者の一人であるMatthias Kuhnが私に鍵をくれました。

WHERE句をチェック構築されている主キーの種類テーブルのを。それは整数である必要があり、一部のテーブルでは、タイプがNumeric(8,0)であることがわかりました。

これらのテーブルと主キーは、しばらく前にサードパーティのアプリによって作成されました。

タイプをIntegerに変更し、それ以降に行ったすべてのテストが機能しました(WFSを介して100を超えるエディションのテストを行いましたが、問題は解決したと結論付けるのに十分です)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.