0

我试图阻止用户根据另一个表中的日期值更新一个表。

如果表 B 中的日期值早于 sysdate,则表 A 包含我希望使其不可编辑的行。

我需要以某种方式告诉触发器检查该行并使用表 A 的行中的外键来查询表 B 中的相应行,然后执行以下操作:

raise_application_error(-20000, '修改这条记录为时已晚');

谢谢你

4

1 回答 1

0

假设这是一个家庭作业,你会想要这样的东西(我猜测表结构和基数,因为你没有指定)。

CREATE OR REPLACE TRIGGER trigger_name
  AFTER UPDATE ON a
  FOR EACH ROW
DECLARE
  l_dt_b b.dt_col%type;
BEGIN
  SELECT dt_col
    INTO l_dt_b
    FROM b
   WHERE b.b_key = :new.b_key;

  IF( l_dt_b < sysdate )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 'Too late' );
  END IF;
END;

但是,如果这是针对真实系统的,则基于触发器的验证是有问题的。例如,在多用户系统中它是不安全的。在会话 1 中,我可能已经修改了 B 中的行,但尚未提交更改。然后,您可以查询会话 2 中的行,查看旧值,并允许UPDATE. 我们都可以提交我们的更改,并且没有任何东西会检测到我们的数据处于无效状态。

于 2013-04-14T20:26:36.690 回答