2012-03-31 8 views
4

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.

+1

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. –

+2

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

+1

C'mon, @Glenn, legte das als Antwort! –

Antwort

2

Oracle hat es als Fehler 8268746 in 10.2.0.3 aufgeführt. Es ist in 11.2 behoben. Das Dokument ist nicht für die externe Verknüpfung verfügbar, bietet jedoch einen Testfall, der dem in der obigen Frage angegebenen Beispiel ähnelt. Die Problemumgehung besteht darin, die Zusammenführungsanweisung nicht zu verwenden (oder auf 11.2 zu aktualisieren).

+0

Danke nochmal! Ist _für die externe Verknüpfung nicht verfügbar_ bedeutet, dass es dafür keine "offizielle" und überprüfbare Quelle gibt? – fudo

+1

@fudo Wenn Sie einen Supportvertrag haben, können Sie sich bei metalink.oracle.com anmelden und ihre Fehlerdatenbank durchsuchen. Geben Sie die Fehlernummer ein und Sie werden es finden. Sie benötigen jedoch einen Login, um auf die Seite zugreifen zu können. – Glenn

+0

uh ... Ich habe einen Oracle-Login (ich musste es erstellen, um Oracle XE 11g herunterladen), aber ich glaube nicht, dass ich einen _support-Vertrag_ habe. Danke trotzdem :) – fudo

Verwandte Themen