SQLite触发器现在具有太多级别的触发器递归

时间:2019-05-20 23:49:28

标签: sqlite recursion triggers

我正在使用一个已经存在一段时间的程序。我正在尝试更新表及其触发器,但是由于某种原因,即使是旧触发器也无法接受基本插入。这是我得到的错误:

Error while executing SQL query on database 'eventNew': too many levels of trigger recursion

多亏了我的第一条评论,我才知道在3.6.18中增加了递归触发器。由于我正在编译自己的3.8.5版本的sqlite.exe并从命令行运行插入,因此可能是问题所在。

这是我的新问题:解决此问题的最佳方法是什么?

  1. 禁用递归触发功能?
  2. 修改触发器,以便保持启用递归触发器不会引起问题吗?

我的想法是使递归触发器保持启用是一件好事,因此最好只修改代码。在哪里可以更好地了解此新功能以及如何使用它?

表:

CREATE TABLE EVENT_SETTINGS (
    DBTS BIGINT NOT NULL,
    DBTS_TS TIMESTAMP NOT NULL
);

CREATE TABLE CS_EVENT_PRICE_LIST (
    EVENT_PRICE_LIST_ID INTEGER        PRIMARY KEY AUTOINCREMENT,
    DESCRIPTION         VARCHAR (50)   NOT NULL,
    SALES_TAX           DECIMAL (8, 2) DEFAULT 0 NOT NULL,
    TAX_TYPE            INTEGER        DEFAULT 1 NOT NULL,
    INSERTEDBY          VARCHAR (50)   NOT NULL,
    INSTERTEDON         TIMESTAMP      NOT NULL,
    UPDATEDBY           VARCHAR (50)   NOT NULL,
    UPDATEDON           TIMESTAMP      NOT NULL,
    TS                  BIGINT         NOT NULL
);

触发器:

CREATE TRIGGER ti_CS_EVENT_PRICE_LIST_standard BEFORE INSERT ON CS_EVENT_PRICE_LIST
WHEN (SELECT Enabled FROM TriggerControl WHERE TriggerType = 'productTables')
    BEGIN 
    INSERT INTO CS_EVENT_PRICE_LIST ( Description, Sales_Tax, Tax_Type, insertedby, instertedon, updatedby, updatedon, ts)
        VALUES (new.Description, new.Sales_Tax, new.Tax_Type,
                new.insertedby, 
                COALESCE(new.instertedon, julianday('now')), 
                COALESCE(new.updatedby, new.insertedby), 
                COALESCE(new.updatedon, julianday('now')),
                (select DBTS + 1 from EVENT_SETTINGS where rowid = 1));

    UPDATE EVENT_SETTINGS 
        SET DBTS = (select ts from CS_EVENT_PRICE_LIST where Description = new.Description),
            DBTS_TS = julianday('now')
    WHERE rowid = 1;

    SELECT RAISE(IGNORE);
    END;

这是我正在尝试执行的insert语句,导致出现问题:

INSERT INTO CS_EVENT_PRICE_LIST ( DESCRIPTION, SALES_TAX, TAX_TYPE, INSERTEDBY, INSTERTEDON)
VALUES ( 'Manual Inserted', 6.25, 1, 'Mr. Ed', julianday('now'));

0 个答案:

没有答案