Триггер SQLite теперь имеет слишком много уровней рекурсии триггера - PullRequest
0 голосов
/ 21 мая 2019

Я работаю с программой, которая существует уже некоторое время. Я пытаюсь обновить таблицу и ее триггер, но по какой-то причине даже старый триггер не принимает базовую вставку. Вот ошибка, которую я получаю:

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

Благодаря первому комментарию я узнал о добавлении рекурсивного триггера в 3.6.18. Поскольку я компилирую свой собственный файл sqlite.exe версии 3.8.5 и выполняю вставку из командной строки, это может быть проблемой.

Вот мой новый вопрос: как лучше всего решить эту проблему?

  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 INTO CS_EVENT_PRICE_LIST ( DESCRIPTION, SALES_TAX, TAX_TYPE, INSERTEDBY, INSTERTEDON)
VALUES ( 'Manual Inserted', 6.25, 1, 'Mr. Ed', julianday('now'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...