Как справиться с отсутствующей функцией SQLite: отключить триггеры? - PullRequest
9 голосов
/ 12 февраля 2010

Как справиться с отсутствующей функцией SQLite: disable triggers?

У меня нет названия триггеров для конкретной таблицы.

Например, как я могу сбросить все триггеры?
Что бы вы сделали?

Ответы [ 5 ]

7 голосов
/ 12 февраля 2010

SQLite сохраняет информацию схемы (мета) во встроенной таблице sqlite_master.

Чтобы получить список доступных триггеров, используйте следующий запрос:

SELECT name FROM sqlite_master
WHERE type = 'trigger' -- AND tbl_name = 'a_table_name'
7 голосов
/ 23 июня 2010

Я написал очень простую функцию расширения для установки логического значения в true или false.

И функция для извлечения этого значения (GetAllTriggersOn ()).

С помощью этой функции я могу определить все мои триггеры, такие как:

CREATE TRIGGER tr_table1_update AFTER UPDATE ON TABLE1 WHEN GetAllTriggersOn()
BEGIN
    -- ...
END
6 голосов
/ 22 июля 2015

Итак, это 2015 год, и в SQLite до сих пор нет «триггеров отключения». Для мобильного приложения это может быть проблематично, особенно если это корпоративное приложение, требующее автономной работы и локальных данных.

Начальная загрузка данных может быть замедлена для обхода при выполнении триггера, даже если вы не заключаете каждую вставку в отдельную транзакцию.

Я решил эту проблему с помощью SQLite SQL довольно просто. У меня есть таблица настроек, которая не участвует в загрузке init. Он содержит «список» пар ключ / значение. У меня есть один ключ с именем 'fireTrigger' с битовым значением 0 или 1. У каждого моего триггера есть выражение, которое выбирает значение, и если оно равно 1, оно запускает триггер, в противном случае это не так.

Это выражение является дополнением к любым выражениям, оцениваемым на данных, относящихся к триггеру. e.g.:

AND 1 = (SELECT val FROM MTSSettings WHERE key = 'fireTrigger')

В простом чистом эффекте это позволяет мне отключить / включить триггер с простым UPDATE в таблице настроек

1 голос
/ 12 февраля 2010

Может быть, вы можете сделать хранимые процедуры для удаления и создания их. Это хорошо для тебя?

0 голосов
/ 16 июня 2017

Расширяя ответ Ника Дандулакиса, вы можете сбросить все соответствующие триггеры и затем восстановить их до завершения транзакции:

BEGIN;
SELECT name, sql FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'mytable';
-- store all results
-- for each name: DROP TRIGGER $name;
-- do normal work
-- for each sql: execute the SQL verbatim
COMMIT;
...