Seite 1 von 1
Trigger - bin grad zu doof
Verfasst: Fr 23. Dez 2016, 01:14
von creativecat
Hallo zusammen,
irgendwie bekomme ich es gerade nicht gebacken. Ich benötige einen Trigger, welcher mir bei einem Update eines Datensatzes das modified-Feld auf den CURRENT_TIMESTAMP setzt.... und zwar immer AUßER, wenn das Attribut position verändert wird... Irgendwie muss das doch mit IF NOT UPDATE funktionieren aber ich bekomme es nicht hin:
Meine Tabelle:
Code: Alles auswählen
REATE TABLE IF NOT EXISTS `:prefix:mod_courseEntry` (
`entryID` int(11) unsigned NOT NULL AUTO_INCREMENT,
`courseID` int(11) unsigned NOT NULL,
`content` text NULL,
`text` text NULL,
`modified` DATETIME NULL,
`created` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
`userID` int(11) unsigned NULL,
`seoURL` varchar(255) NOT NULL DEFAULT '',
`position` smallint(11) unsigned NULL DEFAULT '1',
PRIMARY KEY (`entryID`),
CONSTRAINT `courses` FOREIGN KEY (`courseID`) REFERENCES `:prefix:mod_course`(`courseID`) ON DELETE CASCADE,
CONSTRAINT `user` FOREIGN KEY (`userID`) REFERENCES `:prefix:users`(`user_id`) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Mein Versuch des Triggers (funktioniert nicht!):
Code: Alles auswählen
CREATE TRIGGER `courseEntryUpdate` BEFORE UPDATE ON `:prefix:mod_courseEntry` FOR EACH ROW
IF NOT UPDATE(position) BEGIN
SET NEW.modified = CURRENT_TIMESTAMP
END;
Re: Trigger - bin grad zu doof
Verfasst: Fr 23. Dez 2016, 10:38
von shadowcat
IF new.position != old.position
?
Re: Trigger - bin grad zu doof
Verfasst: Fr 23. Dez 2016, 12:59
von Dwingo
Hoffe das hilft dir, mein Wissen haben die Versuche auf jeden Fall erweitert.
Habe allerdings nicht die :prefix: bei meinen Tests nutzen können.
Code: Alles auswählen
CREATE TRIGGER `courseEntryUpdate` BEFORE UPDATE ON `mod_courseentry` FOR EACH ROW
IF NEW.position != OLD.position THEN
BEGIN
SET NEW.modified = CURRENT_TIMESTAMP();
END;
END IF
Ach du hattest ja schon die Lösung, nicht gesehen :?
Re: Trigger - bin grad zu doof
Verfasst: Fr 23. Dez 2016, 15:09
von shadowcat
Dwingo hat geschrieben:Habe allerdings nicht die :prefix: bei meinen Tests nutzen können.
Ähhh... versteh ich jetzt nicht. :prefix: wird vom DB-Handler aufgelöst, die DB - da wo die Trigger laufen - kennt das nicht. Ist aber auch nicht nötig, weil bei der Installation überall das Präfix berücksichtigt wird, also auch in der Trigger-Definition.
Re: Trigger - bin grad zu doof
Verfasst: Fr 23. Dez 2016, 15:24
von creativecat
Danke, eine ähnliche Lösung hatte ich schon mal gefunden und getestet - nur das passt für meinen Anwendungsfall leider nicht.
Bytheway: Wenn ich nachdenke, ist euer Ansatz ja, wenn das Feld position geändert wird, dann passe den Timestamp an - genau das will ich aber nicht

Wenn eben irgendwas anders außer dem Feld position geändert wird (wobei gleichzeitig position auch geändert werden könnte), möchte ich, dass modified angepasst wird.
Hinter dem position steckt nämlich die Reihenfolge von Elementen und wenn ich umsortiere, möchte ich nicht, dass jedes Element als geändert markiert wird.... vielleicht ist es einfacher, ich gliedere das doch in PHP aus....
Schei..., wenn mein SQL bei all-inkl ein wenig aktueller wäre, dann würde das viel einfacher gehen...
Re: Trigger - bin grad zu doof
Verfasst: Fr 23. Dez 2016, 22:25
von Dwingo
Ähhh... versteh ich jetzt nicht. :prefix: wird vom DB-Handler aufgelöst, die DB - da wo die Trigger laufen - kennt das nicht. Ist aber auch nicht nötig, weil bei der Installation überall das Präfix berücksichtigt wird, also auch in der Trigger-Definition.
Habe den Trigger außerhalb von BC getestet, da ich das entsprechende Modul nicht habe.
Schau mal ob dir das hier hilft:
Code: Alles auswählen
BEGIN
DECLARE mychanged INT DEFAULT 0;
IF NEW.entryID != OLD.entryID OR NEW.courseID != OLD.courseID OR NEW.content != OLD.content
THEN SET mychanged = 1;
END IF;
IF mychanged = 1 THEN
SET NEW.modified = CURRENT_TIMESTAMP();
END IF;
END
Das erste IF Statement müsstest du dann entsprechend deiner Anforderung anpassen.
Re: Trigger - bin grad zu doof
Verfasst: Sa 24. Dez 2016, 10:39
von creativecat
Mh.. ich zweifle grad echt an meiner Kompetenz
Hab jetzt mal für diesen speziellen Fall das folgende (auch mit Anpassungen wie THEN BEGIN ... END; getestet... Irgendwie bekomm ich immer eine Syntax-Fehlermeldung...

- Bildschirmfoto 2016-12-24 um 10.16.45.png (80.58 KiB) 25078 mal betrachtet
Re: Trigger - bin grad zu doof
Verfasst: Sa 24. Dez 2016, 14:54
von Dwingo
Also so ganz verstehe ich das auch nicht. Habe das jetzt auch mal bei meinem Hoster (Goneo mysql 5.6) getestet.
Beim erstellen mit SQL bekomme ich auch deine Fehlermeldung. Habe dann mal mit HeidiSQL über die Funktion "Neu->Trigger" den Trigger erstellt und er wurde so angenommen. Dann habe ich ich mit PHPMyAdmin die Funktion zum Trigger erstellen genutzt und auch damit hat es geklappt.

- PHPmyAdmin Trigger.png (57.62 KiB) 25076 mal betrachtet

- PHPmyAdmin Trigger_1.png (24.72 KiB) 25076 mal betrachtet
Anschließend habe ich das von PhpMyAdmin erzeugte SQL Statement mal kopiert, den Trigger gelöscht und das Statement direkt ausgeführt, damit erhalte ich wieder unseren Fehler :?
Re: Trigger - bin grad zu doof
Verfasst: Sa 24. Dez 2016, 15:16
von Dwingo
Ha, ich habs
Du musst den Delimiter ändern, dann klappt es. War 'ne schwere Geburt
Code: Alles auswählen
DELIMITER //
DROP TRIGGER IF EXISTS `courseEntryUpdate`//
CREATE TRIGGER `courseEntryUpdate` BEFORE UPDATE ON `mod_courseentry` FOR EACH ROW BEGIN
IF NEW.entryID != OLD.entryID OR NEW.text != OLD.text OR NEW.seoURL != OLD.seoURL
THEN SET NEW.modified = CURRENT_TIMESTAMP;
END IF;
END
Jetzt kann ich entspannt Weihnachten feiern

. In diesem Sinne ein schönes Weihnachtsfest.
Re: Trigger - bin grad zu doof
Verfasst: Sa 24. Dez 2016, 16:36
von creativecat
Oh mann... klar! Danke! Und ich hab schon echt an meinem Verständnis gezweifelt und dann liegt am delimiter.... den ich bis jetzt noch nie gebraucht hatte und deshalb komplett aus den Augen hatte! Merci! Du hast es drauf

Der Vollständigkeit halber:
noch am Ende, dann klappt's auch mit den Folgedefinitionen....