Trigger: Fehler zurückgeben, nicht erzeugen



  • Hallo Forum,

    in einer Übungsaufgabe für einen DB2 Trigger habe ich diesen abgegeben:

    CREATE TRIGGER Aufgabe5b
    NO CASCADE BEFORE UPDATE ON Kunde
    REFERENCING NEW AS N OLD AS O
    FOR EACH ROW MODE DB2SQL
    WHEN (LOWER(N.Name) LIKE 'Otto' AND N.Konto < 0)
    SIGNAL SQLSTATE 'Kunde Otto darf nicht ueberziehen!';

    Die Aufgabenstellung war einen Trigger für Kunde Otto zu erstellen, so dass dieser sein Konto nicht überziehen kann.

    Jetzt habe ich einen Punkt abgezogen bekommen. Begründung:

    Es soll ein Fehler zurückgegeben, nicht erzeugt werden:
    	SQL0723N  An error occurred in a triggered SQL statement in trigger
    ...
    

    Gemeint ist doch das der Tupel den der Korrektur testweise eingefügt hat nicht eingefügt wird. Wie kriege ich dieses Verhalten hin? Soll ich jetzt alle neuen Werte im Trigger (N) mit den Werten in O überschreiben? Oder ist da etwas anderes gemeint?

    Vielen Dank

    Peter



  • abcd schrieb:

    WHEN (LOWER(N.Name) LIKE 'Otto' AND N.Konto < 0)

    Wenn der LIKE-Vergleich auf Groß/Kleinschreibung achtet, wird dieser Vergleich niemals wahr.



  • Ich hab zwar keine Ahnung von DB2 speziell, aber mit Google war die (vermutlich) richtige Antwort in nichtmal 2 Minuten gefunden. Dein "SIGNAL" Statement ist falsch. -> Bissi Eigeninitiative kommt immer gut.

    "SIGNAL" Referenz:
    http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.sqlref/db2z_signalstatement4externalsqlpl.htm

    Zusammengefasst:

    -- falsch, da 'Kunde Otto darf nicht ueberziehen!' kein gültiger SQLSTATE ist
    -- (muss aus 5 ziffern bestehen und darf nicht mit 00 anfangen)
    SIGNAL SQLSTATE 'Kunde Otto darf nicht ueberziehen!';
    
    -- vermutlich richtig:
    SIGNAL SQLSTATE '12345' ('Kunde Otto darf nicht ueberziehen!');
    

    Gemein ist also...

    soll: Es soll "kontrolliert" ein Fehler (mit einer sinnvollen Meldung etc.) "zurückgegeben" werden. Das setzt korrekten SQL Code im Trigger voraus.

    ist: Der SQL Code im Trigger ist falsch, und der falsche Code führt zu einem Fehler. Einem ganz anderen, unerwünschten Fehler, der auch die gewünschte Nachricht nicht enthält.

    Anders gesagt: du machst einen Fehler beim Fehler-Erzeugen 🙂

    Ein Punkt Abzug ist da denke ich mehr als fair.

    p.S.: dein Code ist nicht syntaktisch falsch, sonst könntest du den Trigger vermutlich garnicht anlegen (MSSQL zumindest checkt die Syntax beim anlegen schon -- wie gesagt, ich hab von DB2 keine Ahnung). Er übergibt allerdings einen falschen Wert an eine Funktion, und das muss man ja auch als Fehler werten.



  • Das ist komisch. Mittlerweile habe ich DB2 auf meinen Heimrechner installiert und tatsächlich: Beim Anlegen des Triggers kommt ein Fehler. Ich meine aber an den Uni Rechnern den Trigger geschrieben zu haben und das er da lief.
    Auf jeden Fall läuft er so. Es lag also an der Syntax. Vielen Dank witte und hustbaer 🙂

    PS: Der Fehler mit der Gross/Klein Schreibung ist nachträglich eingebaut worden. Ursprünglich stand in der Aufgabe (und meiner Abgabe) ein Name wie Meier-Piepenbring und da dachte ich mir gleich das der Korrektor bei der Korrektur im Internet schaut wer sich helfen läßt...


Anmelden zum Antworten