oracle中触发器之前和之后的差异

时间:2010-09-05 12:52:47

标签: sql oracle10g

有人可以通过示例解释oracle 10g中“之前”和“之后”触发器之间的区别吗?

3 个答案:

答案 0 :(得分:29)

首先,我将通过定义触发器来开始我的答案:触发器是在添加,修改或删除行时运行的存储过程。

触发器可以之前执行操作或 AFTER 执行操作。

在接受更改之前需要进行验证时,通常会使用

BEFORE个触发器。它们在对数据库进行任何更改之前运行。假设您为银行运行数据库。您有一个表accounts和一个表transactions。如果用户从他的帐户中提款,您可能希望确保用户在其帐户中有足够的信用额度来提取。如果BEFORE中的余额不足,transactions触发器将允许执行此操作并阻止将行插入accounts

当由于更改而需要在单独的表中更新信息时,通常会使用

AFTER个触发器。它们在对数据库进行更改后运行(不一定已提交)。让我们回到我们的后面的例子。成功完成交易后,您需要在balance表中更新accountsAFTER触发器可以让您完全执行此操作。

答案 1 :(得分:7)

我不完全确定你有兴趣知道什么,所以我会保持这个基础。

触发前

  • 根据名称,在表中创建行之前会触发这些触发器。随后,由于尚未创建行,因此您可以完全访问:new.table_element字段。如果试图插入/更新不需要的/格式错误的数据,这允许数据清理和一致性。这只是一个基本示例,但您需要在需要访问“:new”数据时使用before触发器。

触发后

  • 由于在创建了行之后触发了after触发器,因此当您希望逻辑因行而发生时,通常会使用这些触发器。例如,如果您有一个地址表并且用户更新了他/她的地址,那么您可能希望在创建时更新外部参照表中的地址引用ID(如果您恰好也保留了所有旧地址)。此外,与before触发器不同,您无权修改任何列值,因为表中已存在该行。

答案 2 :(得分:1)

当触发操作应确定是否允许触发语句完成时,使用BEFORE TRIGGER。使用BEFORE TRIGGERS用户可以消除不必要的触发语句处理 但是,在执行触发操作之前触发语句应该完成后使用触发器。