SQLITE觸發器

SQLite 觸發器(Trigger)

【定義】

SQLite 的觸發器是數據庫的回調函數,它會自動執行/指定的數據庫事件發生時調用。如下是關於SQLite的觸發器的要點: SQLite 觸發器(Trigger)是數據庫的回調函數,它會在指定的數據庫事件發生時自動執行/調用。html

【要點】

 

  • SQLite 的觸發器(Trigger)能夠指定在特定的數據庫表發生 DELETE、INSERT 或 UPDATE 時觸發,或在一個或多個指定表的列發生更新時觸發。web

  • SQLite 只支持 FOR EACH ROW 觸發器(Trigger),沒有 FOR EACH STATEMENT 觸發器(Trigger)。所以,明確指定 FOR EACH ROW 是可選的。sql

  • WHEN 子句和觸發器(Trigger)動做可能訪問使用表單 NEW.column-name 和 OLD.column-name 的引用插入、刪除或更新的行元素,其中 column-name 是從與觸發器關聯的表的列的名稱。數據庫

  • 若是提供 WHEN 子句,則只針對 WHEN 子句爲真的指定行執行 SQL 語句。若是沒有提供 WHEN 子句,則針對全部行執行 SQL 語句。函數

  • BEFORE 或 AFTER 關鍵字決定什麼時候執行觸發器動做,決定是在關聯行的插入、修改或刪除以前或者以後執行觸發器動做。spa

  • 當觸發器相關聯的表刪除時,自動刪除觸發器(Trigger)。日誌

  • 要修改的表必須存在於同一數據庫中,做爲觸發器被附加的表或視圖,且必須只使用 tablename,而不是 database.tablenamecode

  • 一個特殊的 SQL 函數 RAISE() 可用於觸發器程序內拋出異常。orm

 

【語法】

 

建立 觸發器(Trigger) 的基本語法以下:sqlite

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

在這裏,event_name 能夠是在所提到的表 table_name 上的 INSERT、DELETE 和 UPDATE 數據庫操做。您能夠在表名後選擇指定 FOR EACH ROW。

如下是在 UPDATE 操做上在表的一個或多個指定列上建立觸發器(Trigger)的語法:

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

 

【例子】

 

讓咱們假設一個狀況,咱們要爲被插入到新建立的 COMPANY 表(若是已經存在,則刪除從新建立)中的每個記錄保持審計試驗:

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

爲了保持審計試驗,咱們將建立一個名爲 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 中記錄被建立時的時間戳。因此,如今讓咱們在 COMPANY 表上建立一個觸發器,以下所示:

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

如今,咱們將開始在 COMPANY 表中插入記錄,這將致使在 AUDIT 表中建立一個審計日誌記錄。所以,讓咱們在 COMPANY 表中建立一個記錄,以下所示:

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

這將在 COMPANY 表中建立以下一個記錄:

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

同時,將在 AUDIT 表中建立一個記錄。這個紀錄是觸發器的結果,這是咱們在 COMPANY 表上的 INSERT 操做上建立的觸發器(Trigger)。相似的,能夠根據須要在 UPDATE 和 DELETE 操做上建立觸發器(Trigger)。

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

 

【列出觸發器(TRIGGERS)】

 

您能夠從 sqlite_master 表中列出全部觸發器,以下所示:

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

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

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

若是您想要列出特定表上的觸發器,則使用 AND 子句鏈接表名,以下所示:

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

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

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

 

【刪除觸發器】

 

下面是 DROP 命令,可用於刪除已有的觸發器:

sqlite> DROP TRIGGER trigger_name;

 

【網上的例子】

--建立班級表
create table class
(
    id integer primary key autoincrement, --班級編號   
    className nvarchar(50) --班級名稱
);

--建立學生表
create table student
(
    id integer primary key autoincrement, --編號   
    stuName nvarchar(20),    --學生名稱
    stuSex bit,    --性別
    stuAge integer ,     --年齡
    classId   --班級編號
);

--建立插入觸發器 (建立學生時要觸發插入觸發器去判斷是否存在該班級,存在插入成功,反之插入失敗)
create trigger fk_Insert
before insert on student
for each row 
begin
    select raise(rollback,'尚未該班級') 
    where (select id from class where id = new.classId ) is null;    
end;

--建立更新觸發器 (更新學生時要觸發更新觸發器去判斷是否存在更新班級,存在更新成功,反之更新失敗)
create trigger fk_Update
before update on student
for each row 
begin
    select raise(rollback,'尚未該班級')
    where (select id from class where id = new.classId)is null; 
end;

--建立刪除觸發器 (刪除班級時,首先根據班級編號刪除該班級學生)
create trigger fk_Delete
before delete on class
for each row
begin
     delete from student where classId = old.classId;
end ;


insert into class(className) values('s1t64');

insert into student(stuName,stuSex,stuAge,classId)values('zhangsan',1,23,1);

update student set stuName='lishi',classId=1 where id = 1;

select * from class ;
select * from student limit 0,100 ; -- 分頁查詢從索引0開始查找,100條數據

【參考地址】

http://www.w3cschool.cc/sqlite/sqlite-trigger.html

http://blog.sina.com.cn/s/blog_8c26f28301014qrm.html

相關文章
相關標籤/搜索