我试图阻止用户根据另一个表中的日期值更新一个表。
如果表 B 中的日期值早于 sysdate,则表 A 包含我希望使其不可编辑的行。
我需要以某种方式告诉触发器检查该行并使用表 A 的行中的外键来查询表 B 中的相应行,然后执行以下操作:
raise_application_error(-20000, '修改这条记录为时已晚');
谢谢你
假设这是一个家庭作业,你会想要这样的东西(我猜测表结构和基数,因为你没有指定)。
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
. 我们都可以提交我们的更改,并且没有任何东西会检测到我们的数据处于无效状态。