2012-07-27 3 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> 

그래서 PostgreSQL의보기는 업데이트 할 수 없습니다. 보기를 업데이트하려면 규칙이나 트리거를 만들어야합니다.

나는이 시도 :

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) 항상 정규화 된 이름을 규칙에 사용하십시오 (예 :'fd.num = NEW.num'). – wildplasser

답변

2

먼저 Frank와 더 이상 동의 할 수 없습니다. 9.1 및 테이블 트리거를 사용하십시오. 그러나 그것도보기가 문제를 해결하지 못할 수도 있습니다.

psql에서보기에 UPDATE 매뉴얼을 시도해보십시오. 그것이 작동하고 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.conf에서 log_statement = 'all'을 활성화하고 PostgreSQL을 다시로드하는 정보 일 수 있습니다. 다시 테스트 한 다음 로그를 살펴보고 opengeospatial이 정확히 무엇을하고 있는지 확인하십시오.

보기를 발견 한 것으로 밝혀지면 ON SELECT 규칙이 빈 테이블에 추가되어 문제를 해결할 수 있습니다. 테이블은보기처럼 작동하지만 GeoServer는보기임을 표시 할 수 없으며보기에 동의 할 수도 있습니다.

+0

모두 당신이 말하는 것은 옳습니다. psql에서 나는 RULE을 사용하여 VIEW에 레코드를 삽입 할 수있다. 하지만 Geoserver는 그것을 이해하지 못하고 삽입 할 수 없습니다. 나는 쉽지만 합리적인 방법을 찾지 못합니다. VIEW를 사용하면 다른 테이블을 만들고 geoserver와 함께 사용하지 마십시오. Geoserver가 pSql 9.1에서 더 잘 작동하기를 바랍니다./그리고 제 영어를 고치도록 부탁드립니다. –

+0

@ KliverMax GeoServer는이 문제를보고 할 때만 향상됩니다. 그들이 뷰를 감지하고 모든 뷰가 읽기 전용이라고 가정한다면 PostgreSQL 9.1에서는 개선되지 않습니다. GeoServer가 실제로 볼 수없는 뷰를 만들기 위해 테이블에서 'ON SELECT'규칙을 사용하려고 할 수 있습니다. –

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

와우 @ 프랭크 포스트 그레스가 고려되는 한 당신은 진정한 살아있는 지식 기반입니다! – LisMorski

+0

OP가 8.4를 사용하는 것처럼 보입니다 - 그 버전에 대한 조언은 무엇입니까? – user272735

+0

예 8.4 버전 만 사용할 수 있습니다. –