GeoServer не будет записывать в мое обновляемое представление PostgreSQL

Следуя этому предыдущему вопросу, я использую 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

но это не помогло, я все еще получаю ту же ошибку.

Где моя ошибка?


person Kliver Max    schedule 27.07.2012    source источник
comment
1) Пожалуйста, добавьте определения таблиц и некоторые данные к вашему вопросу. 2) Мне кажется, что вы забыли id-поле в вашем обновлении (это FK ...?) 3) вы должны также создать правила для случаев вставки и удаления. 4) ошибка исходит от вашего фреймворка, который проверяет каталоги и делает вывод, что filedata_view — это представление (и думает, что представления — это RO), попробуйте сначала вызвать его из командной строки. 5) всегда используйте полные имена в правилах (например: where fd.num=NEW.num)   -  person wildplasser    schedule 27.07.2012


Ответы (3)


Во-первых, я полностью согласен с Фрэнком. Используйте 9.1 и табличный триггер. Однако возможно, что ни это, ни представление не решат вашу проблему.

Попробуйте сделать ручное UPDATE для вашего представления из psql. Если это работает, и если вы подключаетесь, используя тот же идентификатор пользователя с opengeospatial, то я бы сказал, что проблема может заключаться в том, что 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.

Может быть полезно включить log_statement = 'all' в postgresql.conf и перезагрузить postgresql. Повторите тестирование, затем посмотрите в журналах, что именно делает opengeospatial.

Если выяснится, что он обнаруживает представление, вы можете обойти проблему с помощью правила ON SELECT, добавленного к пустой таблице. Таблица будет работать так же, как представление, но GeoServer не сможет сказать, что это представление, и может согласиться на запись в него.

person Craig Ringer    schedule 27.07.2012
comment
Все правильно говоришь. В psql я могу вставить запись в VIEW, используя RULE. Но Geoserver этого не понимает и не может вставить. Я нахожу простой, но не рациональный способ: не использовать VIEW, а создать еще одну таблицу и использовать ее в работе с геосервером. Я надеюсь, что Geoserver будет работать лучше с pSql 9.1/ И спасибо, что поправили мой английский. - person Kliver Max; 27.07.2012
comment
@KliverMax GeoServer улучшится, только если вы сообщите им об этой проблеме. Если они обнаруживают представления и предполагают, что все представления доступны только для чтения, это не улучшится с PostgreSQL 9.1. Возможно, вы захотите попробовать использовать правило ON SELECT для таблицы, чтобы создать представление, которое GeoServer не может определить, является ли оно на самом деле представлением. - person Craig Ringer; 27.07.2012

Используйте для этого не правило, а триггер. Вам нужна как минимум версия 9.1, более старые версии не поддерживают триггеры в представлениях.

Триггер — это спецификация, согласно которой база данных должна автоматически выполнять определенную функцию всякий раз, когда выполняется определенный тип операции. Триггеры могут быть прикреплены как к таблицам, так и к представлениям.

В таблицах триггеры могут выполняться до или после любой операции INSERT, UPDATE или DELETE, либо один раз для измененной строки, либо один раз для оператора SQL. Более того, триггеры UPDATE могут срабатывать только в том случае, если определенные столбцы упоминаются в предложении SET оператора UPDATE. Триггеры также могут срабатывать для операторов TRUNCATE. Если происходит событие триггера, функция триггера вызывается в соответствующее время для обработки события.

Ходят слухи, что через какое-то время правила станут EOL.

person Frank Heikens    schedule 27.07.2012
comment
Вау, @Frank, ты настоящая живая база знаний, когда речь идет о Postgres! - person LisMorski; 27.07.2012
comment
Похоже, что OP использует 8.4 - что вы посоветуете для этой версии? - person user272735; 27.07.2012
comment
Да, я могу использовать только версию 8.4. - person Kliver Max; 27.07.2012
comment
Не используйте правило, использование триггера звучит для меня слишком настоятельно. Это популярное мнение. Правила не плохи, просто большинству людей они слишком сложны для понимания. И очень трудно использовать. Но при необходимости и при правильном использовании они могут предложить относительно чистую альтернативу автомату для игры в пинбол, который может возникнуть в результате злоупотребления триггерами. - person wildplasser; 27.07.2012

Если у вас Postgres >= 9.3, вы можете обновлять функции, поступающие из представления с помощью GeoServer, по крайней мере, если представление является подмножеством другой таблицы (я не думаю, что это будет работать с соединениями или составными полями...).

Вот как: http://osgeo-org.1560.x6.nabble.com/postgresql-postgis-views-and-primary-keys-td3796362.html

Это действительно сработало для меня!

person mettjus    schedule 20.04.2014