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;