2012-10-31 19 views
5

Moja strona została opracowana przy użyciu Drupala 6 działającego na serwerze Postgresql 8.3 na Ubuntu 11.10. Również webmin wersja 1.590.Nie można zaktualizować widoku?

Teraz chcę zaktualizować rekordy w tabeli, ale gdy uruchomię:

UPDATE uac_institution_view SET status = '2' WHERE nid = '9950' 

daje mi błąd jak:

Failed to execute SQL : SQL UPDATE uac_institution_view SET status = '2' WHERE nid = '9950' failed : ERROR: cannot update a view HINT: You need an unconditional ON UPDATE DO INSTEAD rule.

Problem polega na tym, że tylko SELECT zapytań działać. UPDATE, INSERT i DELETE polecenia nie działają; zawodzą z powyższym błędem.

Czy to jest problem z pozwoleniem? Błąd składni? Coś innego?

+3

Pierwszy komunikat o błędzie jest całkiem jasne, na czym polega problem. –

+1

Czy przeczytałeś moją odpowiedź wyjaśniającą na temat dostarczania wystarczających informacji lub porady na temat wiki PostgreSQL, z którym się łączył? Gdzie jest wyjście 'psql'' \ d'? Wersja PostgreSQL (1.590 nie jest wersją PostgreSQL; w razie wątpliwości użyj 'select version()'? http://stackoverflow.com/a/13151381/398670 Jak byś * ty * odpowiedziałaś na to pytanie, gdybyś nie miała dostępu do DDL dla 'uac_institution_view'? Jest to * inny komunikat o błędzie * niż ten, który podałeś wcześniej. Co się zmieniło? –

+0

Zobacz także http://stackoverflow.com/q/11664302/398670 i http://stackoverflow.com/questions/11681852/geoserver-wont-write-to-my-postgresql-updateable-view –

Odpowiedz

15

Widoki PostgreSQL nie są domyślnie aktualizowane. Musisz poinformować PostgreSQL, jak chcesz, aby widok był aktualizowany.

Zrób to przy użyciu "bezwarunkowej reguły ON UPDATE DO INSTEAD" (jak podano w wiadomości o błędzie) lub najlepiej w PostgreSQL 9.1 i nowszych przy użyciu wyzwalacza widoku. I pod warunkiem, że linki do wszystkich w my answer to your previous post, ale tutaj jest trochę więcej informacji:

W wielu przypadkach lepiej jest zostawić widok tylko do odczytu i po prostu zaktualizować tabelę podrzędną. Ponieważ nie przedstawiłeś definicji tego widoku, trudno jest powiedzieć, co to w rzeczywistości oznacza. Zaktualizuj swoje pytanie, wysyłając komunikat: \d uac_institution_view w psql i skomentuj, że tak zrobiłeś; może mogę wskazać sposób, aby uruchomić aktualizację bezpośrednio na bazowych tabelach.

Używasz bardzo przestarzałej wersji PostgreSQL (8.3), więc nie możesz użyć preferowanego podejścia wyzwalającego INSTEAD OF, musisz albo użyć reguł, albo bezpośrednio zaktualizować tabelę bazową.

+0

Przepraszam mój biedny angielski i wersja jest: PostgreSQL 8.3.8 na x86_64-pc-linux-gnu, skompilowana przez GCC gcc-4.4.real (Ubuntu 4.4.1-3ubuntu3) 4.4.1 i wyjściem \ d było: Nieudane wykonanie SQL: Command Nieobsługiwane. Dziękuję za odpowiedź. – srinu

+0

@srinu Twój angielski jest lepszy niż moje zrozumienie twojego języka. W porządku. Używasz bardzo starej wersji PostgreSQL, którą powinieneś jak najszybciej uaktualnić. Nie obsługuje on wyzwalaczy 'INSTEAD OF', więc musisz użyć reguł, aby zaimplementować obsługę aktualizacji w widoku lub bezpośrednio' UPDATE' bezpośrednio w tabeli. Nie mogę ci pokazać, jak to zrobić, ponieważ * nadal nie udało Ci się podać definicji widoku *! (Odpowiedź zaktualizowana) –

+0

Cześć, byłem nowicjuszem w postgresql db, jak zobaczyć definicję widoku i jak zobaczyć strukturę tabeli. – srinu

2

jestem na PostgreSQL 9.5, a widoki są aktualizowalny domyślnie. Przykład:

CREATE TABLE UP_DATE (id number, name varchar2(29)); 
insert into up_date values(1, 'Foo'); 
select * from up_date; 
CREATE OR REPLACE VIEW UPDATE 
AS 
Select 
name from up_date; 
select * from update; 
insert into update values('Bar'); 
select * from update; 

Będzie się położyć i Foo Bar

+0

FYI - Jeśli jesteś dodając kolumnę za pomocą "CREATE OR REPLACE", nowa kolumna musi zostać dodana na końcu listy wybranych kolumn. –

Powiązane problemy