【问题标题】:Can I make an update trigger using data from one table to update another?我可以使用一个表中的数据创建更新触发器来更新另一个表吗?
【发布时间】:2020-12-10 01:12:20
【问题描述】:

当罚款(单独的表格)金额达到特定人员的 >=10 时,我正在尝试将 studentstaff 表中的暂停值从“否”更改为“是”。我也尝试过使用 IF,但似乎没有任何效果,因为我不断收到此错误:ORA-04079: invalid trigger specification。 “金额 NUMBER(8);”在代码中,因为它要求我申报金额。我正在使用 Oracle SQL。提前致谢。

CREATE TRIGGER new_suspension
AFTER UPDATE ON fine
FOR EACH ROW
    amount NUMBER(8);
BEGIN
CASE
WHEN Amount >= 10 THEN
UPDATE studentstaff
SET suspensions = 'yes'
WHERE library_card_no = '419746';
END CASE;
END;
/

【问题讨论】:

  • 为了从更改的行中引用amount,您需要使用:old.amount:new.amountlibrary_card_no 过滤器是否也需要从您的触发行中取出?
  • @AndrewSayer library_card_no 指的是我想更改的特定人员的暂停状态,但我认为没有必要。我对 SQL 很陌生,但据我所知,我应该像这样使用 :new 。 CREATE TRIGGER new_suspension AFTER UPDATE ON fine FOR EACH ROW amount NUMBER(8); BEGIN CASE WHEN (new.Amount >= 10) THEN UPDATE studentstaff SET suspensions = 'yes'; END CASE; END; / 但我仍然遇到同样的错误。

标签: oracle triggers sql-update


【解决方案1】:

这种trigger 的最佳选择是在trigger 上使用when 条件,如下所示:

CREATE OR REPLACE TRIGGER new_suspension
AFTER UPDATE ON fine
FOR EACH ROW
WHEN (NEW.AMOUNY >= 10)
BEGIN
   UPDATE studentstaff
   SET suspensions = 'yes'
   WHERE library_card_no = :new.LIBRARY_CARD_HOLDER;
END;
/

WHEN子句中写的条件满足时,这个trigger就会被执行。

【讨论】:

  • 这是唯一的!非常感谢!我最终删除了WHERE library_card_no = :new.LIBRARY_CARD_HOLDER;,因为是的,我认为它是多余的。非常感谢再次保持安全。
【解决方案2】:

没有看到你的表定义很难,但这里猜测你可能需要什么

CREATE OR REPLACE
TRIGGER new_suspension
AFTER UPDATE ON fine
FOR EACH ROW
BEGIN
 if :new.Amount >= 10 THEN  -- ie, the incoming AMOUNT on the FINE table
   UPDATE studentstaff
   SET suspensions = 'yes'
   WHERE library_card_no = :new.LIBRARY_CARD_HOLDER -- ie, the STUDENT being fined
 end if;
END;
/

希望这是有道理的,并且与您在这里的目标相近。在此示例中,我假设您的 FINE 表包含金额和借书证持有人(即学生等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 2021-04-14
    • 2011-02-10
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多