触发器 - 数据库事件自动化支持
作者: 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 标准的触发器功能:
- BEFORE 触发器:在 DML 操作之前执行
- AFTER 触发器:在 DML 操作之后执行
- INSTEAD OF 触发器:替换 DML 操作
- 触发器事件:INSERT、UPDATE 和 DELETE 操作
- 回调参数:将行数据传递给触发函数
- 业务逻辑:数据验证和自动化
当前状态
- 测试状态: 整个测试套件被跳过(
describe.skip) - 错误: 未知(测试未执行)
- 根本原因: 触发器系统未在数据库引擎中实现
实现要求
1. 解析器支持
在 src/alasqlparser.jison 中添加触发器语法:
-- 基本触发器创建
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_name2. 触发器引擎
- 触发器注册:在表元数据中存储触发器定义
- 事件检测:拦截 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. 高级功能
- 多个触发器:支持每个表/事件的多个触发器
- 触发器排序:控制多个触发器的执行顺序
- 嵌套触发器:处理触发其他触发器的触发器
- 性能:高效的触发器
内容来源: AlaSQL/alasql