Läuft scheinbar nicht durch

  • C#

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Yanbel.

    Läuft scheinbar nicht durch

    Moin,
    irgendwie steh ich grad etwas neben mir oder meine weiblichen Gene (soll ja angeblich jeder Mann haben) spielen mir einen Streich, Logik == 0
    Wie dem auch sein, ich hab eine Stored Procedure:

    SQL-Abfrage

    1. CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_zBenutzerRechteInsert`(
    2. p_rechteID INT
    3. )
    4. BEGIN
    5. DECLARE p_benutzerID INT DEFAULT 0;
    6. SELECT max(zugriffbenutzer.ID) AS p_benutzerID FROM zugriffbenutzer;
    7. IF p_benutzerID > 0 THEN
    8. INSERT INTO zugriffbenutzerrechte
    9. (ID, benutzerID, rechteID)
    10. VALUES
    11. (NULL, p_benutzerID, p_rechteID);
    12. ELSE
    13. ROLLBACK;
    14. END IF;
    15. END

    Bis dahin, das p_benutzerID größer als 0 ist, sind wir uns einig, der richtige Wert wird angesagt. Aber irgendwie macht das Ding dann nicht weiter, es trägt nichts in die Tabelle ein. Wo sehe ich denn grad den Knoten nicht? Fehlermeldungen kommen keine.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    Meinst Du die Stelle hier:

    SQL-Abfrage

    1. VALUES
    2. (NULL, p_benutzerID, p_rechteID);

    Ja, das ist der PK, der steht auf Auto Inkrement. NULL bewirkt in dem Fall, dass die DB den nächsten Wert nimmt, der dran ist (bei MySql, bei MS Sql funktioniert es anders). Das funktioniert alles.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de
    p_benutzerID ist immer 0.


    SQL-Abfrage

    1. DECLARE p_benutzerID INT DEFAULT 0;
    2. SELECT max(zugriffbenutzer.ID) AS p_benutzerID FROM zugriffbenutzer;


    Nur weil der Bezeichner in deinem SELECT-Statement der gleiche ist wie der Bezeichner für deine Skalarvariable, wird diese nicht gefüllt (Skalarvariablen müssen (zumindest bei MSSQL) mit '@' beginnen. Denke bei MySQL gibt es ebenfalls ein Präfix um Skalarvariablen zu kennzeichnen.) Hier wird eher sowas benötigt:

    SQL-Abfrage

    1. SET p_benutzerID = (SELECT max(zugriffbenutzer.ID) AS p_benutzerID FROM zugriffbenutzer);


    Da p_benutzerID immer 0 ist springt er ins Rollback, von dem ich ziemlich sicher bin, dass der SQL es nicht ausführen kann, da keine Transaction übergeben wird, die zuückgedreht werden könnte (Auch nur auf MSSQL Syntax bezogen, kein Plan wie das bei MySQL abläuft). Aber rein aus der Logik heraus vermute ich stark, das irgendwie angegeben werden muss, was genau rückgängig gemacht werden soll.


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Yanbel schrieb:

    Aber rein aus der Logik heraus vermute ich stark, das irgendwie angegeben werden muss, was genau rückgängig gemacht werden soll.
    Darüber bin ich auch kurz gestolpert.
    Ich glaube, es betrifft die aktiv ausgeführte Transaktion, so dass CREATE PROCEDURE rückgängig gemacht wird.
    Aber da bin ich mir alles andere als sicher.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    Das wars. Das mitr dem SET hatte ich schon Mal probiert, aber die Klammer um das SELECT vergessen, jetzt funktioniert es.
    Mit den Skalar-Variablen hast Du Recht, nur ist das bei MySql nicht festgeschrieben, man kann nehmen was man will (bei mir das p_ für Parameter), außer das @, das ist in MySql verboten.
    Was das Rollback angeht ... ja, ich hab das teilweise abgeschrieben, mach ich noch raus. Eigentlich brauchts das Ganze IF nicht, der Wert ist immer größer als 0. Es wird immer erst ein Benutzer eingetragen (andere Tabelle) und im selben Programmteil dann per foreach-Schleife diesem User die Rechte zugewiesen.
    Ok, vielen Dank, es klappt jetzt, wie es soll.
    Grüße aus Berlin
    ---
    Kuroi Fenikkusu Kampfsportverein e.V.
    https://www.spandau-ninja.de