在视图上执行触发器?

时间:2009-01-16 16:45:44

标签: postgresql triggers view hsqldb

我对数据库触发器和/或视图不太熟悉。我目前正在使用PostgreSQL和HSQL;虽然数据库不是太重要。我只是想知道任何数据库是否提供类似这样的内容:

我有一个(示例)表,如下所示:

CREATE TABLE DUMMY_TABLE (ID INTEGER, NUMBER INTEGER);

我创建了一个这样的视图:

CREATE VIEW DUMMY_VIEW AS SELECT * FROM DUMMY_TABLE WHERE NUMBER > 5;

我插入了几个实体:

INSERT INTO DUMMY_TABLE VALUES(1,2);
INSERT INTO DUMMY_TABLE VALUES(1,10);

当然,当我打电话

时,DUMMY_VIEW只包含VALUES(1,10)
SELECT * FROM DUMMY_VIEW

所以现在我要做的是为DUMMY_VIEW添加一个触发器,只要插入一个有NUMBER>的实体,就会调用该触发器。 5.

我尝试将触发器直接添加到HSQL和PostgreSQL中的DUMMY_VIEW;但他们说触发器无法添加到视图中。

这(或功能相似的解决方案)是否可行?

7 个答案:

答案 0 :(得分:12)

应该注意PostgreSQL 9.1+支持视图触发器。有关此内容,请参阅WAITING FOR 9.1 – TRIGGERS ON VIEWS

答案 1 :(得分:7)

是的,触发器不能直接放在视图上。您应该做的是在基表上放置一个触发器,并检查新的NUMBER行是否具有大于5的值。

注意:视图只是一个存储的select语句,因此它并不真正保存数据。这就是为什么人们无法检查是否在视图结构中插入,删除或更新数据。

答案 2 :(得分:2)

我认为你必须把触发器放在桌子上,而不是视图。

触发器可以在视图上使用查询,以便您DRY

触发器需要在视图而不是表格上还有其他原因吗?

回应评论的一个例子

-- Create function
CREATE FUNCTION doWhatIwant() RETURNS trigger AS '
BEGIN
IF NEW.number > 5 THEN
  do_stuff
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;

-- Create trigger
CREATE TRIGGER yourTrigger AFTER INSERT ON dummy_table
  FOR EACH ROW EXECUTE PROCEDURE doWhatIwant();

答案 3 :(得分:2)

您可以使用规则而不是触发器(an example),但请记住规则是PostgreSQL特有的功能。

答案 4 :(得分:1)

如果您使用与视图相同的条件将触发器添加到表中,则可以执行此操作。

触发器主体应具有以下内容:

if (inserted.NUMBER > 5) {
   do something;
}
//do nothing if inserted.NUMBER is not > 5

答案 5 :(得分:1)

HSQLDB 2.x支持可更新视图和可触发更新视图。

您的视图示例本身可以更新。因此,您可以使用视图而不是表来插入/删除/更新行。这不允许在插入和更新中包含NUMBER <= 5的行。

您还可以在视图上定义触发器。这些触发器使用INSTEAD OF INSERT,INSTEAD OF UPDATE或INSTEAD OF DELETE定义。在触发器的主体中,您可以检查值并为无效输入抛出异常,或将行插入基表。

请参阅http://hsqldb.org/doc/2.0/guide/triggers-chapt.html

答案 6 :(得分:0)

我不确定你想要达到什么目的。

触发器在数据更改时执行代码。视图是(比方说)“可调用的数据子集”。它几乎不存在,除非从中选择。它不能包含触发器,因为它包含没有。

所以基本上你想在基表上有一个触发器。