0

如何创建一个触发器来检查已创建视图的一个字段。基本上,我的视图表中的一个字段显示添加到数据库的产品总量。触发器将具有指定的最大总量,因此当添加到数据库的产品总和达到最大值时,触发器应提醒用户并使其无法添加更多产品。

顺便说一句,我不确定使用视图设置触发器是否是实现目标的最佳方式。我正在使用 Oracle 11g

4

2 回答 2

1

听起来您希望触发逻辑基于表的多行,并处理各种会话对表的同时修改。

这是行不通的,因为每个会话在提交之前无法看到其他人所做的更改,因此两个会话可以同时向系统添加行,看到它们本身没有超出产品限制,然后提交。更改的组合可以超过限制。

唯一安全的方法是对表进行序列化修改(DBMS_Lock 是最好的机制),或者使用快速提交刷新物化视图将要检查的数量加到单个行中,并设置约束该列(这实际上也是一个序列化机制)。

于 2013-05-07T08:29:08.797 回答
1

我不确定您的视图看起来如何,但是您可以设置一个 AFTER INSERT OR UPDATE TRIGGER(所以,不是每个行触发器),它可以像

v_amt number;
BEGIN
  select sum(amount) into v_amt from products_table;
  if v_amt > certain_amount then raise_application_error(-200001,'You cannot add more than '||certain_amount||' amount into the database');
  end if;
END;

您也可以在插入之后和提交之前在应用层执行此操作。但是如果你有很多数据源,那么对数据库层的约束会更好。

于 2013-05-07T05:58:33.487 回答