Trigger soll Transaction abbrechen

smathedark

Mitglied
Hallo,

ich möchte beim schreiben in eine MySQL 5.0 Datenbank einen Trigger auslösen. Dies ist soweit kein Problem. Der Trigger soll dann nachschauen, ob im einzufügenden Datensatz und der Datenbank bestimmte Bedingungen gegeben sind und daraufhin das Einfügen zulassen oder Abbrechen.
Da ich bei der Übertragung eine ganz oder garnicht Semantik mittels Transaction verwende müsste also wenn der Trigger entschieden hat das dass INSERT nicht zugelassen wird, die ganze Transaction abgebrochen werden.
Den Trigger schreiben und den Vergleich schaffe ich, was mir fehlt ist die Möglichkeit wenn ich zu einer Entscheidung gegen das Einfügegen gelangt bin den Vorgang abzubrechen. Da ich eine externe Java Applikation verwende um den Eintrag zu machen müsste die Datenbank also eine Exception zurück geben damit ich merke, dass aufgrund des Trigger die Aktion abgebrochen wurde. Die Kernfragen sind also würde das auslösen einer Exception die Transaction abbrechen? und würde diese von der Datenbank dann auch als Fehler an mein Programm zurück gemeldet werden? wenn ja wie löse ich diese aus?

Vielen Dank im Voraus.
 
ich bin nicht sicher, ob mysql 5 das hat, aber i.d.R. wird das, was du da bescheibst von einem CHECK CONSTRAINT gelöst.

der fliegt dann implizit auseinander UND spendiert dir ne brauchbare fehlermeldung.

ansonsten gibts in den prozeduralen spracherweiterungen immer die möglichkeit, ein RAISE zu machen. (s. RAISE EXCEPTION).
 
Hallo,

ich habe sowas schon einmal gemacht. es ist zwar keine so nette Lösung aber hier mal eine möglichkeit.

Der Trigger muss ein Before trigger sein, denn wenn er ein After ist kannst du das nicht mehr machen.

Code:
Declare 
 
 v_nCount  number;

Begin

  Select Count(*) into v_nCount from TABTest

  IF v_nCount =1 then 
  raise_application_error(-20010,'There is still one Record!! Insert NOT Allowed!!');
  END IF; 


End;

Und könntest das ganze auch in ein Package fließen lassen und mit dem Arbeiten. DU machs also keinen Update auf die Tabelle selbst sondern lässt das ganze ein Package machen

lg
 
Hi,

raise_application_error sagt mir mal garnichts. Ist das eine Funktion die MySQL bereit stellt?

Ich habe mir mit einem hässlichen Workaround geholfen. Ich prüfe meine Bedingungen ab und wenn ich Abbrechen muss, mache ich ein INSERT in eine Tabelle die es garnicht gibt. Dadurch wird natürlich ein Fehler erzeugt und die Transaktion abgebrochen. Das ganze in einem Before Trigger. Nicht schön aber was besseres habe ich nicht gefunden.
 
Rollback wäre auch nicht schlecht nur wird man sich wundern warum der Eintrag nicht da ist wenn der Trigger einfach ein Rollback macht :) als anwender will man vll wissen warum das nicht gegangen ist :).
 
normalerweise zerlegt dir ein serverseitiges rollback die transaktion im persistence layer und du hast deine exception ;-)
 
Das mag schon sein nur wenn ich meinem Anwender mitteilen kann warum der Inster nicht gegangen ist werden sich alle Freuen. Mit einer Fehlermeldung aller Rollback blabla ... wird kein Anwender was anfangen können :).

Aber das muss eh er enscheiden. Der Eintrag in eine Tabelle die es nicht gibt ist natürlich hässlich das stimmt schon aber wenn es Funktioniert. Ich würde mir das Trotzdem noch einmal anschauen. Wie gesagt es gibt auch die Möglichkeit es in ein Package zu leiten und von dort das zu machen-
 
Zurück