更新视图时如何更新表?
Posted
技术标签:
【中文标题】更新视图时如何更新表?【英文标题】:How to update table when view is updated? 【发布时间】:2012-07-26 07:19:36 【问题描述】:我想在她的视图更新时更新表格。我使用 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.
更新
如何设置列名AS SELECT num, id, ST_TRANSFORM(the_geom,900913)
如果我使用它,我会得到列:num
、id
和 st_transform
。如何将第三列的名称设置为the_geom
?
【问题讨论】:
postgresql.org/docs/9.1/static/sql-createtrigger.html 表示可以在视图上设置触发器。但 AFAIK 这是 PG 9.1 中的一个新功能。WHERE
后面的功能好像被切断了。请更新该部分。
Kliver,正如@LisMorski 所说,您必须使用 PostgreSQL 9.1 才能在视图上使用触发器。您使用的是旧版本。升级(最好)或者如果你真的不能升级,使用RULE
代替;请参阅我的答案中的链接。
用户在此处发布了一个后续问题,以防以后有人阅读:***.com/questions/11681852/…
对于您的“更新”问题:要将列名从 st_transform
更改为 the_geom
,请将 AS the_geom
添加到您的选择语句中。
【参考方案1】:
对于 PostgreSQL 9.1 及更高版本,在视图上使用 DO INSTEAD trigger。视图触发器的正确性要小得多,并且在多重评估等方面不太容易出现奇怪的问题。
对于 PostgreSQL 9.0 及更低版本,您应该使用rule system - 请参阅CREATE RULE ... DO INSTEAD。如果可能的话,通常最好更新到 9.1 并使用视图触发器,尤其是对于新用户。规则是棘手的事情。
【讨论】:
你能举例说明如何用规则触发吗? @KliverMax 触发器和规则是不同的东西。您不使用规则触发,而是使用DO INSTEAD
规则通过重写直接创建可更新视图。如果您无法通过阅读我上面链接的文档来做到这一点,那么我非常强烈建议您升级到 PostgreSQL 9.1 并使用视图触发器,因为规则不是适合初学者。文档中有示例。
太难了。我创建表的触发器而不是视图的触发器。以上是关于更新视图时如何更新表?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MS Access 数据表视图中使用存储过程更新表数据
如何使用 SheetView 函数调用更新 ContentView 中的变量?