SQLite - ทริกเกอร์
SQLite Triggersคือฟังก์ชันเรียกกลับฐานข้อมูลซึ่งจะดำเนินการ / เรียกใช้โดยอัตโนมัติเมื่อเกิดเหตุการณ์ฐานข้อมูลที่ระบุ ต่อไปนี้เป็นประเด็นสำคัญเกี่ยวกับทริกเกอร์ SQLite -
- ทริกเกอร์ SQLite อาจถูกระบุให้เริ่มทำงานเมื่อใดก็ตามที่เกิดการลบแทรกหรืออัปเดตของตารางฐานข้อมูลใดตารางหนึ่งหรือเมื่อใดก็ตามที่มีการอัปเดตเกิดขึ้นในคอลัมน์ที่ระบุอย่างน้อยหนึ่งคอลัมน์ของตาราง 
- ในขณะนี้ SQLite สนับสนุนทริกเกอร์สำหรับแต่ละแถวเท่านั้นไม่ใช่สำหรับทริกเกอร์แต่ละรายการ ดังนั้นการระบุอย่างชัดเจนสำหรับแต่ละแถวจึงเป็นทางเลือก 
- ทั้งคำสั่ง WHEN และการดำเนินการทริกเกอร์อาจเข้าถึงองค์ประกอบของแถวที่ถูกแทรกลบหรืออัปเดตโดยใช้การอ้างอิงของแบบฟอร์ม NEW.column-name และ OLD.column-nameโดยที่ชื่อคอลัมน์คือชื่อของคอลัมน์จากตารางที่เกี่ยวข้องกับทริกเกอร์ 
- หากมีการระบุคำสั่ง WHEN คำสั่ง SQL ที่ระบุจะถูกดำเนินการสำหรับแถวที่มีคำสั่ง WHEN เป็นจริงเท่านั้น หากไม่มีระบุ WHEN clause คำสั่ง SQL จะถูกเรียกใช้สำหรับทุกแถว 
- คำหลักก่อนหรือหลังกำหนดว่าจะดำเนินการทริกเกอร์เมื่อใดโดยสัมพันธ์กับการแทรกแก้ไขหรือลบแถวที่เกี่ยวข้อง 
- ทริกเกอร์จะหลุดโดยอัตโนมัติเมื่อตารางที่เกี่ยวข้องถูกทิ้ง 
- ตารางที่จะแก้ไขต้องมีอยู่ในฐานข้อมูลเดียวกับตารางหรือมุมมองที่แนบทริกเกอร์และต้องใช้เพียง tablename ไม่ database.tablename. 
- อาจใช้ฟังก์ชัน SQL พิเศษ RAISE () ภายในโปรแกรมทริกเกอร์เพื่อเพิ่มข้อยกเว้น 
ไวยากรณ์
ต่อไปนี้เป็นไวยากรณ์พื้นฐานของการสร้างไฟล์ trigger.
CREATE TRIGGER trigger_name [BEFORE|AFTER] event_name 
ON table_name
BEGIN
 -- Trigger logic goes here....
END;ที่นี่ event_nameอาจเป็นการดำเนินการฐานข้อมูลINSERT ลบและUPDATEบนตารางที่กล่าวถึงtable_name. คุณสามารถเลือกระบุสำหรับแต่ละแถวหลังชื่อตารางได้
ต่อไปนี้เป็นไวยากรณ์สำหรับการสร้างทริกเกอร์ในการดำเนินการ UPDATE บนคอลัมน์ที่ระบุอย่างน้อยหนึ่งคอลัมน์ของตาราง
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name 
ON table_name
BEGIN
   -- Trigger logic goes here....
END;ตัวอย่าง
ให้เราพิจารณากรณีที่เราต้องการทำการทดลองตรวจสอบสำหรับทุกระเบียนที่แทรกในตาราง COMPANY ซึ่งเราสร้างขึ้นใหม่ดังต่อไปนี้ (วางตาราง 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 คือ ID เร็กคอร์ด AUDIT และ EMP_ID คือ ID ซึ่งจะมาจากตาราง COMPANY และ 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 บันทึกนี้เป็นผลมาจากทริกเกอร์ซึ่งเราได้สร้างขึ้นในการดำเนินการ INSERT ในตาราง COMPANY ในทำนองเดียวกันคุณสามารถสร้างทริกเกอร์ของคุณในการอัปเดตและลบการดำเนินการตามความต้องการของคุณ
EMP_ID      ENTRY_DATE
----------  -------------------
1           2013-04-05 06:26:00รายการทริกเกอร์
คุณสามารถแสดงรายการทริกเกอร์ทั้งหมดได้จาก sqlite_master ตารางดังนี้ -
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger';คำสั่ง SQLite ด้านบนจะแสดงรายการเพียงรายการเดียวดังนี้ -
name
----------
audit_logหากคุณต้องการแสดงรายการทริกเกอร์บนตารางใดตารางหนึ่งให้ใช้ AND clause กับชื่อตารางดังนี้ -
sqlite> SELECT name FROM sqlite_master
WHERE type = 'trigger' AND tbl_name = 'COMPANY';คำสั่ง SQLite ข้างต้นจะแสดงรายการเพียงรายการเดียวดังนี้ -
name
----------
audit_logทริกเกอร์ลดลง
ต่อไปนี้คือคำสั่ง DROP ซึ่งสามารถใช้เพื่อวางทริกเกอร์ที่มีอยู่
sqlite> DROP TRIGGER trigger_name;