更新视图时如何更新表?

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) 如果我使用它,我会得到列:numidst_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 中的变量?

plsql表更新后视图未更新

底层表更改时更新物化视图

触发器导致在视图中使用的表上插入后,如何进行 MYSQL 视图更新

如何仅在数据库发生更改时更新角度视图