我的问题是,下面详述的触发器似乎正确执行,除了更新语句UPDATE my_dblist
SET passive_servername = v_newpassive WHERE server = :NEW.server AND dbname = :NEW.dbname;
似乎没有发生的事实。旧记录将被删除并正确插入历史记录,但新记录没有在passive_servername下列出旧的活动服务器。我觉得这可能与它自治有关吗?
create or replace
TRIGGER cluster_check
AFTER INSERT ON my_dblist
FOR EACH ROW
DECLARE
pragma autonomous_transaction;
v_duplicates NUMBER;
v_newpassive varchar2(30);
BEGIN
SELECT count(*) INTO v_duplicates FROM my_dblist WHERE passive_servername = :new.server and dbname = :new.dbname order by 1;
IF v_duplicates > 0
THEN
SELECT server INTO v_newpassive FROM my_dblist WHERE passive_servername = :NEW.server AND dbname = :NEW.dbname ORDER BY 1;
UPDATE my_dblist
SET passive_servername = v_newpassive WHERE server = :NEW.server AND dbname = :NEW.dbname;
INSERT INTO my_dblist_history
SELECT * FROM my_dblist WHERE passive_Servername = :NEW.server AND dbname = :NEW.dbname;
DELETE FROM my_dblist
WHERE passive_Servername = :NEW.server AND dbname = :NEW.dbname;
END IF;
commit;
END;
答案 0 :(得分:5)
您的触发器被声明为使用自治事务。这几乎总是一个错误,除非触发器的唯一目的是记录尝试更改要保留的数据行,无论更改是否最终成功提交。在这种情况下,它也可能是您的问题的根源。由于触发器是自治事务,因此无法查看触发语句所做的未提交更改。例如,您的UPDATE
语句将看不到导致触发器被触发的行,因为根据定义,这些行是在不同事务中完成的未提交工作。
你能退后一步,准确解释你想要解决的问题吗?我假设您正在尝试使用自治事务来解决变异表异常。这几乎总是一个错误。变异表异常几乎普遍表明您有数据模型问题,因此您可以更好地修复数据模型,而不是解决错误。如果无法更正数据模型,则需要使用多个触发器来解决变异表错误。