鍍金池/ 教程/ 數(shù)據(jù)庫/ SQLite 觸發(fā)器
SQLite Having 子句
SQLite 運算符
SQLite 注入
SQLite Delete 語句
SQLite – Python
SQLite 數(shù)據(jù)類型
SQLite 簡介
SQLite 創(chuàng)建數(shù)據(jù)庫
SQLite Vacuum
SQLite Group By
SQLite 日期 & 時間
SQLite AND/OR 運算符
SQLite 刪除表
SQLite Distinct
SQLite Alter 命令
SQLite PRAGMA
SQLite 約束
SQLite 創(chuàng)建表
SQLite Like 子句
SQLite Limit 子句
SQLite Autoincrement
SQLite 子查詢
SQLite – C/C++
SQLite – PHP
SQLite 命令
SQLite Order By
SQLite Select 語句
SQLite Unions 子句
SQLite – Perl
SQLite – Java
SQLite 別名
SQLite 常用函數(shù)
SQLite Explain(解釋)
SQLite NULL 值
SQLite Glob 子句
SQLite 表達式
SQLite 視圖
SQLite Where 子句
SQLite Truncate Table
SQLite 索引
SQLite Insert 語句
SQLite 安裝
SQLite Indexed By
SQLite 分離數(shù)據(jù)庫
SQLite 觸發(fā)器
SQLite 語法
SQLite Joins
SQLite Update 語句
SQLite 附加數(shù)據(jù)庫
SQLite 事務

SQLite 觸發(fā)器

SQLite 的觸發(fā)器是數(shù)據(jù)庫的回調函數(shù),它會自動執(zhí)行/指定的數(shù)據(jù)庫事件發(fā)生時調用。以下是關于SQLite的觸發(fā)器的要點: SQLite 觸發(fā)器(Trigger)是數(shù)據(jù)庫的回調函數(shù),它會在指定的數(shù)據(jù)庫事件發(fā)生時自動執(zhí)行/調用。以下是關于 SQLite 的觸發(fā)器(Trigger)的要點:

  • SQLite 的觸發(fā)器(Trigger)可以指定在特定的數(shù)據(jù)庫表發(fā)生 DELETE、INSERT 或 UPDATE 時觸發(fā),或在一個或多個指定表的列發(fā)生更新時觸發(fā)。
  • SQLite 只支持 FOR EACH ROW 觸發(fā)器(Trigger),沒有 FOR EACH STATEMENT 觸發(fā)器(Trigger)。因此,明確指定 FOR EACH ROW 是可選的。
  • WHEN 子句和觸發(fā)器(Trigger)動作可能訪問使用表單 NEW.column-nameOLD.column-name 的引用插入、刪除或更新的行元素,其中 column-name 是從與觸發(fā)器關聯(lián)的表的列的名稱。
  • 如果提供 WHEN 子句,則只針對 WHEN 子句為真的指定行執(zhí)行 SQL 語句。如果沒有提供 WHEN 子句,則針對所有行執(zhí)行 SQL 語句。
  • BEFORE 或 AFTER 關鍵字決定何時執(zhí)行觸發(fā)器動作,決定是在關聯(lián)行的插入、修改或刪除之前或者之后執(zhí)行觸發(fā)器動作。
  • 當觸發(fā)器相關聯(lián)的表刪除時,自動刪除觸發(fā)器(Trigger)。
  • 要修改的表必須存在于同一數(shù)據(jù)庫中,作為觸發(fā)器被附加的表或視圖,且必須只使用 tablename,而不是 database.tablename。
  • 一個特殊的 SQL 函數(shù) RAISE() 可用于觸發(fā)器程序內拋出異常。

語法

創(chuàng)建 觸發(fā)器(Trigger) 的基本語法如下:

    CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name
    ON table_name
    BEGIN
     -- Trigger logic goes here....
    END;

在這里,event_name 可以是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 數(shù)據(jù)庫操作。您可以在表名后選擇指定 FOR EACH ROW。

以下是在 UPDATE 操作上在表的一個或多個指定列上創(chuàng)建觸發(fā)器(Trigger)的語法:

    CREATE  TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
    ON table_name
    BEGIN
     -- Trigger logic goes here....
    END;

實例

讓我們假設一個情況,我們要為被插入到新創(chuàng)建的 COMPANY 表(如果已經(jīng)存在,則刪除重新創(chuàng)建)中的每一個記錄保持審計試驗:

    sqlite> CREATE TABLE COMPANY(
       ID INT PRIMARY KEY     NOT NULL,
       NAME           TEXT    NOT NULL,
       AGE            INT     NOT NULL,
       ADDRESS        CHAR(50),
       SALARY         REAL
    );

為了保持審計試驗,我們將創(chuàng)建一個名為 AUDIT 的新表。每當 COMPANY 表中有一個新的記錄項時,日志消息將被插入其中:

    sqlite> CREATE TABLE AUDIT(
        EMP_ID INT NOT NULL,
        ENTRY_DATE TEXT NOT NULL
    );

在這里,ID 是 AUDIT 記錄的 ID,EMP_ID 是來自 COMPANY 表的 ID,DATE 將保持 COMPANY 中記錄被創(chuàng)建時的時間戳。所以,現(xiàn)在讓我們在 COMPANY 表上創(chuàng)建一個觸發(fā)器,如下所示:

    sqlite> CREATE TRIGGER audit_log AFTER INSERT
    ON COMPANY
    BEGIN
       INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, datetime('now'));
    END;

現(xiàn)在,我們將開始在 COMPANY 表中插入記錄,這將導致在 AUDIT 表中創(chuàng)建一個審計日志記錄。因此,讓我們在 COMPANY 表中創(chuàng)建一個記錄,如下所示:

    sqlite> INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)
    VALUES (1, 'Paul', 32, 'California', 20000.00 );

這將在 COMPANY 表中創(chuàng)建如下一個記錄:

    ID          NAME        AGE         ADDRESS     SALARY
    ----------  ----------  ----------  ----------  ----------
    1           Paul        32          California  20000.0

同時,將在 AUDIT 表中創(chuàng)建一個記錄。這個紀錄是觸發(fā)器的結果,這是我們在 COMPANY 表上的 INSERT 操作上創(chuàng)建的觸發(fā)器(Trigger)。類似的,可以根據(jù)需要在 UPDATE 和 DELETE 操作上創(chuàng)建觸發(fā)器(Trigger)。

    EMP_ID      ENTRY_DATE
    ----------  -------------------
    1           2013-04-05 06:26:00

列出觸發(fā)器(TRIGGERS)

您可以從 sqlite_master 表中列出所有觸發(fā)器,如下所示:

    sqlite> SELECT name FROM sqlite_master
    WHERE type = 'trigger';

上面的 SQLite 語句只會列出一個條目,如下:

    name
    ----------
    audit_log

如果您想要列出特定表上的觸發(fā)器,則使用 AND 子句連接表名,如下所示:

    sqlite> SELECT name FROM sqlite_master
    WHERE type = 'trigger' AND tbl_name = 'COMPANY';

上面的 SQLite 語句只會列出一個條目,如下:

    name
    ----------
    audit_log

刪除觸發(fā)器(TRIGGERS)

下面是 DROP 命令,可用于刪除已有的觸發(fā)器:

    sqlite> DROP TRIGGER trigger_name;