Как обработать отсутствующую функцию SQLite: отключить триггеры?

Как обрабатывать отсутствующую функцию SQLite:disable triggers?

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

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

5 ответов


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

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

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

CREATE TRIGGER tr_table1_update AFTER UPDATE ON TABLE1 WHEN GetAllTriggersOn()
BEGIN
    -- ...
END

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

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

SELECT name FROM sqlite_master
WHERE type = 'trigger' -- AND tbl_name = 'a_table_name'

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

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

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

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

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

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


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


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

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;