Delta¶
Mithilfe des Deltamoduls können Änderungen in der Datenbank schnell, einfach und effizient ermittelt werden.
Um Änderungen in einer Zeile identifizieren zu können, wird bei einem INSERT
-, UPDATE
- oder DELETE
-Statement
mittels Trigger ein MD5 über alle Inhalte einer Zeile berechnet und das Ergebnis in die Tabelle co_delta
geschrieben.
Das Schreiben der Änderungen erfolgt mittels Trigger innerhalb der Datenbank und ist dadurch schnell und effizient.
Wird ein neuer oder geänderter Datensatz gespeichert, so ändert sich das Datum in der Spalte sys_lastupdate
.
Das Datum ändert sich nicht, wenn der MD5 identisch ist. Das ist das Standardverhalten von MySQL.
ID¶
Jede Tabelle besitzt eine eindeutige ID, mit der diese identifiziert wird. Diese ID wird in der Delta Route definiert. Für weitere Tabellen muss hier geprüft werden, welche IDs schon vergeben sind.
<configuration>
<urls>
<url name="item" id="1">
<![CDATA[/api/commerce/item/search?q=item.iid%20IN%20%22${idlist}%22]]>
</url>
</urls>
</configuration>
Erstellen eines neuen Triggers¶
Hierzu steht der Befehl dev:createdeltasql
zur Verfügung.
Ein neuer Trigger wird in /deployment/database/trigger_
Export der Tabellen¶
Das Script /development/script/export-table.php
muss mit --skip-triggers
laufen, damit die Trigger
nicht doppelt in den Dateien definiert werden.
co_delta_schedule_event¶
Es wird ein Event eingerichtet, der jede Minute ausgeführt wird.
DROP EVENT IF EXISTS `delta_schedule_event`;
DELIMITER $$
CREATE EVENT delta_schedule_event
ON SCHEDULE EVERY 1 MINUTE
DO
BEGIN
UPDATE co_delta as t2,
( SELECT sys_id, sys_table
FROM co_delta_schedule_event
WHERE sys_date<=UNIX_TIMESTAMP(now())
) as t1
SET t2.sys_lastupdate = now()
WHERE t1.sys_id = t2.sys_id AND t1.sys_table = t2.sys_table;
DELETE FROM co_delta_schedule_event WHERE sys_date<=UNIX_TIMESTAMP(now());
END$$
DELIMITER ;
Bei Änderungen oder neuen Einträgen wird in die co_delta_schedule_event ein Eintrag eingestellt. Wenn das Datum zutrifft, wird die Änderung in der co_delta entsprechend geändert so das wieder eine Änderung ausgelöst wird.
Es wird ein Eintrag beim Start und einer beim Ende angelegt.
Beispiel Trigger:
IF NEW.sys_start > now() && NEW.sys_end > NEW.sys_start
THEN
DELETE FROM co_delta_schedule_event WHERE sys_id=NEW.TID AND sys_table=34;
INSERT INTO co_delta_schedule_event SET sys_id=NEW.TID , sys_table=34 , sys_date=UNIX_TIMESTAMP(NEW.sys_start);
INSERT INTO co_delta_schedule_event SET sys_id=NEW.TID , sys_table=34 , sys_date=UNIX_TIMESTAMP(NEW.sys_end);
END IF;
Prüfen¶
mit diesem Select kann geprüft werden, ob der Event Planer gestartet wurde
select @@event_scheduler;
Wenn das Ergebnis "OFF" ist, dann muss dieser gestartet worden.
mit diesem Befehl wird der Event Planer gestartet
SET GLOBAL event_scheduler = ON;
Mit diesem Befehl kann man prüfen welche Events laufen
SHOW EVENTS