【问题标题】:Is there a way to define the order of execution of my triggers in sqlite?有没有办法在sqlite中定义我的触发器的执行顺序?
【发布时间】:2020-04-13 19:10:30
【问题描述】:

如果一个表有很多on insert 触发器。当我使用 sqlite 将值插入到我的表中时,我可以指定首先执行哪个触发器吗?

我想组合我的触发器,但问题是每个触发器都有不同的when 语句,如果我正确理解docwhen 语句在我的update/insert 等之前出现。声明。

CREATE TRIGGER trigger_name AFTER INSERT ON table_name
WHEN expr
BEGIN
    update-stmt;
END;

【问题讨论】:

  • 这听起来像是一个脆弱的设计。也许你应该考虑重构数据库设计。

标签: sqlite


【解决方案1】:

将所有触发器合二为一:

CREATE TRIGGER some_trigger
AFTER INSERT ON some_table
FOR EACH ROW BEGIN
    -- statement 1;
    -- statement 2;
    -- statement 3;
    ...
    -- statement n;
END;

【讨论】:

  • 如果一个人在表达不同时想保留怎么办?
【解决方案2】:

如果触发器是要进行更新,如 OP 的示例中所示,那么这将无济于事。但是,如果每个触发器只是检查某些内容并可能引发错误,我认为这是一种很常见的情况,那么可以将它们全部打包到一个触发器过程中(具有隐式执行顺序) 使用不同的表达方式:

CREATE TRIGGER some_trigger
AFTER INSERT ON some_table
BEGIN
SELECT RAISE(FAIL, "error message one") WHERE (<select-statement-one>) == <value-one>;
SELECT RAISE(FAIL, "error message two") WHERE (<select-statement-two>) == <value-two>;
...
END;

(请记住,子查询表达式的值是封闭的 SELECT 语句结果的第一行。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 2018-12-11
    • 2018-02-25
    • 2012-12-10
    相关资源
    最近更新 更多