Moin Barlee,
ich arbeite bereits ausgiebig damit; hier mal ein Beispiel einer einfachen Tabelle nebst Triggern und LogTabelle:
Code: Alles auswählen
CREATE TABLE staff(
id INTEGER PRIMARY KEY AUTOINCREMENT,
id_staff_editor INTEGER NOT NULL,
code CHAR(2) NOT NULL, -- zweistelliges Kürzel in Grossbuchstaben
forename VARCHAR NOT NULL,
name VARCHAR NOT NULL,
UNIQUE(code),
CONSTRAINT CODE_enforce_2_uppercase_letters CHECK(code GLOB '[A-Z][A-Z]')
);
CREATE TRIGGER log_DELETE_staff
AFTER DELETE ON staff FOR EACH ROW
BEGIN
INSERT INTO xlog_staff(idOLD,id_staff_editorOLD,codeOLD,forenameOLD,nameOLD,sqlaction) VALUES(old.id,old.id_staff_editor,old.code,old.forename,old.name,'D');
END;
CREATE TRIGGER log_INSERT_staff
AFTER INSERT ON staff FOR EACH ROW
BEGIN
INSERT INTO xlog_staff(idNEW,id_staff_editorNEW,codeNEW,forenameNEW,nameNEW,sqlaction) VALUES(new.id,new.id_staff_editor,new.code,new.forename,new.name,'I');
END;
CREATE TRIGGER log_UPDATE_staff
AFTER UPDATE ON staff FOR EACH ROW
BEGIN
INSERT INTO xlog_staff(idNEW,idOLD,id_staff_editorNEW,id_staff_editorOLD,codeNEW,codeOLD,forenameNEW,forenameOLD,nameNEW,nameOLD,sqlaction) VALUES(new.id,old.id,new.id_staff_editor,old.id_staff_editor,new.code,old.code,new.forename,old.forename,new.name,old.name,'U');
END;
CREATE TABLE xlog_staff(
LOGID INTEGER PRIMARY KEY AUTOINCREMENT,
idNEW INTEGER,
idOLD INTEGER,
id_staff_editorNEW INTEGER,
id_staff_editorOLD INTEGER,
codeNEW TEXT,
codeOLD TEXT,
forenameNEW TEXT,
forenameOLD TEXT,
nameNEW TEXT,
nameOLD TEXT,
sqlaction TEXT NOT NULL,
created INTEGER NOT NULL DEFAULT (strftime('%s','now')) -- automatischer Zeitstempel bei INSERT (Satzanlage)
);
Das Prinzip ist die Speicherung von Zuständen (bei einem INSERT die Werte des neuen Datensatzes, bei einem UPDATE die alten u n d neuen Werte und bei einem DELETE die alten - in der Tabelle nicht mehr existenten - Werte) mit den Zusatzangaben "Zeitpunkt der Änderung (created)", "Art der Änderung (sqlaction)" sowie "Ändernder (id_staff_editorNEW)" nach Durchführung der Aktion (AFTER DELETE/INSERT/UPDATE im TRIGGER-Statement).
Bei einem DELETE ist der neue Zustand das "Nichtvorhandensein des Datensatzes" und der alte Zustand der gelöschte Datensatz in der unberührten Form; hieraus ergibt sich dann, daß der für die Löschung Verantwortliche nicht erfaßt wird. Bisher hab ich mir damit geholfen, daß ich vor jedem DELETE ein UPDATE von "id_staff_editor" durchgeführt habe, was aber aus 2 Gründen nicht sauber ist:
1. konzeptionell, da die Änderung programmatisch durchgeführt wird
2. in der Durchführung, da ein UPDATE von "id_staff_editor" auch dann durchgeführt wird, wenn ein DELETE aufgrund der Verletzung eines Constraints von der DB abgelehnt wird.
any ideas?
Oliver