2013-09-01 14 views
1

我拿到表所代表的表视图如何写上更新规则微不足道上刚刚给定的更新转发到由视图

CREATE TABLE test (
    id SERIAL, 
    name character varying NOT NULL, 
    PRIMARY KEY (id) 
); 

视图

CREATE VIEW TEST_VIEW AS 
SELECT id,name 
FROM test; 

,只是想将给定的更新队列转发到视图后面的实际表格

CREATE RULE TEST_VIEW_UPDATE 
AS ON UPDATE TO TEST_VIEW 
DO INSTEAD UPDATE TEST; 

但是这种方法导致e因为SET语句可能会丢失。我怎样才能以最通用的方式正确执行此操作(因此不限制实际更新的内容)?

回答

1

据我所知,它像这样做是不可能的,你必须写actual command

CREATE RULE TEST_VIEW_UPDATE 
AS ON UPDATE TO TEST_VIEW 
DO INSTEAD UPDATE TEST set name = NEW.name, col1 = NEW.col1 where id = NEW.id; 

也有可能做你想做什么用触发器 - 检查thisthis链接。

+0

但我怎么知道哪些参数是由NEW传递的,因为用户可能只想更新ID? 例如'UPDATE TEST_VIEW SET id = 1000 WHERE name ='bob'' – Sim

+1

所以你可以写'UPDATE TEST set name = NEW.name,col1 = NEW.col1 where id = NEW.id' - 更新所有可以更新的字段。如果用户只更新名称,则NEW.col1将与表中的相同,并且您只需在相同的值 –

+0

上更新它,请在您的评论中添加,我已经接受了您的答案 – Sim

3

在PostgreSQL 9.3上,这将自动工作,没有变化。 PostgreSQL将创建简单的视图默认为可更新。

在之前的版本中,指定UPDATE中的所有列。没有通配符。

如果您使用9.1或更高版本(您应该在每个问题中始终提到 - select version()),则应该使用INSTEAD OF视图触发器而不是规则。

+0

,但是如何防止用户无法更新这样的视图 - 也许他们没有权利这样做 – Sim

+1

@Sim不要授予他们'INSERT','UPDATE'和/或'DELETE'权限,或者使用'SECURITY BARRIER'视图。 SQL标准要求简单的视图是可更新的,PostgreSQL以前没有实现过。 –

+0

确定thx澄清 – Sim

相关问题