我的网站是使用在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
查询工作。 UPDATE
, INSERT
和DELETE
命令无法正常工作; 他们失败并出现上述错误。
这是一个permisssion问题? 语法错误? 别的东西?
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_view
在psql
和评论说你已经这样做了; 也许我可以指出的方式直接在基础表(一个或多个)上运行的更新。
您正在使用PostgreSQL(8.3)的一个非常过时的版本,所以你不能使用首选INSTEAD OF
触发器的方法,你必须使用规则或直接更新基础表。
仅供参考,涉及规则的接听/触发器被张贴后,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/
我对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