You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:32:08