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;