#2365·alasql

触发器 - 数据库事件自动化支持

作者: mathiasrw创建于 2025年12月13日更新于 2026年9月10日

优先级: 3-4(中等)
影响: SQL-99 兼容性
测试文件: test/test1119.js
测试个数: 1 个测试

问题描述

测试文件中包含了针对 SQL 触发器功能的跳过测试,包括 INSERT、UPDATE 和 DELETE 操作的 BEFORE、AFTER 和 INSTEAD OF 触发器。触发器是数据库自动化和业务逻辑强制执行的重要 SQL-99 特性。

特定测试用例

test1119.js - 触发器回调参数(1 个测试套件)

  • 第 6 到 156 行:全面的触发器测试框架
  • 测试所有触发器类型:BEFORE/AFTER/INSTEAD OF
  • 测试所有 DML 操作:INSERT/UPDATE/DELETE
  • 测试回调参数传递和数据接收

预期行为

AlaSQL 应支持 SQL-99 标准的触发器功能:

  1. BEFORE 触发器:在 DML 操作之前执行
  2. AFTER 触发器:在 DML 操作之后执行
  3. INSTEAD OF 触发器:替换 DML 操作
  4. 触发器事件:INSERT、UPDATE 和 DELETE 操作
  5. 回调参数:将行数据传递给触发函数
  6. 业务逻辑:数据验证和自动化

当前状态

  • 测试状态: 整个测试套件被跳过(describe.skip
  • 错误: 未知(测试未执行)
  • 根本原因: 触发器系统未在数据库引擎中实现

实现要求

1. 解析器支持

src/alasqlparser.jison 中添加触发器语法:

sql
-- 基本触发器创建
CREATE TRIGGER trigger_name 
BEFORE INSERT ON table_name 
CALL trigger_function()

-- AFTER 触发器
CREATE TRIGGER trigger_name 
AFTER UPDATE ON table_name 
CALL trigger_function()

-- INSTEAD OF 触发器
CREATE TRIGGER trigger_name 
INSTEAD OF DELETE ON table_name 
CALL trigger_function()

-- 删除触发器
DROP TRIGGER trigger_name

2. 触发器引擎

  • 触发器注册:在表元数据中存储触发器定义
  • 事件检测:拦截 DML 操作(INSERT/UPDATE/DELETE)
  • 执行控制:BEFORE/AFTER/INSTEAD OF 计时
  • 参数传递:将行数据传递给触发函数
  • 错误处理:适当处理触发器失败

3. 触发器类型支持

  • BEFORE INSERT:验证/修改插入前的数据
  • AFTER INSERT:插入后处理
  • BEFORE UPDATE:验证/修改更新前的数据
  • AFTER UPDATE:更新后处理
  • BEFORE DELETE:验证删除前的数据
  • AFTER DELETE:删除后清理
  • INSTEAD OF:自定义 DML 操作处理

4. 数据参数支持

  • INSERT 触发器:传递插入的行数据
  • UPDATE 触发器:传递旧行和新行数据
  • DELETE 触发器:传递删除的行数据
  • 函数集成:与 AlaSQL 函数系统集成

5. 高级功能

  • 多个触发器:支持每个表/事件的多个触发器
  • 触发器排序:控制多个触发器的执行顺序
  • 嵌套触发器:处理触发其他触发器的触发器
  • 性能:高效的触发器