2016-11-22 3 views
0

Ich habe einen Fremdschlüssel in der Tabelle B auf die Tabelle A. Was ich will, ist auf Datensatz in A entfernen, verwenden Sie Kaskade löschen ODER Kaskadierung gesetzt NULL im FK Feld in B hängt von der Wert in einer Spalte dieses Datensatzes, der entfernt werden sollte.Orakel auf löschen Kaskade mit Bedingung

Soweit ich Zustand in löschen Kaskade verwenden kann nicht, war meine Ideen immer Kaskade SET NULL zu verwenden, und fügen Sie Trigger Tabelle B

AFTER UPDATE.. 
FOR EACH ROW 
BEGIN 
    IF :new.a = 1 THEN 
     DELETE FROM B WHERE ID = :new.id 
    ENDIF; 
END; 

Aber ich eine Fehlermeldung erhalten, smthing wie „Tisch mutiert, Trigger/Funktion kann es nicht sehen ". So

, ich habe meine if-else zu Prozeduraufruf

AFTER UPDATE 
BEGIN 
    cleanup_table_b(); 
END; 

create or replace procedure cleanup_table_b 
IS begin  
    DELETE FROM B WHERE a = 1;  
end; 
geändert

aber immer noch einen Fehler ORA-04091, ORA-06512, ORA-04088

Die Geschäftsidee davon bekommen, Sind die Datensätze in B immer noch nützlich (nicht durch Fremdschlüssel) oder nicht, so möchte ich eine Bereinigung durchführen und Nutzungsdatensätze entfernen.

+1

Verwenden Sie einen Trigger zum Löschen in Tabelle A, um die referenzierenden Datensätze zu löschen oder null zu setzen in Tabelle B. – Rene

+0

@Rene ja, aber das macht einen Tisch um einen anderen zu halten. Bessere Struktur Lösung wäre, wenn eine Tabelle sich selbst pflegen kann – user1448906

+0

Sie müssen erklären, warum Sie denken, dass das "besser" ist. – Rene

Antwort

0

Die folgende Entscheidung wurde implementiert. Wurde ein "on delete" Trigger für Tabelle A verwendet, um die referenzierenden Datensätze in Tabelle B zu löschen oder null zu setzen. So löschte der Trigger eine Bereinigung von B

Verwandte Themen