【问题标题】:Trying to create a trigger that updates a table when a value in another table is changed (oracle apex)尝试创建在另一个表中的值更改时更新表的触发器(oracle apex)
【发布时间】:2014-10-02 08:56:37
【问题描述】:

所以我有两张表,一张叫“device”,一张叫“devicerequest”

“设备”表的列包括 id(主键)、名称、数量,基本上有像“(1, iPhone, 3), (2, iPad, 1) 这样的数据,即:id=1 name =iPhone 数量=3。

“devicerequest”表包含 requestid(primary key)、deviceid、devicequantity 等列,并包含类似 (22, 1, 2) 的数据,这意味着它正在请求 2 个 iPhone。

所以基本上我试图在管理员确认请求时创建一个触发器(它们是“devicerequest”中的一个批准列(发出项目请求时为 NULL)并将其设置为“Y”,这意味着对请求,它应该通过减去请求的数字来更改设备中的数量列(它们是一个约束,以确保您不请求 devicequantity > quantity)。

所以我尝试了很多不同的变体,但仍然不断出错,这是我目前拥有的:

create or replace trigger "DEVICEREQUEST_T1"
before update on "DEVICEREQUEST"
for each row  

begin

if(:NEW.approval = 'Y')
then 
update device set device.quantity = device.quantity - devicerequest.devicequantity
where device.id = devicerequest.deviceid;

end if;
end;

我收到以下错误:

6 23 PL/SQL: ORA-00904: "DEVICEREQUEST"."DEVICEID": 标识符无效

5 5 PL/SQL:忽略 SQL 语句

我也试过这个:

create or replace trigger "DEVICEREQUEST_QUANTITY"
BEFORE
update of "APPROVAL" on "DEVICEREQUEST"
for each row
when (NEW.approval = 'Y')
begin
update device set quantity = quantity - devicequantity where id = deviceid;
end;​

我收到以下错误:

2 67 PL/SQL: ORA-00904: "DEVICEID": 无效标识符

2 1 PL/SQL:忽略 SQL 语句

我正在使用 Oracle Application Express 4.2.5,感谢您提供的任何帮助,我已经为此工作了一段时间,但无法找出问题所在。

【问题讨论】:

    标签: oracle plsql triggers oracle-apex


    【解决方案1】:

    您的 UPDATE 声明将类似于

    update device 
       set device.quantity = device.quantity - :new.devicequantity
     where device.id = :new.deviceid;
    

    当然,在实际系统中,如果管理员可以并行批准请求,您可以很容易地想出导致quantity 低于 0 的情况。

    您说您有一个约束来阻止devicequantity 超过quantity,但您不能有一个约束来比较表之间的数据。您可以有一个执行该验证的触发器。如果是这样,很可能您的触发器在多用户环境中不足以强制执行您期望它强制执行的约束。

    【讨论】:

    • 首先,非常感谢我尝试了这么久,我真的很感激。其次,这就是我的约束的工作方式: CONSTRAINT "QUANTITYCHECK" CHECK ("QUANTITY" >-1) ENABLE
    • 因此,如果发生这种情况,它将不允许管理员批准请求,但是我需要以某种方式为用户实施约束,这样他们就不会请求比可用设备更多的设备......任何建议?
    • @ilikeicecreamsandwiches - 你不能有一个约束来验证两个表中的数据。如果你想要一个约束,两列都需要在同一个表中。然而,从数据模型的角度来看,这没有任何意义。您可以编写一个触发器来强制执行该操作,但这与我在此处发布的触发器在多用户环境中的竞争条件问题相同。您可以创建一个快速可刷新的物化视图,该视图在提交时刷新,其中包含设备数量和未完成的请求总数,然后对物化视图创建约束。
    【解决方案2】:

    您可以在请求而不是批准时发布更新删除请求的金额。如果更新会导致数量降至零以下,您会收到错误消息,否则您已经“保留”了该数量待售,您不必担心之后的请求会非常接近。请求获得批准后,您将锁定该金额,如果未获批准,请更新数量以“退回”预留金额。

    您可能需要根据请求和批准之间的时间长度和/或是否有某种方法可以确定批准/不批准的可能性来调整流程。例如,您可以保留请求金额的 50%,而不是全部用于较低概率的请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-22
      • 1970-01-01
      • 2011-02-10
      • 2019-05-13
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      相关资源
      最近更新 更多