2012-07-26 83 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