触发器中的非更新列

Bra*_*sel 0 sql oracle triggers plsql

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

Jus*_*ave 5

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

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