【问题标题】:Non-Updating column in trigger触发器中的非更新列
【发布时间】:2012-06-15 16:13:42
【问题描述】:

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

【问题讨论】:

    标签: sql oracle plsql triggers


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢,我采纳了您的建议,改为实现了多个触发器。你真是个聪明人:)
    猜你喜欢
    • 2013-09-09
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 2013-05-25
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多