2010-02-12 81 views

回答

7

我写了一个很简单的扩展功能来设置一个布尔值true或false。

还有一个函数来检索这个值(GetAllTriggersOn())。

有了这个功能,我可以这样定义我的所有触发器:

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

你是如何在SQLite中创建函数的? – Ivan 2017-03-14 21:34:47

1

也许你可以制作一个存储过程来放置和创建它们。这对你有好处吗?

+0

我没有存储触发器的名称。所以我需要获得所有特定于表格的触发器。 – Pentium10 2010-02-12 10:09:04

6

SQLite将架构(元)信息存储在内置的sqlite_master表中。

要获取可用触发的列表,请使用以下查询:

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

所以这里是2015年和目前仍然没有“禁止触发器的” SQLite中。对于移动应用程序,这可能会产生问题 - 尤其是如果它是需要脱机功能和本地数据的公司应用程序。

即使您没有将每个插入包装在单个事务中,也可以通过触发器执行来减缓初始数据加载以进行爬网。

我用SQLite SQL很简单地解决了这个问题。我有一个不参与init加载的设置表。它包含键/值对的“列表”。我有一个名为'fireTrigger'的键,其值为0或1.每个触发器都有一个表达式来选择值,如果它等于1,则触发触发器,否则触发器不触发。

此表达式是对与触发器相关的数据评估的任何表达式的补充。例如:

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

在简单的清洗效果,这允许我禁用/启用一个简单UPDATE将设置表

0

扩展在尼克Dandoulakis的回答了扳机,你可以放下所有相关的触发器,然后恢复它们在交易完成之前:

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;