如果更新了另一个表,则更新ORACLE TRIGGER表

ru9i0ody  于 2023-06-22  发布在  Oracle
关注(0)|答案(2)|浏览(119)

我想在更新另一个表时更改表的所有行中的字段。
我有一个游戏表,一个裁判表(带有nation_id)和国家表。
现在,如果有人更新裁判表中的nation_id,我想自动更新比赛表中的referee_nation_Name。
我的问题是我不知道当有人更新这个表中的nation_id时如何获得referee_id(它是唯一的)。如果我选择了所有的referee_id,比如:new.nation_id,我将从生活在这个国家的人那里得到其他的referee_id。以下是我的非工作触发器:

CREATE OR REPLACE TRIGGER name
AFTER UPDATE OF nation_id ON referee
FOR EACH ROW
DECLARE
    nationname VARCHAR2(150);
BEGIN
    SELECT n.name INTO nationname
            FROM nation n, referee r, game g
      WHERE n.nation_id = r.nation_id AND g.referee_id = :old.referee_id);
    UPDATE game SET referee_nation_Name = nationname WHERE referee_id = :old.referee_id;
END;
gwbalxhn

gwbalxhn1#

您知道您永远不会设计存储这种非规范化数据的数据模型,因为保持同步非常困难,您的讲师可能正在寻找类似于

CREATE OR REPLACE TRIGGER name
  BEFORE UPDATE OF nation_id ON referee
  FOR EACH ROW
DECLARE
    l_nationname VARCHAR2(150);
BEGIN
    SELECT name
      INTO l_nationname 
      FROM nation
     WHERE nation_id = :new.nation_id;

    UPDATE game
       SET referee_nation_name = l_nationname
     WHERE referee_id = :new.referee_id;
END;

当然,这并没有解决当有人更新nation表以更改name以及其他可能的漏洞时会发生什么。

of1yzvn4

of1yzvn42#

CREATE OR REPLACE TRIGGER name BEFORE UPDATE OF nation_id ON referee FOR EACH ROW DECLARE l_nationname VARCHAR2(150);开始SELECT name INTO l_nationname FROM nation WHERE nation_id =:new.nation_id;

UPDATE game
   SET referee_nation_name = l_nationname
 WHERE referee_id = :new.referee_id;

结束;

相关问题