无法更新有何看法?(Cannot update view?)

2019-07-03 11:12发布

我的网站是使用在Ubuntu 11.10一个PostgreSQL 8.3服务器上的Drupal 6的运行发展。 另外的Webmin版本1.590。

现在,我想在一个表中更新记录,但是当我运行:

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

它给了我这样的错误:

未能执行SQL:SQL UPDATE uac_institution_view将状态设置= '2' WHERE NID = '9950' 失败:错误:无法更新视图提示:你需要一个无条件的ON UPDATE DO INSTEAD规则。

问题是,只有SELECT查询工作。 UPDATEINSERTDELETE命令无法正常工作; 他们失败并出现上述错误。

这是一个permisssion问题? 语法错误? 别的东西?

Answer 1:

PostgreSQL的观点是不是默认更新。 你想怎么视图更新时,您必须告诉PostgreSQL的。

做到这一点使用“无条件ON UPDATE DO INSTEAD规则”(如要粘贴该错误消息表示)或优选上的PostgreSQL 9.1及以上的使用的视图触发。 我提供了链接,所有我的回答你以前的帖子 ,但这里的一些信息:

  • 在9.1的PostgreSQL更新视图使用INSTEAD OF触发器
  • 可更新视图(PG 9.0和下面,使用规则)
  • CREATE TRIGGER
  • CREATE VIEW
  • 规则VS触发器
  • 规则
  • 触发用PL / pgSQL

在许多情况下,最好离开视图只读,只更新基础表。 既然你没有提供的视图的定义很难说什么会真正涉及。 与运行的输出更新您的问题\d uac_institution_viewpsql和评论说你已经这样做了; 也许我可以指出的方式直接在基础表(一个或多个)上运行的更新。

您正在使用PostgreSQL(8.3)的一个非常过时的版本,所以你不能使用首选INSTEAD OF触发器的方法,你必须使用规则或直接更新基础表。



Answer 2:

仅供参考,涉及规则的接听/触发器被张贴后,PostgreSQL的9.3推出了自动更新视图。 9.3版是在Beta 2中2013年6月27日,所以它没有GA。

下面是一个例子: https://web.archive.org/web/20160322164044/http://michael.otacoo.com/postgresql-2/postgres-9-3-feature-highlight-auto-updatable-views/



Answer 3:

我对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



文章来源: Cannot update view?