2012-10-31 97 views
5

我的網站是使用在Ubuntu 11.10上的Postgresql 8.3服務器上運行的Drupal 6開發的。另外webmin版本1.590。無法更新視圖?

現在我想在一個表中更新記錄,但是當我運行:

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

它給了我這樣的錯誤:

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.

的問題是,只有SELECT查詢工作。 UPDATEINSERTDELETE命令不起作用;他們因上述錯誤而失敗。

這是一個permisssion問題?語法錯誤?還有別的嗎?

+3

第一個錯誤消息是什麼問題相當清楚。 –

+1

您是否閱讀過關於如何提供足夠信息的解釋性答案,或者鏈接到PostgreSQL wiki上的建議? 'psql'' \ d'輸出在哪裏? PostgreSQL版本(1。590不是PostgreSQL版本;如果有疑問,使用'select version()')? http://stackoverflow.com/a/13151381/398670如果您無法訪問uac_institution_view的DDL,您將如何回答此問題?此外,這是一個*不同的錯誤信息*給你以前給過的人。什麼改變了? –

+0

另請參閱http://stackoverflow.com/q/11664302/398670和http://stackoverflow.com/questions/11681852/geoserver-wont-write-to-my-postgresql-updateable-view –

回答

15

默認情況下,PostgreSQL視圖不可更新。你必須告訴PostgreSQL你想如何更新視圖。

使用「無條件ON UPDATE DO INSTEAD規則」(作爲所粘貼的錯誤消息)或最好使用視圖觸發器在PostgreSQL 9.1及更高版本上執行此操作。我公司提供鏈接到所有在my answer to your previous post,但這裏的多一些信息:

在許多情況下,最好將視圖保持爲只讀並更新基礎表。由於您沒有提供視圖的定義,因此很難說實際涉及的內容。更新您的問題,輸入的輸出psql並發表評論說您已經這麼做;也許我可以指出一種方法來直接在底層表上運行更新。

您正在使用非常過時的PostgreSQL版本(8.3),因此您不能使用首選的INSTEAD OF觸發器方法,您必須使用規則或直接更新基礎表。

+0

對不起我可憐的英語和版本爲:x86_64-pc-linux-gnu上的PostgreSQL 8.3.8,由GCC編譯gcc-4.4.real(Ubuntu 4.4.1-3ubuntu3)4.4.1並且\ d的輸出是:無法執行SQL:Command不支持。感謝您的回覆。 – srinu

+0

@srinu你的英語比我對你的語言的掌握要好。沒關係。您正在使用一個非常舊的PostgreSQL版本,您應該儘快升級。它不支持'INSTEAD OF'觸發器,所以你必須使用規則來實現視圖上的更新支持,或者直接''UPDATE'底層表。我無法告訴你如何做到這一點,因爲*你仍然沒有提供視圖的定義*! (回答更新) –

+0

嗨,先生,我是postgresql db新手如何看到視圖的定義以及如何查看錶的結構。 – srinu

2

我對Postgres的9.5和觀點都默認更新。 例子:

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; 

會出來把Foo和Bar

+0

供參考 - 如果您使用「CREATE OR REPLACE」添加一列,必須將新列添加到選定列列表的末尾。 –