# Mit Trigger Tupel löschen verhindern



## Devil_Noe (22. Jun 2011)

Hi!

Ich bin absoluter Anfänger was DB Programmierung betrifft und hätte folgende Grundsatzfrage:

Ich suche eine Möglichkeit, mit der ich verhindern kann, dass ein Tupel aufgrund einer Exists/Not Exists Bedingung gelöscht wird:

Beispiel:

Relation Kunde
Relation Rechnung

Rechnungempfänger als Fremdschlüssel in Rechnung referenziert Kundennr in Kunde

Ich würde jetzt gerne, wenn die Abfrage

NOT EXISTS
(
SELECT * FROM Kunde k, Rechnung r
WHERE k. kundenNr =r.empfänger
);

true ist, das löschen erlauben, sonst nicht.
(Also Kunde darf nur gelöscht werden, wenn es keine zu ihm gehörende Rechnung gibt)

Stell ich das am Besten mit einem Trigger an??

Bei einer Assertion ist mir im Gegensatz nicht klar, wie ich die Bedingung rein an das Löschen eines Tupels knüpfe, da, so wie ich es verstanden habe, Create Assertion ja ebenso für Einfügen und Update gilt bzw überprüft wird.


Pls Help!


----------



## Gast2 (23. Jun 2011)

Naja - wenn du ein vernünftiges Datenmodel hast und in der Tabelle die die Rechnungsdaten hält den Kunden als Fremdschlüssel hast kannst du den Kunden nicht löschen 

Oder du wählst halt eine CASCADE - dann würden erst die Rechnungen und dann die Kunden gelöscht.

Setzt natürlich auch eine entsprechendes RDMBS (z.B.  MYSQL mit innoDB Tables, Oracle, etc...) voraus


----------



## Devil_Noe (23. Jun 2011)

Die Integritätsbedingungen und Constraints hab ich soweit durchblickt!
Ich verwende als Literatur derweilen Datenbanksysteme von Kemper/Eickler und SQL von Addisin-Wesley.

Alles gut erklärt darin nur die Trigger und Assertionen gar nicht.

ICh würde eine Möglichkeit suchen, mit der ich folgendes prüfen kann:

Relation 1
Relation 2
(keine Schlüsselbeziehungen)

Löschen aus Relation 1 soll nur möglich sein, wenn Relation 2 leer ist.

(Ich weiss, dass dies jetzt nich unbedingt sinnvoll erscheint, aber ich würd gerne den Ablauf verstehen und erfahren, ob dies überhaupt möglich ist in Oracle)

Also eine Trigger schreiben, diesen mit Bedingung BEFORE DELETE, im Trigger eine SQL Abfrage von Relation 2 mit NOT EXISTS, wenn Relation2 leer dann löschen, sonst Operation zurückweisen.

Hoffe ich hab jetzt nicht allzusehr verwirrt.

Thnx


----------



## Gast2 (23. Jun 2011)

Keine Schlüsselbeziehungen? Wie weißt du denn dass die Rechnung zu einem Kunden gehört? 

Aber sobald du das weißt, kannst du es mit einem Trigger machen. 

Trigger auf die Tabelle in der du prüfen möchtest ob du löschen kannst, im Trigger Code dann einfach so etwas machen:


```
!... PSEUDO PL/SQL ...!
SELECT COUNT(*) INTO myvar FROM Rechnungen where Kundennummer = NEW.kundennummer;
IF myvar = 0 THEN
  RAISE EXCEPTION;
END IF;
```

Aber wie gesagt, für sowas hat man Constraints! Macht im Endeffekt nichts anderes


----------

