我正在使用一个已经存在一段时间的程序。我正在尝试更新表及其触发器,但是由于某种原因,即使是旧触发器也无法接受基本插入。这是我得到的错误:
Error while executing SQL query on database 'eventNew': too many levels of trigger recursion
多亏了我的第一条评论,我才知道在3.6.18中增加了递归触发器。由于我正在编译自己的3.8.5版本的sqlite.exe并从命令行运行插入,因此可能是问题所在。
这是我的新问题:解决此问题的最佳方法是什么?
我的想法是使递归触发器保持启用是一件好事,因此最好只修改代码。在哪里可以更好地了解此新功能以及如何使用它?
表:
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'));