Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 触发器中的非更新列_Sql_Oracle_Plsql_Triggers - Fatal编程技术网

Sql 触发器中的非更新列

Sql 触发器中的非更新列,sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,我的问题是,下面详述的触发器似乎执行正确,除了update语句update My_dblist之外 设置passive_servername=v_newpassive,其中server=:NEW.server和dbname=:NEW.dbname似乎没有发生。旧记录已被删除并正确插入历史记录,但新记录的被动\u servername下未列出旧的活动服务器。我有一种感觉,这可能与它的自主性有关 create or replace TRIGGER cluster_check AFTER INSERT

我的问题是,下面详述的触发器似乎执行正确,除了update语句
update My_dblist之外
设置passive_servername=v_newpassive,其中server=:NEW.server和dbname=:NEW.dbname似乎没有发生。旧记录已被删除并正确插入历史记录,但新记录的被动\u 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;

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


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

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


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

谢谢,我采纳了您的建议,转而实现了多个触发器。你是一个非常聪明的人:)谢谢你,我采纳了你的建议,转而实现了多个触发器。你真是个聪明人:)