2010-02-12 82 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;