SQL Triggers: The Essential Guide

ทริกเกอร์คือเอนทิตีฐานข้อมูลใน SQL Server ในทางเทคนิคแล้ว ฟังก์ชันเหล่านี้เป็นคลาสเฉพาะของการเรียกใช้ฟังก์ชันที่ตอบสนองต่อการดำเนินการฐานข้อมูลเฉพาะ

คู่มือที่จำเป็นนี้จะให้ข้อมูลเชิงลึกเกี่ยวกับ SQL Triggers ที่อาจเป็นประโยชน์ในอาชีพของคุณ มาเริ่มกันเลย!

ทริกเกอร์ SQL คืออะไร?

คำว่า “ทริกเกอร์” อธิบายคำสั่งที่เซิร์ฟเวอร์ดำเนินการค้นหาโดยอัตโนมัติทุกครั้งที่มีการเปลี่ยนแปลงเนื้อหาในฐานข้อมูล

ทริกเกอร์คือกลุ่มของคิวรี SQL ที่มีชื่อพิเศษซึ่งจัดเก็บไว้ในพื้นที่หน่วยความจำ เป็นการเรียกฟังก์ชันเฉพาะประเภทที่เรียกใช้ทันทีทุกครั้งที่มีเหตุการณ์ฐานข้อมูลเกิดขึ้น ทริกเกอร์ทุกตัวมีตารางที่กำหนด

ตัวอย่างเช่น ทริกเกอร์สามารถเปิดใช้งานเมื่อใดก็ตามที่มีการเพิ่มคอลัมน์ใหม่ลงในตารางใดตารางหนึ่ง หรือหากมีการเปลี่ยนแปลงระเบียนเฉพาะ

ตาม Microsoft Developer Network ทริกเกอร์เป็นคลาสเฉพาะของกระบวนงานที่เก็บไว้ ในคำสั่งทริกเกอร์ เรากำหนดในขั้นต้นว่าควรเรียกใช้ทริกเกอร์เมื่อใด จากนั้นเราจะจัดเตรียมการดำเนินการที่ควรดำเนินการหลังจากเปิดใช้งานทริกเกอร์แล้ว

ไวยากรณ์:

CREATE TRIGGER trigger_name
BEFORE/AFTER
INSERT/UPDATE/DELETE
ON tableName
FOR EACH ROW SET operation [trigger_body];

คำอธิบายของแต่ละพารามิเตอร์

  • CREATE TRIGGER trigger_name – ใช้เพื่อสร้างทริกเกอร์หรือเปลี่ยนชื่อของทริกเกอร์ที่มีอยู่
  • ก่อน/หลัง – แบบสอบถามนี้ใช้เพื่อกำหนดเวลาดำเนินการของทริกเกอร์ ( ก่อนหรือหลังเหตุการณ์บางอย่าง)
  • INSERT/UPDATE/DELETE – สิ่งนี้อธิบายการกระทำที่เราต้องการทำบนโต๊ะ
  • ON tableName – ที่นี่ เรากำหนดชื่อตารางเพื่อตั้งค่าทริกเกอร์
  • สำหรับแต่ละแถว – คำสั่งนี้เกี่ยวข้องกับการเรียกแถว หมายความว่าทริกเกอร์จะถูกดำเนินการทุกครั้งที่มีการเปลี่ยนแปลงแถว
  • trigger_body – ระบุการดำเนินการที่จะดำเนินการเมื่อทริกเกอร์ถูกเปิดใช้งาน

ทริกเกอร์คือฟังก์ชันที่จัดเก็บไว้ซึ่งมีข้อมูลเฉพาะตัวที่ทำให้เราสามารถนำการสืบค้นข้อมูลที่ดำเนินการแล้วและจัดเก็บไว้อย่างปลอดภัยในหน่วยความจำกลับมาใช้ใหม่ได้ ทีนี้มาทำความเข้าใจว่าทำไม SQL ถึงต้องการมัน

