我试图阻止用户根据另一个表中的日期值更新一个表。
如果表B中的日期值早于sysdate,表A包含我想要不可编辑的行。
我需要以某种方式告诉触发器检查行并使用表A行中的外键来查询表B中的相应行,然后执行此操作:
raise_application_error(-20000,'改变此记录为时已晚');
谢谢
答案 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
。我们都可以提交我们的更改,没有任何东西会检测到我们的数据处于无效状态。