Oracle触发器仍为新触发器保留旧值
在用户通过在线应用程序更新地址表后,我编写了一些触发器来自动更改建立表中state_id字段的值。问题是,当用户更新tble地址中的OTHER_STATE_ID=16和POSTAL_STATE_ID=16时,表建立中OTHER_STATE_ID的值仍然携带旧值。只有邮政_STATE_ID字段用新值更新。我已经检查了触发代码,没有发现任何奇怪的代码。触发器似乎保留旧值以更新其他\u状态\u id。以下是数据场景:-Oracle触发器仍为新触发器保留旧值,oracle,plsql,triggers,Oracle,Plsql,Triggers,在用户通过在线应用程序更新地址表后,我编写了一些触发器来自动更改建立表中state_id字段的值。问题是,当用户更新tble地址中的OTHER_STATE_ID=16和POSTAL_STATE_ID=16时,表建立中OTHER_STATE_ID的值仍然携带旧值。只有邮政_STATE_ID字段用新值更新。我已经检查了触发代码,没有发现任何奇怪的代码。触发器似乎保留旧值以更新其他\u状态\u id。以下是数据场景:- 更新前(地址表) 对于地址类型=1,值位置状态ID=8 对于地址类型=2,值为邮
- 对于地址类型=1,值位置状态ID=8
- 对于地址类型=2,值为邮政状态ID=8
- 对于地址类型=11,值其他状态ID=8
- 值位置\状态\ ID=8
- value POSTAL_STATE_ID=8
- 值其他状态ID=8
- 用户更新值位置\状态\ ID=8
- 对于地址类型=2,值为邮政状态ID=16
- 对于地址类型=11,值其他状态ID=16
- 值位置\状态\ ID=8
- value POSTAL_STATE_ID=16
- 值其他状态ID=8
创建或替换
触发“TR_ADDRESS_EE”
插入或更新后
住址
每行
开始
如果插入
然后
如果(:NEW.STATE_ID不为空)
然后
如果(:NEW.RECORD\u TYPE\u ID=401)
然后
如果(:NEW.ADDRESS_TYPE=1)
然后
更新编制
设置位置\u状态\u ID=:NEW.STATE\u ID
其中,机构\u ID=:NEW.RECORD\u ID;
ELSIF(:NEW.ADDRESS_TYPE=2)
然后
更新编制
设置邮政_状态_ID=:NEW.STATE_ID
其中,机构\u ID=:NEW.RECORD\u ID;
ELSIF(:NEW.ADDRESS_TYPE=11)
然后
更新编制
设置其他_状态_ID=:NEW.STATE_ID
其中,机构\u ID=:NEW.RECORD\u ID;
如果结束;
如果结束;
如果结束;
ELSIF更新('STATE_ID'))
然后
IF(:OLD.RECORD\u TYPE\u ID=401和:NEW.STATE\u ID:OLD.STATE\u ID)
然后
如果(:NEW.ADDRESS_TYPE=1)
然后
更新编制
设置位置\u状态\u ID=:NEW.STATE\u ID
其中,机构\u ID=:OLD.RECORD\u ID;
ELSIF(:NEW.ADDRESS_TYPE=2)
然后
更新编制
设置邮政_状态_ID=:NEW.STATE_ID
其中,机构\u ID=:OLD.RECORD\u ID;
ELSIF(:NEW.ADDRESS_TYPE=11)
然后
更新编制
设置其他_状态_ID=:NEW.STATE_ID
其中,机构\u ID=:OLD.RECORD\u ID;
如果结束;
如果结束;
如果结束;
结束;
. 也许您需要(通过编辑问题,而不是作为注释)显示您的表创建语句以及所有insert和update语句,以查看它们的不同之处,因为我必须编写这些语句。不过,我不建议尝试通过触发器维护重复数据;为什么不在
地址
上查看建立
?目的是通过触发器维护重复数据,因为地址表由不同的模块使用。所以机构应该有从各种来源更新的最新状态id,你确定没有其他触发器更新机构表吗?是的。我放下并重新创建触发器。有时它会显示正确的结果。但过了一会儿,错误又回来了。我需要再修一次扳机吗?
create or replace
TRIGGER "TR_ADDRESS_EE"
AFTER INSERT OR UPDATE
ON ADDRESS
FOR EACH ROW
BEGIN
IF INSERTING
THEN
IF (:NEW.STATE_ID IS NOT NULL)
THEN
IF (:NEW.RECORD_TYPE_ID = 401)
THEN
IF (:NEW.ADDRESS_TYPE = 1)
THEN
UPDATE ESTABLISHMENT
SET LOCATION_STATE_ID = :NEW.STATE_ID
WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID;
ELSIF (:NEW.ADDRESS_TYPE = 2)
THEN
UPDATE ESTABLISHMENT
SET POSTAL_STATE_ID = :NEW.STATE_ID
WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID;
ELSIF (:NEW.ADDRESS_TYPE = 11)
THEN
UPDATE ESTABLISHMENT
SET OTHER_STATE_ID = :NEW.STATE_ID
WHERE ESTABLISHMENT_ID = :NEW.RECORD_ID;
END IF;
END IF;
END IF;
ELSIF UPDATING ('STATE_ID')
THEN
IF (:OLD.RECORD_TYPE_ID = 401 AND :NEW.STATE_ID <> :OLD.STATE_ID)
THEN
IF (:NEW.ADDRESS_TYPE = 1)
THEN
UPDATE ESTABLISHMENT
SET LOCATION_STATE_ID = :NEW.STATE_ID
WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID;
ELSIF (:NEW.ADDRESS_TYPE = 2)
THEN
UPDATE ESTABLISHMENT
SET POSTAL_STATE_ID = :NEW.STATE_ID
WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID;
ELSIF (:NEW.ADDRESS_TYPE = 11)
THEN
UPDATE ESTABLISHMENT
SET OTHER_STATE_ID = :NEW.STATE_ID
WHERE ESTABLISHMENT_ID = :OLD.RECORD_ID;
END IF;
END IF;
END IF;
END;