2012-07-26 65 views
1

我想在更新視圖時更新表格。我使用postgresql/postgis。如何在更新視圖時更新表格?

我創建視圖。

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

現在當它更新時,我想用這些數據更新TABLE。但我聽說觸發器不能在VIEW中輸入。那麼如何做到這一點?

現在,我使用這個功能

CREATE OR REPLACE FUNCTION update_table() RETURNS TRIGGER AS ' 
BEGIN 
UPDATE filedata SET id=NEW.id, the_geom=ST_TRANSFORM(NEW.st_transform,70066) where num=NEW.num ; 
END; 
' LANGUAGE plpgsql; 

的罰款。但另一個問題。如何添加觸發器來查看我這樣做

CREATE TRIGGER up_table AFTER UPDATE ON filedata_view 
FOR EACH ROW EXECUTE PROCEDURE update_table(); 

,但得到的錯誤

ERROR: "filedata_view" is not a table. 

UPDATE

如何,如果我用這個,我得到列集列名AS SELECT num, id, ST_TRANSFORM(the_geom,900913)numidst_transform。如何將第三列的名稱設置爲the_geom

+1

http://www.postgresql.org/docs/9.1/static/sql-createtrigger.html表示可以在視圖上設置觸發器。但是AFAIK這是PG 9.1的一個新功能。 – LisMorski 2012-07-26 08:14:10

+0

函數似乎在'WHERE'之後被切斷。請更新該部分。 – 2012-07-26 08:23:27

+1

Kliver,@LisMorski說你必須使用PostgreSQL 9.1才能在視圖上使用觸發器。您正在使用舊版本。升級(最好)或者如果你真的無法升級,請改用'RULE';看到我的答案中的鏈接。 – 2012-07-26 08:52:21

回答

6

對於PostgreSQL 9.1及更高版本,請在視圖上使用DO INSTEAD trigger。查看觸發器不太容易得到正確的結果,並且不易發生奇怪的多重評估問題等。

對於PostgreSQL 9.0及更低版本,您應該使用rule system - 請參閱CREATE RULE ... DO INSTEAD。通常情況下,更新到9.1並使用視圖觸發器(如果可能的話)更好,尤其是對於新用戶。規則是棘手的事情。

+0

你能舉例說明如何使用RULE進行觸發嗎? – 2012-07-26 09:06:08

+0

@KliverMax觸發器和規則是不同的事情。你不用規則觸發,你可以使用'DO INSTEAD'規則直接通過重寫來創建可更新的視圖。如果你不能通過閱讀上面鏈接的文檔來實現,那麼我強烈建議你升級到PostgreSQL 9.1並使用視圖觸發器,因爲規則不適用於初學者。文檔中有一些示例。 – 2012-07-26 09:19:56

+0

太難了。我創建觸發器而不是觸發器來查看。 – 2012-07-26 10:10:07