如何利用SQLite触发器将删除的物料数据存入归档数据库?
SQLite 跨数据库归档触发器实现方案
SQLite 默认不支持触发器直接操作独立的外部数据库,但可以通过 附加数据库(ATTACH DATABASE) 的方式,将归档库关联到当前连接的物料库中,让触发器能访问归档库的表,从而实现删除前的自动归档。以下是具体步骤:
1. 准备归档表结构
确保 archive.db 中存在与 Material.db 物料表结构完全一致的归档表(比如原物料表叫 materials,归档表命名为 archived_materials)。可以通过以下语句在 archive.db 中创建:
CREATE TABLE IF NOT EXISTS archived_materials ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, description TEXT, create_time DATETIME, -- 其他与原物料表一致的列 );
2. 附加归档数据库到物料库连接
在应用连接 Material.db 后,执行以下 SQL 命令,将 archive.db 附加为当前连接的一个逻辑库(别名 archive):
ATTACH DATABASE '/path/to/archive.db' AS archive;
注意:路径需使用绝对路径,或相对于
Material.db所在目录的相对路径,确保应用有该路径的读写权限。
3. 创建归档触发器
在 Material.db 中创建 BEFORE DELETE 触发器,每次删除物料数据前,将待删除的行插入到归档库的表中:
CREATE TRIGGER IF NOT EXISTS archive_materials_before_delete BEFORE DELETE ON materials FOR EACH ROW BEGIN -- 插入待删除的行到归档表,列名需与原表、归档表完全匹配 INSERT INTO archive.archived_materials (id, name, description, create_time) VALUES (OLD.id, OLD.name, OLD.description, OLD.create_time); END;
关键注意事项
- 触发器是行级触发(
FOR EACH ROW),每删除一行物料数据,就会自动归档一行到archive.db。 - 必须保证归档表与原物料表的列结构完全一致,否则插入操作会失败。
- 如果应用每次连接
Material.db都会重新建立会话,需要确保每次连接后都执行ATTACH DATABASE命令,否则触发器无法访问归档库。 - 若需批量删除数据,触发器仍会逐行处理归档,无需额外修改。
内容的提问来源于stack exchange,提问作者user3273723
相关产品推荐
相关产品推荐

