0

我的问题是下面详述的触发器似乎正确执行,除了更新语句 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;
4

1 回答 1

5

您的触发器被声明为使用自治事务。这几乎总是一个错误,除非触发器的唯一目的是记录更改您想要保留的一行数据的尝试,无论更改最终是否成功提交。在这种情况下,它也可能是您的问题的根源。由于触发器是一个自治事务,它无法看到触发语句所做的未提交更改。例如,您的UPDATE语句将看不到导致触发触发器的行,因为根据定义,这些行是在不同事务中完成的未提交工作。

你能退后一步,准确地解释你要解决的问题吗?我假设您正在尝试使用自治事务来解决变异表异常。这几乎总是一个错误。变异表异常几乎普遍表明您有数据模型问题,因此修复数据模型比解决错误要好得多。如果您无法更正数据模型,则需要使用多个触发器来解决变异表错误。

于 2012-06-15T16:26:40.570 回答