Pergunta

Na sequência de esta pergunta anterior Estou no PostgreSQL 8.4 e estou tendo problemas com visualizações atualizáveis.

Eu tenho uma visão:

CREATE VIEW filedata_view
AS SELECT num, id, ST_TRANSFORM(the_geom,900913) AS the_geom
FROM filedata

E quero atualizá-lo do meu aplicativo através do Geoserver.Mas recebo um erro:

<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>

Portanto, as visualizações no PostgresSql não são atualizáveis.Preciso criar uma regra ou gatilho para atualizar a visualização.

Eu tentei isso:

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

mas não ajudou, ainda estou recebendo o mesmo erro.

Onde está o meu erro?

Foi útil?

Solução

Primeiro, eu não poderia concordar mais com Frank.Use 9.1 e um gatilho de tabela.No entanto, é possível que nem isso nem uma visão resolvam o seu problema.

Tente fazer um manual UPDATE na sua opinião do psql.Se isso funcionar, e se você se conectar usando o mesmo ID de usuário com o opengeospatial, então eu diria que o problema pode ser que o opengeospatial seja muito inteligente para seu próprio bem e "sabe" que as visualizações não podem ser atualizadas.Ou isso, ou está tentando um INSERT e você não adicionou uma correspondência INSERT governar em sua opinião.

A mensagem "filedata_view é somente leitura" não é uma mensagem que o PostgreSQL pode produzir.Estou me perguntando se opengeospatial está usando metadados JDBC (supondo que seja Java) ou INFORMATION_SCHEMA ou similar para consultar o esquema, está determinando que filedata_view é uma visão e está concluindo que, portanto, não pode atualizá-la.

Se fosse uma mensagem do PostgreSQL, diria:

# 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.

Pode ser informativo ativar log_statement = 'all' em postgresql.conf e recarregue o postgresql.Teste novamente e, em seguida, observe os logs para ver o que exatamente o opengeospatial está fazendo.

Se descobrir que está detectando uma visualização, você poderá contornar o problema com um ON SELECT regra adicionada a uma tabela vazia.A tabela funcionará como uma visualização, mas o GeoServer não será capaz de dizer que é uma visualização e poderá concordar em escrever nela.

Outras dicas

Não use uma regra para isso, mas uma acionar.Você precisa de pelo menos a versão 9.1, versões mais antigas não suportam gatilhos em visualizações.

Um gatilho é uma especificação de que o banco de dados deve executar automaticamente uma função específica sempre que um certo tipo de operação for executado.Os gatilhos podem ser anexados a tabelas e visualizações.

Nas tabelas, os gatilhos podem ser definidos para executar antes ou depois de qualquer inserção, atualização ou exclusão de operação, uma vez por linha modificada ou uma vez por instrução SQL.Além disso, os gatilhos de atualização podem ser definidos apenas se determinadas colunas forem mencionadas na cláusula definida da instrução ATUALIZAÇÃO.Os gatilhos também podem ser acionados para instruções TRUNCATE.Se ocorrer um evento de gatilho, a função do gatilho será chamada no momento apropriado para lidar com o evento.

O boato é que as regras serão EOL em breve.

Se você possui Postgres >= 9.3 você pode atualizar recursos vindos de uma View com GeoServer, pelo menos se a view for um subconjunto de outra tabela (não acho que isso funcionará com junções ou campos compostos..).

Veja como: http://osgeo-org.1560.x6.nabble.com/postgresql-postgis-views-and-primary-keys-td3796362.html

Isso realmente funcionou para mim!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top