1

以下是我的表结构:

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,则在“客户”表更新后会触发在“黑名单”表中插入记录。如果 ,我们认为客户被列入黑名单,

  • 客户表中的黑名单列作为值“Y”和。
  • 黑名单和原因表中存在客户记录

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

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

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

4

3 回答 3

3

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

这是通过create trigger 语句的FOLLOWS ...and选项完成的:PRECEEDS ...

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

关注 | 之前

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

使用 FOLLOWS 指示正在创建的触发器必须在指定的触发器之后触发。您可以为常规触发器或前向跨版触发器指定 FOLLOWS。

使用 PRECEDES 指示正在创建的触发器必须在指定的触发器之前触发。您只能为反向跨版触发器指定 PRECEDES。

于 2013-07-17T08:16:25.847 回答
1

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

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

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

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

于 2013-07-17T07:35:27.043 回答
1

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

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

或者,如果您需要多个原因代码,则只需使用引用客户 ID 和原因代码的 blacklist_reason 表——我认为您甚至不需要客户表中的黑名单列。

于 2013-07-17T08:16:12.250 回答