尝试创建一个触发器,以防止基于另一个表的值进行更新

时间:2013-04-14 20:19:54

标签: oracle plsql

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

如果表B中的日期值早于sysdate,表A包含我想要不可编辑的行。

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

raise_application_error(-20000,'改变此记录为时已晚');

谢谢

1 个答案:

答案 0 :(得分: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。我们都可以提交我们的更改,没有任何东西会检测到我们的数据处于无效状态。