以下是我的表结构:
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,则在“客户”表上更新后会触发记录在“黑名单”表中。 如果,
,我们会将客户视为黑名单现在我的要求是将客户从后端列入黑名单。为此我正在使用以下查询编写存储过程:
现在要在Reason表中插入条目(步骤3),我需要BlacklistID这是一个外键,一旦客户表上的触发器得到规定,我将获得BlacklistID的值。所以我的困惑是,我可以假设在cntrl到达我的INSERT INTO reason(步骤3)语句之前,将始终触发更新'Customer'表的触发器。请建议。
答案 0 :(得分:2)
如果您需要确定触发器执行的顺序,可以在创建触发器时指定此顺序。
使用create trigger语句的FOLLOWS ...
和PRECEEDS ...
选项完成此操作:
手册中的更多详细信息:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CJAEJAFB
跟进| PRECEDES
指定具有相同时间点的触发器的相对触发。它在创建交叉触发时特别有用,它必须按特定顺序触发以实现其目的。
使用FOLLOWS指示正在创建的触发器必须在指定的触发器之后触发。您可以为常规触发器或前向交叉触发器指定FOLLOWS。
使用PRECEDES指示正在创建的触发器必须在指定的触发器之前触发。您只能为反向交叉触发指定PRECEDES。
答案 1 :(得分:1)
是。触发器是声明的一部分。虽然您无法完全确定执行同一语句中多个触发器的顺序,但您可以确定它们是在语句本身完成时完成的。因此,到第2步时,第1步的所有更新触发器都已触发。
*)实际上,默认顺序是:
但是,如果您在触发前有两个行级别,默认情况下您无法确定这两个行的执行顺序。但是我从评论中了解到,在Oracle 11中,您实际上可以指定顺序来覆盖这些情况。
答案 2 :(得分:1)
我认为不需要所有这些表,因此不需要触发器。
为什么不在客户表中使用黑名单原因代码?黑名单表的目的不明确,因为它似乎没有添加任何数据,只是使用额外的id列重复客户表中的数据?
或者,如果您需要多个原因代码,那么只需使用引用客户ID和原因代码的blacklist_reason表 - 我认为您甚至不需要客户表中列入黑名单的列。