Trigger

SQLite:觸發多個表和/或多個操作

  • December 4, 2020

我正在尋找一種編寫SQLite 觸發器的方法,該觸發器將影響多個操作和多個表(事實上,我希望每次在數據庫中的任何表上執行任何查詢時都在特定表上執行它)。


這是一個例子,來解釋我的意思。我有 3 張桌子:Students, Courses, Professors. 每個學生都有activation_deadline欄位,NULL在啟動時設置為。我希望每次執行任何查詢時,檢查是否有過期的學生activation_deadline以及是否有 - 刪除它們。

目前,我Students為此準備了三個單獨的觸發器。

一個用於UPDATE

CREATE TRIGGER Remove_Unactivated_Students_Update
AFTER UPDATE
ON Students
FOR EACH ROW
BEGIN
   DELETE FROM Students
   WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;

一個用於INSERT

CREATE TRIGGER Remove_Unactivated_Students_Insert
BEFORE INSERT
ON Students
FOR EACH ROW
BEGIN
   DELETE FROM Students
   WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;

一個用於DELETE

CREATE TRIGGER Remove_Unactivated_Students_Delete
AFTER DELETE
ON Students
FOR EACH ROW
BEGIN
   DELETE FROM Students
   WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;

我想要的是這樣的:

CREATE TRIGGER Remove_Unactivated_Students
AFTER INSERT, UPDATE, DELETE
ON Students, Courses, Professors
FOR EACH ROW
BEGIN
   DELETE FROM Students
   WHERE (activation_deadline IS NOT NULL) AND (activation_deadline <= strftime('%s', 'now'));
END;

當然,這給了我:

Error: near line 1: near ",": syntax error

鑑於上面所說的,這裡有幾個問題:

  1. 是否可以一次為多個表編寫 SQLite 觸發器(如果可以的話)?
  2. 是否可以一次為多個操作(ei、、、)編寫 SQLite 觸發器UPDATEINSERT如果DELETE可以的話)?
  3. 也許有更好的方法來實現我的目標?
  1. 不,SQLite 似乎沒有數據庫或伺服器級別的觸發器(如其他數據庫系統)。相反,您必須在每個表上創建相同的觸發器。
  2. 不幸的是,這也是 SQLite 的一個限制,也是不可能的。
  3. 您最好讓連接到 SQLite 數據庫的應用程序(或輔助程序/作業,具體取決於您的數據庫是儲存在移動設備還是電腦上)來控制刪除哪些記錄以及何時刪除。例如,如果您在 Windows 機器上託管 SQLite 數據庫,則可以安排一個定期清理數據庫的任務。否則,您可以將其建構到應用程序的框架中,每當進行數據庫呼叫時,清理腳本都會首先執行。

這是 SQLite 上 CREATE TRIGGER 語句的語法樹。它可能有助於澄清你能做什麼和不能做什麼。

引用自:https://dba.stackexchange.com/questions/280818