数据库中有 3 个表 - Students
, Courses
, Professors
. 每个学生都有activation_deadline
一列,NULL
在激活时设置为。我需要一些机制来定期删除过期的学生activation_deadline
(并防止已经“过期”的学生被激活)。
目前,我通过三个单独的触发器(因为SQLite 中没有数据库或服务器级触发器)来执行Students
表。
一个用于UPDATE
:
CREATE TRIGGER Remove_Unactivated_Students_Update
BEFORE UPDATE
ON Students
FOR EACH ROW
BEGIN
DELETE FROM Students
WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;
一个用于INSERT
:
CREATE TRIGGER Remove_Unactivated_Students_Insert
BEFORE INSERT
ON Students
FOR EACH ROW
BEGIN
DELETE FROM Students
WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;
一个用于DELETE
:
CREATE TRIGGER Remove_Unactivated_Students_Delete
AFTER DELETE
ON Students
FOR EACH ROW
BEGIN
DELETE FROM Students
WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;
另一种方法是向后端添加一些代码,这将在执行任何其他对数据库的查询之前检查并删除过期记录(尽管这会增加数据库调用的数量,这并不好)。
在这种情况下,首选哪种(保留“过期”记录删除数据库触发器或后端中的逻辑)方法,为什么?各自的优缺点是什么?