【问题标题】:PL/SQL Triggers to update selected rows in column in another tablePL/SQL 触发器更新另一个表中列中的选定行
【发布时间】:2014-03-10 20:41:10
【问题描述】:

我正在尝试为我的“rentals”表创建一个触发器,当前一个表中发生更新时,该触发器将更改另一个表中某个列 (“rent_avail”) 中的值。这个想法很简单:当 dvd 被退回到 dvd 商店时(即 date_return 有一个日期值,dvd 现在又可以出租了。因此,我有问题的记录 (dvd) 的“rent_avail”列应该反映这一点通过设置为“Y”(当当前租用 DVD 时,替代选项为“null”)。我的触发器正在创建而没有错误,但是在 date_return 列上插入后,我的 DVD 表中的所有值都被更改.我想知道如何简单地修改我的 DVD 表中“rent_avail”列中的列值,仅用于更新的行!这可能很简单,但我已经研究过了,似乎无法轻松找到解决方案..

CREATE OR REPLACE TRIGGER RENTAL_RETURNS
AFTER UPDATE OF DATE_RETURN ON RENTAL
FOR EACH ROW
BEGIN
    IF :OLD.DATE.RETURN IS NULL AND :NEW.DATE_RETURN IS NOT NULL THEN
        UPDATE DVD SET RENT_AVAIL = 'Y' WHERE DVD.DVD_ID = DVD_ID;
    END IF;
END;
/

【问题讨论】:

  • RENTAL 表中的 foreign_key 列 dvd_id 的名称是什么?
  • 我的外键是 RENTAL TABLE 和 DVD 表中的 DVD_ID..
  • 我是这么认为的:)。检查我的答案
  • 帮助很大,桑迪普。太感谢了。 :) 最后一个问题,新的代码改变了 DVD 表中的rent_avail 的值,但是如果我在 DVD 中插入一条新记录,或者插入一个新的出租实例,它会将rent_avail 中的所有值恢复为空,所以最近更新的记录中只会有一个“Y”...这是否需要另一个触发器?
  • 首先,如果您可以尝试删除 Trigger 并调整您的代码,但如果目前您还不能这样做,那么 trigger 很好,但请保留它在您未来的待办事项列表中删除触发器依赖项。

标签: plsql triggers sql-update multiple-tables


【解决方案1】:

您的更新语句不是从父表 rebtal 中选择 dvd_id,而是像 where dvd_id = dvd_id 一样进行评估,这将始终为 TRUE。只需 ad :OLD 限定符,您应该会很好,考虑到这与出租表中的列名 (dvd_id) 相同。

CREATE OR REPLACE TRIGGER RENTAL_RETURNS
AFTER UPDATE OF DATE_RETURN ON RENTAL
FOR EACH ROW
BEGIN
    IF :OLD.DATE.RETURN IS NULL AND :NEW.DATE_RETURN IS NOT NULL THEN
        UPDATE DVD SET RENT_AVAIL = 'Y' WHERE DVD.DVD_ID = :OLD.DVD_ID;
    END IF;
END;

【讨论】:

    【解决方案2】:

    在我看来,IF 语句中应该有一段下划线 - 我认为它应该是

    IF :OLD.DATE_RETURN IS NULL AND :NEW.DATE_RETURN IS NOT NULL THEN`
    

    分享和享受。

    【讨论】:

    • 请注意@Sandeep 对 DVD_ID 的评论是谜题的另一部分。分享和享受。
    猜你喜欢
    • 2012-04-20
    • 2013-01-25
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多