有个需求,需要在基于A表的行级TRIGGER中更新B表某字段前先检查A表其他记录数,这会遇到变异表问题,由于更新A后又会触发更新B表,就在B表中执行上面的检查操作,结果发现多数情况可以执行过去,但少部分情况还是会有变异表问题发生,但重新操作又可以过,看起来这种方式有不确定性。环境为10g的DB.
解决的方法
1、按TOM提供的方式,在包中加公共变量,然后用表级trigger获取值,在行级trigger判断
2、用自治事务隔离操作。本例中采用后者较简单。在B表的行级before update中写一自治事务函数:
IF ... THEN
DECLARE
FUNCTION get_max_date(p_branch_no2 VARCHAR2) RETURN VARCHAR2 IS
PRAGMA AUTONOMOUS_TRANSACTION;
v_end_date varchar2
BEGIN
......
IF ... THEN
RETURN(v_end_date);
ELSE
RETURN(p_end_date);
END IF;
END;
BEGIN
:NEW.end_date := get_max_date(:NEW.branch_no2);
END;
END IF;
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8118583/viewspace-64851/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/8118583/viewspace-64851/