10

我对数据库触发器和/或视图不太熟悉。我目前正在使用 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;但他们说触发器不能添加到视图中。

这(或功能相似的解决方案)可能吗?

4

7 回答 7

18

需要注意的是 PostgreSQL 9.1+ 支持视图触发器。请参阅WAITING FOR 9.1 – TRIGERS ON VIEWS以简要了解这一点。

于 2011-07-17T22:17:43.550 回答
7

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

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

于 2009-01-16T16:59:18.650 回答
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();
于 2009-01-16T16:53:24.637 回答
2

您可以使用规则而不是触发器(一个示例),但请记住规则是 PostgreSQL 特定的功能。

于 2009-01-16T22:04:41.433 回答
1

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

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

所以基本上你想要一个基表上的触发器。

于 2009-01-16T16:57:01.057 回答
1

如果您将触发器添加到具有与视图相同的条件的表中,这是可能的。

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

if (inserted.NUMBER > 5) {
   do something;
}
//do nothing if inserted.NUMBER is not > 5
于 2009-01-16T16:58:23.113 回答
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

于 2011-04-17T09:44:49.373 回答