Forum: PC-Programmierung [SQL] Prozeduren erstellen


von Draco (Gast)


Lesenswert?

Ich habe hier eine MySQL Datenbank. In dieser Datenbank liegen meine 
Kunden- und Auftragsdaten.

Aktuell mache ich das erstellen des Versand- und Rechnungsdatums noch 
händisch, was aber ziemlich nervig ist. Da ich sowieso den Versand mit 
nur einem Klick bestätige, würde ich gerne das aktuelle Datum direkt mit 
in die DB schreiben sobald der boolesche Wert von "verschickt" auf wahr 
geht.

Da kam mir die Idee mit einer Prozedur in der Datenbank gerade recht.
Ist es damit möglich ein Trigger genau in diesem Fall zu setzen und das 
Datum automatisch eintragen zu lassen? Also: Datensatz aktualisiert -> 
wenn "verschickt" von false auf true wechselt -> aktuelles Datum in 
"VersandDatum" eintragen?

Vielen lieben Dank für eure Hilfe :-D

von YourSql (Gast)


Lesenswert?

Da reicht ein Trigger...
1
db> delimiter //
2
db> CREATE TRIGGER trgSetVersanddatum BEFORE UPDATE ON bestellungen
3
    FOR EACH ROW
4
       BEGIN
5
           IF NEW.shipped = 1 THEN
6
               SET NEW.VersandDatum = now();
7
           END IF;
8
       END;//
9
db> delimiter ;

von vom Autopoliturverkäufer @ Kirmes zum Rekrutah (Gast)


Lesenswert?

Warum wird vorher das Trennzeichen geändert?
Braucht man das wenn man auf der Konsole in mysql eingeloggt ist und
mehrzeilige Anweisungen eintippt oder braucht man das generell bei 
stproc oder triggern?

von Draco (Gast)


Lesenswert?

Vielen Dank das war genau das was ich brauchte :-D

vom Autopoliturverkäufer @ Kirmes zum Rekrutah schrieb im Beitrag 
#6801887:
> Warum wird vorher das Trennzeichen geändert?
> Braucht man das wenn man auf der Konsole in mysql eingeloggt ist und
> mehrzeilige Anweisungen eintippt oder braucht man das generell bei
> stproc oder triggern?

Weil der Trigger aus mehreren Statements besteht, die müssen gebunden 
werden. So das die normalen Statement-Begrenzer nicht mehr gelten. 
Welchen Begrenzer man da wählt ist relativ unerheblich, darf halt nur 
nicht im Statement selbst vorkommen.

von Einer (Gast)


Lesenswert?

Draco schrieb:
> Aktuell mache ich das erstellen des Versand- und Rechnungsdatums noch
> händisch, was aber ziemlich nervig ist. Da ich sowieso den Versand mit
> nur einem Klick bestätige, würde ich gerne das aktuelle Datum direkt mit
> in die DB schreiben sobald der boolesche Wert von "verschickt" auf wahr
> geht.

Kann man so machen, klingt aber nach Käse.

Bestimmt gibt es (mindestens) zwei Felder, einmal das Versand-Flag, und 
dann noch ein Versand-Datum, dass vorher NULL ist.

Solche Konstrukte ebnen den Weg zur Hölle, das fliegt irgendwann in die 
Luft.

Einfach eine zweite Tabelle, zwei Spalten. Die erste Spalte Foreign-Key 
auf die Bestellung, die zweite Spalte Versanddatum mit Default-Wert 
aktuelles Datum.

Dann anstatt ein Bool-Flag zu setzen für den Versand, einfach ein Insert 
in die Versand-Tabelle mit dem Key der Bestellung. Da aktuelle Datum 
kommt dann automatisch rein.

Keine NULLs, keine Trigger, ordentliches Datenmodell, etc.

Summa summarum: Keine grauen Haare.

von vom Autopoliturverkäufer @ Kirmes zum Rekrutah (Gast)


Lesenswert?

Einer schrieb:
> Solche Konstrukte ebnen den Weg zur Hölle, das fliegt irgendwann in die
> Luft.

Warum?

von Jan H. (j_hansen)


Lesenswert?

Einer schrieb:
> Keine NULLs, keine Trigger, ordentliches Datenmodell, etc.

Wozu eine zweite Tabelle was jetzt schon als Spalte passt? Wenn du 
geschrieben hättest die BOOL-Spalte weg ok.

von Einer (Gast)


Lesenswert?

Jan H. schrieb:
> Wozu eine zweite Tabelle was jetzt schon als Spalte passt? Wenn du
> geschrieben hättest die BOOL-Spalte weg ok.

Natürlich BOOL-Spalte weg. Logisch.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.