Я работаю с программой, которая существует уже некоторое время. Я пытаюсь обновить таблицу и ее триггер, но по какой-то причине даже старый триггер не принимает базовую вставку. Вот ошибка, которую я получаю:
Error while executing SQL query on database 'eventNew': too many levels of trigger recursion
Благодаря первому комментарию я узнал о добавлении рекурсивного триггера в 3.6.18. Поскольку я компилирую свой собственный файл sqlite.exe версии 3.8.5 и выполняю вставку из командной строки, это может быть проблемой.
Вот мой новый вопрос: как лучше всего решить эту проблему?
- отключить функцию рекурсивного запуска?
- изменить триггеры, чтобы сохранение рекурсивного триггера не вызывало проблем?
Мой мыслительный процесс заключается в том, что оставить рекурсивный триггер включенным - это хорошо, поэтому лучше просто изменить код. Куда мне обратиться, чтобы лучше понять эту новую функцию и как с ней работать?
Таблица:
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 INTO CS_EVENT_PRICE_LIST ( DESCRIPTION, SALES_TAX, TAX_TYPE, INSERTEDBY, INSTERTEDON)
VALUES ( 'Manual Inserted', 6.25, 1, 'Mr. Ed', julianday('now'));