I have an events table where SET events for a given device_id and event_code
are followed by CLR events.
CREATE TABLE device_event (
event_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
device_id INTEGER NOT NULL REFERENCES device,
event_date INTEGER NOT NULL,
event_code INTEGER NOT NULL REFERENCES event_code,
event_state INTEGER NOT NULL REFERENCES event_state,
event_text TEXT,
exported INTEGER DEFAULT 0,
created_date INTEGER NOT NULL,
event_correlation_id INTEGER
);
I want to set event_correlation_id when a CLR is inserted, so that the SET
and CLR events reference each other.
CREATE TRIGGER update_event_correlation_id AFTER INSERT ON device_event
WHEN new.event_state = 1
BEGIN
UPDATE device_event SET event_correlation_id = (
SELECT event_id FROM device_event
WHERE device_id = new.device_id
AND event_code = new.event_code
AND event_state = 2
ORDER BY event_date DESC LIMIT 1
) WHERE event_id = new.event_id;
UPDATE device_event SET event_correlation_id = new.event_id
WHERE event_id = new.event_correlation_id;
END;
My first version of this trigger failed entirely when I omitted the AFTER
keyword. I wish the default *trigger-time* were documented.
The second UPDATE in the trigger still fails, though; it seems that
the newrecord does not get modified by the first UPDATE. If this is
true, perhaps
it could also be documented.
I ended up having to run the SELECT a second time to make the second UPDATE
work:
CREATE TRIGGER update_event_correlation_id AFTER INSERT ON device_event
WHEN new.event_state = 1
BEGIN
UPDATE device_event SET event_correlation_id = (
SELECT event_id FROM device_event
WHERE device_id = new.device_id
AND event_code = new.event_code
AND event_state = 2
ORDER BY event_date DESC LIMIT 1
) WHERE event_id = new.event_id;
UPDATE device_event SET event_correlation_id = new.event_id
WHERE event_id = (
SELECT event_id FROM device_event
WHERE device_id = new.device_id
AND event_code = new.event_code
AND event_state = 2
ORDER BY event_date DESC LIMIT 1
);
END;
I am afraid this will get too slow, and can do without the second update
(setting event_correlation_id for the earlier SET event), but I would like
to know if there's a more efficient way to do both.
Chris
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users