Trigger

觸發器和檢查約束如何與維護數據庫規則相關

  • October 10, 2016

我正在查看有關 SQLite 觸發器的教程。該教程說觸發器的使用可以用於數據驗證。

以下程式碼作為範例給出:

CREATE TRIGGER validate_email_before_insert_leads BEFORE INSERT ON leads
BEGIN
   SELECT
   CASE
       WHEN NEW.email NOT LIKE '%_@__%.__%' THEN
       RAISE (ABORT, 'Invalid email address')
   END;
END;

我的第一個傾向是使用檢查約束進行驗證。我在 Google 上搜尋了應該使用檢查約束以及何時更可取觸發器的情況。

問題

我的問題是,應該在哪些具體情況下使用檢查約束,哪些情況下應該選擇使用觸發器?

您沒有在問題中指定標籤,所以我假設您在問一個通用問題,儘管有 SQLite 參考(如果您問的是 SQLite 特定的問題,請更新您的標籤)。

一般來說,當你不能使用檢查約束時,我建議使用觸發器。不同的數據庫引擎對您可以在檢查約束中執行的操作具有不同級別的支持。例如,我不知道任何數據庫引擎目前允許您定義一個檢查約束,該約束引用不同表中的數據或同一表的不同行中的數據。

如果您的數據庫引擎允許您在檢查約束中定義電子郵件格式規則,我會使用檢查約束。但是,如果您的電子郵件驗證規則更複雜,或者您將在許多地方擁有相同的驗證規則,您可能希望將它們封裝在一個函式中。一旦你這樣做了,大多數數據庫引擎都會要求你使用觸發器。例如,您可能想要執行更詳細的驗證,包括檢查域是否有效、表中行上的電子郵件域是否leads不在customer表中等。此時,您正在做某事比檢查約束所能管理的更複雜。

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