Oracle存储过程中触发器和语句的执行顺序



以下是我的表结构:

Table -Customer
CustomerID Blacklisted Customer Name
101 Y ABC
102 Y DEF
Table -Blacklist
CustomerID BlacklistID Customer Name
101 1011 ABC
102 1012 DEF
Table -Reason
BlacklistID ReasonID Reason Code
1012 02 Rcode2

主表"客户"用于存储客户信息。如果有人将客户表中的黑名单更新为Y,则在更新表"客户"后会触发在表"黑名单"中插入记录。如果

  • 将Customer表中的列列入黑名单,作为值"Y"和
  • 黑名单和原因表中存在客户的记录

现在我的要求是从后台将客户列入黑名单。为此,我正在编写带有以下查询的存储过程:

  1. 更新客户集blacklisted='Y',其中customerid='102'
  2. 从黑名单中选择BlacklistID到var_id,其中customerid='102'
  3. 插入原因(BlacklistID,ReasonID,reason Code)值(var_id,111,'RCODE1')

现在要在Reason表中插入条目(步骤3),我需要BlacklistID,这是一个外键,一旦客户表上的触发器被执行,我将获得BlacklistID的值。所以我的困惑是,我可以假设在cntrl到达我的INSERT INTO原因(第3步)语句之前,"Customer"表更新的触发器总是会被执行吗。请提出建议。

如果需要确定触发器执行的顺序,可以在创建触发器时指定此顺序。

这是通过create触发器语句的FOLLOWS ...PRECEEDS ...选项完成的:

手册中的更多详细信息:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CJAEJAFB

遵循|优先顺序

指定具有相同时间点的触发器的相对触发。它在创建交叉版本触发器时特别有用,因为交叉版本触发器必须按特定顺序激发才能实现其目的。

使用FOLLOWS指示创建的触发器必须在指定触发器之后激发。您可以为传统触发器或前向交叉编辑触发器指定FOLLOWS。

使用PRECEDES指示创建的触发器必须在指定触发器之前激发。只能为反向交叉编辑触发器指定PRECEES。

是。触发器是语句的一部分。尽管您不能完全确定同一语句中多个触发器的执行顺序,但您可以确定,当语句本身完成时,它们都完成了。因此,到第2步时,第一步的所有更新触发器都已启动。

*)实际上,默认顺序是:

  1. 触发器之前的语句级别
  2. 触发器之前的行级别
  3. 触发器后的行级别
  4. 触发器后的语句级别

但是,如果在触发器之前有两个行级别,默认情况下,您无法确定这两个级别的执行顺序。但我从评论中了解到,在Oracle11中,您实际上可以指定顺序来覆盖这些情况。

我认为不需要所有这些表,因此不需要触发器。

为什么不在客户表中使用黑名单原因代码?黑名单表的用途不清楚,因为它似乎没有添加任何数据,只是重复客户表中的数据,并添加一个额外的id列?

或者,如果您需要多个原因代码,那么只需使用一个引用客户id和原因代码的blacklist_reason表——我认为您甚至不需要客户表中的blacklisted列。

最新更新