Kurz (tl; dr): Beim Versuch, Zeilen löschen während eines MERGE
scheint Oracle 10g ON DELETE CASCADE
Anweisungen für Fremdschlüssel zu ignorieren. Ich würde gerne wissen, ob das ein bekannter Bug ist, ein Feature (anscheinend in 11g abgekündigt), oder was.MERGE und ON DELETE CASCADE in Oracle XE 10g
Mehr im Detail:
Es scheint mir, dass in Oracle XE 10g, Zeilen aus einer Tabelle innerhalb einer MERGE
Anweisung führt zu einem ORA-02292-Fehlern (Verletzung der referenziellen Integrität) zu löschen versuchen , wenn eine ist Fremdschlüssel, der auf die Zieltabelle der Zusammenführung verweist, auch wenn ON DELETE CASCADE
in der Fremdschlüsseleinschränkung angegeben wurde. Zum Beispiel sagen, dass ich drei Tabellen
CREATE TABLE Mysource(
MykeyS NUMBER,
MystringS VARCHAR2(10),
CONSTRAINT Mysource_PK PRIMARY KEY(MykeyS) ENABLE
);
CREATE TABLE Mydest(
MykeyD NUMBER,
MystringD VARCHAR2(10),
CONSTRAINT Mydest_PK PRIMARY KEY(MykeyD) ENABLE
);
CREATE TABLE Myother(
Mykey NUMBER,
Mydate DATE,
CONSTRAINT Myother_FK FOREIGN KEY(Mykey)
REFERENCES Mydest(MykeyD) ON DELETE CASCADE ENABLE
);
und einige Daten in ihnen erstellen einzufügen, dann
MERGE INTO Mydest D
USING Mysource S
ON (D.MykeyD=S.MykeyS)
WHEN MATCHED THEN
UPDATE SET D.MystringD = S.MystringS
DELETE WHERE (S.MykeyS > 10)
WHEN NOT MATCHED THEN
INSERT (MykeyD, MystringD)
VALUES (S.MykeyS, S.MystringS)
WHERE (S.MykeyS <= 10)
versuchen Wenn beide Mydest
und Myother
einige Zeilen hatte mit> 10 Schlüssel, würde der Versuch MERGE dann Ergebnis in einem ORA-02292, behauptet eine Verletzung der Myother_FK
Einschränkung. Das klingt für mich unlogisch (ich kann Zeilen von Mydest
mit einer direkten DELETE
, aber nicht mit einer MERGE
löschen?), Und tatsächlich scheint es nicht mit Oracle XE 11g passieren.
Frage: Wissen Sie, ob dies ein bekannter Fehler oder eine seltsame Funktion ist? Oder vermisse ich etwas, vielleicht? Die Suche im Internet hat bisher nicht viel geholfen.
Guter Fang. Ich denke, es ist ein Fehler in 10g. Reproduziert mit meinem eigenen Testfall auf Oracle 10.2.0.4. Geprüft am 11.2.0.1. –
Oracle hat es als Fehler 8268746 in 10.2.0.3 aufgeführt, behoben in 11.2. Der Work-Around ist nicht zu fusionieren :) – Glenn
C'mon, @Glenn, legte das als Antwort! –