Trigger - bin grad zu doof

Gesperrt
Benutzeravatar
creativecat
Beiträge: 1430
Registriert: Mi 6. Feb 2013, 12:41
Kontaktdaten:

Trigger - bin grad zu doof

Beitrag 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;
Benutzeravatar
shadowcat
Administrator
Beiträge: 5283
Registriert: Di 5. Feb 2013, 10:36
Kontaktdaten:

Re: Trigger - bin grad zu doof

Beitrag von shadowcat »

IF new.position != old.position

?
My software never has bugs, it just develops random features.
If it’s not broken, keep fixing it until it is
Benutzeravatar
Dwingo
Beiträge: 26
Registriert: Fr 24. Apr 2015, 09:23
Wohnort: Bergkamen

Re: Trigger - bin grad zu doof

Beitrag von Dwingo »

Hoffe das hilft dir, mein Wissen haben die Versuche auf jeden Fall erweitert. :D
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 :?
Testumgebung: XAMPP - Apache 2.4.23 | PHP 5.6.28 with xdebug 2.2.5 | MariaDB 10.1.19
BC Version: 1.2(.1)

// hack for ie browser (assuming that ie is a browser)

// I am not sure if we need this, but too scared to delete.
Benutzeravatar
shadowcat
Administrator
Beiträge: 5283
Registriert: Di 5. Feb 2013, 10:36
Kontaktdaten:

Re: Trigger - bin grad zu doof

Beitrag 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.
My software never has bugs, it just develops random features.
If it’s not broken, keep fixing it until it is
Benutzeravatar
creativecat
Beiträge: 1430
Registriert: Mi 6. Feb 2013, 12:41
Kontaktdaten:

Re: Trigger - bin grad zu doof

Beitrag 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 :-P 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...
Benutzeravatar
Dwingo
Beiträge: 26
Registriert: Fr 24. Apr 2015, 09:23
Wohnort: Bergkamen

Re: Trigger - bin grad zu doof

Beitrag 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.
Testumgebung: XAMPP - Apache 2.4.23 | PHP 5.6.28 with xdebug 2.2.5 | MariaDB 10.1.19
BC Version: 1.2(.1)

// hack for ie browser (assuming that ie is a browser)

// I am not sure if we need this, but too scared to delete.
Benutzeravatar
creativecat
Beiträge: 1430
Registriert: Mi 6. Feb 2013, 12:41
Kontaktdaten:

Re: Trigger - bin grad zu doof

Beitrag von creativecat »

Mh.. ich zweifle grad echt an meiner Kompetenz :lol:
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
Bildschirmfoto 2016-12-24 um 10.16.45.png (80.58 KiB) 5975 mal betrachtet
Benutzeravatar
Dwingo
Beiträge: 26
Registriert: Fr 24. Apr 2015, 09:23
Wohnort: Bergkamen

Re: Trigger - bin grad zu doof

Beitrag 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
PHPmyAdmin Trigger.png (57.62 KiB) 5973 mal betrachtet
PHPmyAdmin Trigger_1.png
PHPmyAdmin Trigger_1.png (24.72 KiB) 5973 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 :?
Testumgebung: XAMPP - Apache 2.4.23 | PHP 5.6.28 with xdebug 2.2.5 | MariaDB 10.1.19
BC Version: 1.2(.1)

// hack for ie browser (assuming that ie is a browser)

// I am not sure if we need this, but too scared to delete.
Benutzeravatar
Dwingo
Beiträge: 26
Registriert: Fr 24. Apr 2015, 09:23
Wohnort: Bergkamen

Re: Trigger - bin grad zu doof

Beitrag von Dwingo »

Ha, ich habs :D
Du musst den Delimiter ändern, dann klappt es. War 'ne schwere Geburt :lol:

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.
Testumgebung: XAMPP - Apache 2.4.23 | PHP 5.6.28 with xdebug 2.2.5 | MariaDB 10.1.19
BC Version: 1.2(.1)

// hack for ie browser (assuming that ie is a browser)

// I am not sure if we need this, but too scared to delete.
Benutzeravatar
creativecat
Beiträge: 1430
Registriert: Mi 6. Feb 2013, 12:41
Kontaktdaten:

Re: Trigger - bin grad zu doof

Beitrag 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 :ugeek:
Der Vollständigkeit halber:

Code: Alles auswählen

DELIMITER ; 
noch am Ende, dann klappt's auch mit den Folgedefinitionen....
Gesperrt