Как обработать отсутствующую функцию 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;