我对数据库触发器和/或视图不太熟悉。我目前正在使用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;但他们说触发器无法添加到视图中。
这(或功能相似的解决方案)是否可行?
答案 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定义。在触发器的主体中,您可以检查值并为无效输入抛出异常,或将行插入基表。
答案 6 :(得分:0)
我不确定你想要达到什么目的。
触发器在数据更改时执行代码。视图是(比方说)“可调用的数据子集”。它几乎不存在,除非从中选择。它不能包含触发器,因为它包含没有。
所以基本上你想在基表上有一个触发器。