ทริกเกอร์ส่วนใหญ่จะใช้เพื่อควบคุมการปรับใช้โค้ดเมื่อใดก็ตามที่มีเหตุการณ์เกิดขึ้น กล่าวอีกนัยหนึ่ง การใช้ทริกเกอร์เป็นตัวเลือกที่เหมาะสมที่สุด หากคุณต้องการให้ส่วนย่อยของโค้ดเฉพาะทำงานอย่างต่อเนื่องเพื่อตอบสนองต่อเหตุการณ์ที่ระบุ

ต่อไปนี้คือข้อดีบางประการของการใช้ทริกเกอร์ในการดำเนินการฐานข้อมูล SQL

  • ดำเนินการตรวจสอบเพิ่มเติมเมื่อแทรก อัปเดต หรือลบข้อมูลจากตารางที่ได้รับผลกระทบ
  • ลดเวลาตอบสนองซึ่งช่วยเพิ่มค่าใช้จ่ายในการคำนวณ
  • เปิดใช้งานการเข้ารหัสพารามิเตอร์เริ่มต้นที่ซับซ้อนซึ่งไม่สามารถเข้าถึงได้โดยข้อจำกัดเริ่มต้น
  • ความสมบูรณ์ของการอ้างอิงเป็นคุณสมบัติหลักของระบบฐานข้อมูลเชิงสัมพันธ์ นี่หมายความว่าข้อมูลที่เก็บไว้ในระบบฐานข้อมูลต้องถูกต้องเสมอสำหรับแต่ละรายการและการดำเนินการแต่ละครั้ง

    หากตารางสองตารางอยู่ในฐานข้อมูลหรือระบบที่แยกจากกัน ไม่มีทางที่จะรับรองความถูกต้องของข้อมูลภายในตารางโดยใช้ค่าข้อจำกัด ในสถานการณ์เช่นนี้ ทริกเกอร์เป็นตัวเลือกเดียวสำหรับการดำเนินการ

    การรวมกันของอาร์กิวเมนต์ทริกเกอร์

    สำหรับทุกตาราง เราสามารถระบุประเภททริกเกอร์ที่แตกต่างกันได้หกประเภท นี่คือการรวมกันของอาร์กิวเมนต์ทริกเกอร์ที่รวมอยู่ในทริกเกอร์ระดับแถวของ SQL

    ก่อนแทรก: ทริกเกอร์เหล่านี้ดำเนินการกับแถวก่อนที่จะดำเนินการ INSERT ใด ๆ ในตารางที่ระบุหรือบนฐานข้อมูล

    หลังจากแทรก: จะดำเนินการกับแถวทันทีหลังจากกิจกรรม INSERT ของฐานข้อมูล

    ก่อนการอัปเดต: ด้วยทริกเกอร์เหล่านี้ ฟังก์ชันในแถวจะดำเนินการก่อนที่จะดำเนินการ UPDATE ในฐานข้อมูล

    AFTER UPDATE: จะดำเนินการกับแถวทันทีตามฐานข้อมูลหรือกิจกรรม UPDATE ตารางเฉพาะ

    ก่อนลบ: มันรันการดำเนินการบางอย่างในแถวก่อนที่ฐานข้อมูลหรือตารางจะถูกดำเนินการ DELETE

    หลังจากลบ: ทริกเกอร์เหล่านี้ดำเนินการกับแถวหลังจากทุกธุรกรรม DELETE

    ประเภทของทริกเกอร์ SQL

    ทริกเกอร์ SQL เป็นฟังก์ชันที่จัดเก็บไว้ซึ่งทำงานทันทีเมื่อมีเหตุการณ์เฉพาะเกิดขึ้น คล้ายกับการจัดกำหนดการตามเหตุการณ์ สถานการณ์ต่อมาสามารถเริ่มดำเนินการทริกเกอร์ได้

    ทริกเกอร์ DML – DML ย่อมาจากภาษาการจัดการข้อมูล การเรียกใช้โค้ดเพื่อตอบสนองต่อการแก้ไขข้อมูลทำได้โดยใช้ทริกเกอร์ DML ทริกเกอร์นี้จะเปิดใช้งานเมื่อมีการดำเนินการคำสั่ง DML เช่น INSERT, UPDATE และ DELETE สิ่งเหล่านี้เรียกอีกอย่างว่า “ตัวกระตุ้นระดับตาราง”

      แก้ไข Vizio Remote ไม่ทำงาน

    ทริกเกอร์ DDL – DDL ย่อมาจาก Data Definition Language ทริกเกอร์ DDL ช่วยให้เราสามารถเรียกใช้โค้ดตามการเปลี่ยนแปลงสคีมาของฐานข้อมูล เช่น การเพิ่มหรือลบตาราง หรือเหตุการณ์ของเซิร์ฟเวอร์ เช่น เมื่อผู้ใช้เช็คอิน สิ่งเหล่านี้เรียกว่า “ทริกเกอร์ระดับฐานข้อมูล”

    ทริกเกอร์เหล่านี้สามารถเปิดใช้งานได้ เมื่อคำสั่ง DDL บางอย่าง เช่น CREATE, ALTER หรือ DROP ถูกดำเนินการในฐานข้อมูลที่ใช้งานอยู่ สิ่งเหล่านี้ยังสามารถใช้เพื่อจับตาดูและจัดการกิจกรรมที่ดำเนินการ

    ทริกเกอร์การล็อกออน – เมื่อใดก็ตามที่เหตุการณ์การล็อกออนเกิดขึ้น (การเริ่มต้น เข้าสู่ระบบ ออกจากระบบ การปิดระบบ) ทริกเกอร์การเข้าสู่ระบบจะเรียกใช้ทันที การดำเนินการเหล่านี้จะดำเนินการตามกระบวนการตรวจสอบสิทธิ์ผู้ใช้เท่านั้น แม้กระทั่งก่อนธุรกรรมของผู้ใช้จะเริ่มต้นขึ้น ทริกเกอร์ LOGON จะไม่ทำงานหากการอนุญาตล้มเหลว

    ทริกเกอร์เหล่านี้สามารถใช้เพื่อบันทึกประวัติการเข้าสู่ระบบหรือสร้างการจำกัดเหตุการณ์สำหรับการเข้าสู่ระบบเฉพาะ ท่ามกลางฟังก์ชันการตรวจสอบและการจัดการข้อมูลประจำตัวอื่นๆ สำหรับการเชื่อมต่อเซิร์ฟเวอร์

    ทริกเกอร์ CLR – CLR ย่อมาจาก Common Language Runtime ทริกเกอร์ CLR เป็นชุดย่อยที่ไม่ซ้ำกันของทริกเกอร์ที่สร้างขึ้นโดยส่วนใหญ่บน CLR ภายในเทคโนโลยี .NET ทริกเกอร์เหล่านี้มีประโยชน์หากทริกเกอร์จำเป็นต้องทำการคำนวณเป็นจำนวนมาก หรือจำเป็นต้องเกี่ยวข้องกับเอนทิตีอื่นที่ไม่ใช่ SQL

    ทริกเกอร์ DML และ DDL สามารถสร้างได้ด้วยการเปิดใช้งานการเข้ารหัสทริกเกอร์ CLR ที่รองรับในเทคโนโลยี .NET รวมถึง Visual Basic, C# และ F-sharp

    ตัวอย่าง SQL Server Trigger

    มาทำความเข้าใจแนวคิดทริกเกอร์เหล่านี้ด้วยตัวอย่างกัน

    ขั้นแรก ให้สร้างฐานข้อมูลโดยใช้คำสั่ง SQL

    CREATE DATABASE testdb;
    use testdb;

    ที่นี่ฉันได้ให้ “testdb” เป็นชื่อของฐานข้อมูล และขั้นตอนต่อไปคือการสร้างตาราง

    CREATE TABLE student(
      name varchar(25),
      id int(2),
      maths int(2),
      physics int(2),
      biology int(2),
      social int(2),
      total int(2)
     );

    ฉันได้สร้างตารางสำหรับจัดเก็บรายละเอียดนักเรียน และนี่คือคำสั่งอธิบายโครงสร้างของตาราง ที่นี่ “นักเรียน” คือชื่อตารางที่ฉันให้ไว้

    DESC student;

    ด้านล่างเป็นโครงสร้างของตารางที่ฉันสร้างขึ้น

    +---------+-------------+------+-----+---------+-------+
    | Field   | Type        | Null | Key | Default | Extra |
    +---------+-------------+------+-----+---------+-------+
    | name    | varchar(25) | YES  |     | NULL    |       |
    | id      | int         | YES  |     | NULL    |       |
    | maths   | int         | YES  |     | NULL    |       |
    | physics | int         | YES  |     | NULL    |       |
    | biology | int         | YES  |     | NULL    |       |
    | social  | int         | YES  |     | NULL    |       |
    | total   | int         | YES  |     | NULL    |       |
    +---------+-------------+------+-----+---------+-------+
    7 rows in set (0.00 sec)

    หลังจากสร้างตารางแล้ว ขั้นตอนต่อไปคือการตั้งค่าทริกเกอร์ ลองใช้อาร์กิวเมนต์ BEFORE INSERT กัน

      วิธีชาร์จ iPhone ของคุณด้วย MacBook Pro ใหม่

    ชื่อของทริกเกอร์ที่ฉันสร้างคือ “เครื่องหมาย” ทันทีที่มีการแก้ไขตารางด้วยคะแนนของนักเรียน ทริกเกอร์ด้านล่างจะพยายามกำหนดเกรดโดยรวมของนักเรียนโดยอัตโนมัติ

    CREATE TRIGGER marks
    BEFORE INSERT
    ON
    student
    FOR EACH ROW
    set new.total=new.maths+new.physics+new.biology+new.social;

    เนื่องจากเราจำเป็นต้องแทนที่ข้อมูลแถวแทนที่จะทำงานกับข้อมูลเก่า เราจึงกำหนด “ผลรวม” โดยใช้ชื่อคลาสใหม่ และนิพจน์ที่ตามมาทั้งหมดจะถูกนำหน้าด้วยคำหลักใหม่หลังผลรวมโดยใช้ตัวดำเนินการจุด ตอนนี้เราจะเพิ่มค่าในแต่ละแถวและดูผลลัพธ์ ในขั้นต้น คะแนนรวมเป็น 0 สำหรับนักเรียนทุกคน

    INSERT INTO student VALUES("George",02,99,87,92,91,0);
    INSERT INTO student VALUES("James",03,91,81,94,90,0);
    INSERT INTO student VALUES("Harry",04,86,70,73,88,0);
    INSERT INTO student VALUES("John",05,73,89,78,92,0);
    INSERT INTO student VALUES("Lisa",01,94,75,69,79,0);
    

    คำสั่งทริกเกอร์จะถูกทริกเกอร์โดยอัตโนมัติเมื่อข้อมูลถูกแทรกลงในตารางนักเรียนในกรณีนี้ คะแนนรวมของนักเรียนแต่ละคนจะถูกคำนวณโดยทริกเกอร์ ตอนนี้ มาดูกันว่าทริกเกอร์ถูกเรียกใช้หรือไม่โดยใช้คำสั่ง SELECT

    SELECT * FROM table_name;

    และนี่คือผลลัพธ์สุดท้าย

    mysql> select * from student;
    +--------+------+-------+---------+---------+--------+-------+
    | name   | id   | maths | physics | biology | social | total |
    +--------+------+-------+---------+---------+--------+-------+
    | George |    2 |    91 |      81 |      94 |     90 |   356 |
    | James  |    3 |    86 |      70 |      73 |     88 |   317 |
    | Harry  |    4 |    73 |      89 |      78 |     92 |   332 |
    | John   |    5 |    94 |      75 |      69 |     79 |   317 |
    | Lisa   |    1 |    99 |      87 |      92 |     91 |   369 |
    +--------+------+-------+---------+---------+--------+-------+
    5 rows in set (0.00 sec)

    ในผลลัพธ์ข้างต้น คุณจะเห็นว่าเครื่องหมายหัวเรื่องทั้งหมดถูกเพิ่มโดยอัตโนมัติสำหรับนักเรียนแต่ละคน ดังนั้น เราสามารถสรุปได้ว่าทริกเกอร์ถูกเรียกสำเร็จ

    การดำเนินการทริกเกอร์เพิ่มเติม

    เราสามารถดำเนินการได้หลายอย่างโดยใช้ทริกเกอร์ บางอันอาจเรียบง่ายและบางอันอาจซับซ้อนเล็กน้อย แต่เมื่อเราตอบคำถามแล้วจะเข้าใจได้ง่าย เมื่อใช้คำสั่ง Transact-SQL คุณสามารถเปิดใช้งาน ปิดใช้งาน หรือลบทริกเกอร์ได้โดยใช้คำสั่งต่อไปนี้

    แบบสอบถามเพื่อตรวจสอบว่ามีทริกเกอร์เฉพาะหรือไม่

    คำสั่งนี้จะตรวจสอบทริกเกอร์ที่ระบุในฐานข้อมูลทั้งหมด

    SELECT * FROM [sys].[triggers] WHERE [name] = 'Trigger_name'

    แบบสอบถามเพื่อแสดงทริกเกอร์

    ทริกเกอร์ทั้งหมดที่มีอยู่ในฐานข้อมูลที่ใช้งานอยู่จะแสดงโดยคำสั่งต่อไปนี้

    SHOW TRIGGERS;

    แบบสอบถามเพื่อปิดการใช้งานทริกเกอร์

    คำสั่งด้านล่างปิดใช้งานทริกเกอร์ในฐานข้อมูลที่ทำงาน

    DISABLE TRIGGER trigger_name ON DATABASE;

    คุณยังสามารถระบุชื่อตารางบางอย่างเพื่อปิดใช้งานทริกเกอร์ได้

    DISABLE TRIGGER trigger_name ON table_name;

    แบบสอบถามเพื่อเปิดใช้งานทริกเกอร์

    คำสั่งต่อไปนี้จะปิดใช้งานทริกเกอร์เฉพาะที่กำหนดไว้ในตารางที่ระบุในฐานข้อมูลที่ใช้งานอยู่ก่อนจะเปิดใช้งานอีกครั้ง

    ALTER TABLE table_name DISABLE TRIGGER trigger_name
    
    ALTER TABLE table_name ENABLE TRIGGER trigger_name

    ต้องปิดทริกเกอร์ก่อนที่จะพยายามเปิดใช้งาน

      ทำไม GroupMe ไม่อนุญาตให้คุณเข้าสู่ระบบ?

    แบบสอบถามเพื่อเปิดหรือปิดใช้งานทริกเกอร์ทั้งหมดในตาราง

    เมื่อใช้คำสั่ง SQL ข้างต้น เราสามารถปิดใช้งานหรือเปิดใช้งานทริกเกอร์ตารางทั้งหมดได้พร้อมกันโดยแทนที่ “ALL” แทนชื่อทริกเกอร์เฉพาะ

    ALTER TABLE table_name DISABLE TRIGGER ALL 
    
    ALTER TABLE table_name ENABLE TRIGGER ALL

    แบบสอบถามเพื่อลบหรือวางทริกเกอร์

    ทริกเกอร์สามารถกำจัดได้โดยการลบหรือทั้งตาราง ทุกทริกเกอร์ที่เกี่ยวข้องจะถูกลบด้วยเมื่อตารางถูกลบ

    DROP TRIGGER [trigger_name];

    เมื่อใดก็ตามที่ทริกเกอร์ถูกลบ ข้อมูลที่เกี่ยวข้องจะถูกลบออกจากตารางข้อมูล sys.objects

    ข้อดีของทริกเกอร์

    • ง่ายต่อการสร้างทริกเกอร์และทริกเกอร์เองสามารถเรียกใช้ฟังก์ชันและวิธีการที่เก็บไว้ได้
    • ผู้ใช้สามารถใช้การตรวจสอบอย่างง่ายโดยใช้ทริกเกอร์
    • น่าเสียดาย คุณไม่สามารถสร้างข้อจำกัดข้ามเอนทิตีในระบบฐานข้อมูลด้วย SQL Server แม้ว่าคุณจะสามารถจำลองการดำเนินการของข้อจำกัดได้โดยใช้ทริกเกอร์
    • ข้อจำกัดด้านความสมบูรณ์สามารถนำไปใช้กับฐานข้อมูลโดยใช้ทริกเกอร์
    • เมื่อจำเป็นต้องมีการตรวจสอบกลุ่มมากกว่าการตรวจสอบแบบทีละแถวของข้อมูลที่ป้อนใหม่หรือที่เปลี่ยนแปลง ทริกเกอร์อาจมีประโยชน์

    ข้อเสียของทริกเกอร์

    ทริกเกอร์ SQL อาจไม่ใช่ตัวเลือกที่ดีที่สุดในบางสถานการณ์เนื่องจากข้อจำกัด

    • ทริกเกอร์ต้องได้รับการบันทึกอย่างถูกต้อง
    • เนื่องจากการเรียกใช้ฐานข้อมูลพร้อมกันซึ่งส่วนประกอบแอปพลิเคชันอาจไม่สามารถเข้าถึงได้ ทริกเกอร์จึงอาจแก้ไขจุดบกพร่องได้ยาก
    • คำสั่ง DML จะซับซ้อนมากขึ้นเมื่อใช้ทริกเกอร์
    • แม้แต่ปัญหาทริกเกอร์เล็กน้อยก็มีโอกาสที่จะนำไปสู่ข้อผิดพลาดเชิงตรรกะในคำสั่ง

    บทสรุป

    ทริกเกอร์เป็นส่วนประกอบที่มีประโยชน์อย่างมากของ Transact-SQL และ SQL และคุณสามารถใช้ทริกเกอร์เหล่านี้ใน Oracle ได้เช่นกัน การใช้ทริกเกอร์เป็นสิ่งสำคัญเมื่อเรียกใช้เมธอดที่เก็บไว้ ทริกเกอร์ SQL เหล่านี้ช่วยให้เราวิเคราะห์ไทม์ไลน์ของกิจกรรมและกำหนดว่าจะตอบสนองอย่างไรหากจำเป็น เรายังสามารถตรวจสอบตารางบางตารางที่เชื่อมต่อกับทริกเกอร์เพื่อรับข้อมูล

    การเรียกซ้ำสามารถเปิดใช้งานได้ด้วยทริกเกอร์ เมื่อใดก็ตามที่ทริกเกอร์บนโต๊ะรันคำสั่งบนตารางพาเรนต์ การวนซ้ำครั้งที่สองของทริกเกอร์จะถูกตั้งค่าปิด และสิ่งนี้เรียกว่าทริกเกอร์แบบเรียกซ้ำ สิ่งนี้ช่วยได้ในขณะที่พยายามแก้ไขความสัมพันธ์ของข้อมูลประจำตัว

    นอกจากนี้ ทริกเกอร์จะควบคุมรูปแบบการอัปเดตที่ฐานข้อมูลได้รับอนุญาตให้ยอมรับ เป็นประโยชน์อย่างมากในการรักษาข้อจำกัดความสมบูรณ์ของข้อมูลในระบบฐานข้อมูล ถ้าไม่มีคีย์ข้อจำกัด SQL ส่วนใหญ่เป็นคีย์หลักและคีย์ภายนอก

    ฉันหวังว่าคุณจะพบว่าบทความนี้มีประโยชน์ในการเรียนรู้เกี่ยวกับ SQL Trigger

    หากคุณต้องการเรียนรู้ฐานข้อมูลในเชิงลึก ต่อไปนี้คือแหล่งข้อมูลที่ยอดเยี่ยมบางส่วนในการเรียนรู้ SQL และ NoSQL

    เรื่องล่าสุด

    x