PostgreSQL ทริกเกอร์: สร้าง แสดงรายการ & วางพร้อมตัวอย่าง

⚡ สรุปอย่างชาญฉลาด

PostgreSQL ทริกเกอร์คือฟังก์ชันที่จะทำงานโดยอัตโนมัติเมื่อเกิดเหตุการณ์ INSERT, UPDATE หรือ DELETE บนตาราง ทำให้ฐานข้อมูลสามารถบังคับใช้กฎ บันทึกการเปลี่ยนแปลง และตรวจสอบข้อมูลได้โดยไม่ต้องเขียนโค้ดแอปพลิเคชันเพิ่มเติม

  • ความหมาย: ทริกเกอร์คือฟังก์ชันที่จะถูกเรียกใช้งานโดยอัตโนมัติเมื่อเกิดเหตุการณ์ในฐานข้อมูล เช่น การแทรกข้อมูล การอัปเดต หรือการลบข้อมูล
  • 🔁 ขอบเขต: คำสั่ง FOR EACH ROW จะเรียกใช้ทริกเกอร์หนึ่งครั้งต่อแถวที่ได้รับผลกระทบ ในขณะที่คำสั่ง FOR EACH STATEMENT จะเรียกใช้ทริกเกอร์หนึ่งครั้งต่อการดำเนินการ
  • 🛠️ สร้าง: คำสั่ง CREATE TRIGGER จะผูกฟังก์ชันเข้ากับตารางและตั้งค่าช่วงเวลาเป็น BEFORE, AFTER หรือ INSTEAD OF
  • 📋 รายการ: เรียกดูแคตตาล็อก pg_trigger ด้วยคำสั่ง SELECT tgname เพื่อดูทริกเกอร์ทั้งหมดในฐานข้อมูล
  • 🗑️ วาง: DROP TRIGGER ใช้สำหรับลบทริกเกอร์ และ IF EXISTS ใช้สำหรับป้องกันข้อผิดพลาดเมื่อทริกเกอร์หายไป
  • 🤖 ความช่วยเหลือจาก AI: ผู้ช่วย AI สร้างฟังก์ชันกระตุ้นและแนะนำช่วงเวลา "ก่อน" หรือ "หลัง" จากคำขอที่เป็นภาษาธรรมดา

PostgreSQL ทริกเกอร์

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

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

วิธีการใช้ทริกเกอร์ PostgreSQL?

สามารถกำหนดทริกเกอร์ด้วยตัวดำเนินการ FOR EACH ROW ในระหว่างการสร้างได้ ทริกเกอร์ดังกล่าวจะถูกเรียกใช้หนึ่งครั้งสำหรับแต่ละแถวที่ถูกแก้ไขโดยการดำเนินการนั้น นอกจากนี้ยังสามารถกำหนดทริกเกอร์ด้วยตัวดำเนินการ FOR EACH STATEMENT ในระหว่างการสร้างได้ ทริกเกอร์นี้จะถูกเรียกใช้เพียงครั้งเดียวสำหรับการดำเนินการเฉพาะนั้น ๆ

PostgreSQL สร้างทริกเกอร์

ในการสร้างทริกเกอร์ เราใช้ฟังก์ชัน CREATE TRIGGER นี่คือไวยากรณ์สำหรับฟังก์ชัน:

CREATE TRIGGER trigger-name [BEFORE|AFTER|INSTEAD OF] event-name
ON table-name
[
 -- Trigger logic
];

ชื่อทริกเกอร์คือชื่อของทริกเกอร์

BEFORE, AFTER และ INSTEAD OF คือคีย์เวิร์ดที่กำหนดว่าจะเรียกใช้ทริกเกอร์เมื่อใด

ชื่อเหตุการณ์คือชื่อของเหตุการณ์ที่จะทำให้ทริกเกอร์ถูกเรียกใช้ นี้สามารถ INSERT, อัปเดต, ลบ ฯลฯ

ชื่อตารางคือชื่อของตารางที่จะสร้างทริกเกอร์

หากจะต้องสร้างทริกเกอร์สำหรับการดำเนินการ INSERT เราจะต้องเพิ่มพารามิเตอร์ชื่อคอลัมน์ ON

รูปแบบประโยคต่อไปนี้แสดงให้เห็นสิ่งนี้:

CREATE TRIGGER trigger-name AFTER INSERT ON column-name
ON table-name
[
 -- Trigger logic
];

PostgreSQL สร้างตัวอย่างทริกเกอร์

เราจะใช้ตารางราคาที่ระบุด้านล่าง:

ราคา:

PostgreSQL สร้างทริกเกอร์

ให้เราสร้างตารางใหม่ Price_Audits ซึ่งเราจะบันทึกการเปลี่ยนแปลงที่ทำกับตารางราคา:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
);

ตอนนี้เราสามารถกำหนดฟังก์ชันใหม่ชื่อ auditfunc ได้:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql;

ฟังก์ชันด้านบนจะแทรกบันทึกลงในตาราง Price_Audits รวมถึงรหัสแถวใหม่และเวลาที่สร้างบันทึก

ตอนนี้เรามีฟังก์ชันทริกเกอร์แล้ว เราควรผูกมันเข้ากับตารางราคาของเรา เราจะตั้งชื่อทริกเกอร์ว่า price_trigger ก่อนที่จะมีการสร้างเรคอร์ดใหม่ ฟังก์ชันทริกเกอร์จะถูกเรียกใช้งานโดยอัตโนมัติเพื่อบันทึกการเปลี่ยนแปลง นี่คือทริกเกอร์:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc();

ให้เราแทรกบันทึกใหม่ลงในตารางราคา:

INSERT INTO Price
VALUES (3, 400);

ตอนนี้เราได้เพิ่มข้อมูลลงในตาราง Price แล้ว ข้อมูลควรจะถูกเพิ่มลงในตาราง Price_Audits ด้วยเช่นกัน เนื่องจากทริกเกอร์ที่เราสร้างไว้ ลองตรวจสอบดู:

SELECT * FROM Price_Audits;

สิ่งนี้จะส่งคืนสิ่งต่อไปนี้:

PostgreSQL สร้างทริกเกอร์

ทริกเกอร์ทำงานได้สำเร็จ

PostgreSQL รายการทริกเกอร์

ทริกเกอร์ทั้งหมดที่คุณสร้างขึ้น PostgreSQL จะถูกเก็บไว้ในตาราง pg_trigger หากต้องการดูรายการทริกเกอร์ที่คุณมี ฐานข้อมูลค้นหาตารางโดยการรันคำสั่ง SELECT ดังที่แสดงด้านล่าง:

SELECT tgname FROM pg_trigger;

สิ่งนี้ส่งคืนสิ่งต่อไปนี้:

PostgreSQL รายการทริกเกอร์

คอลัมน์ tgname ของตาราง pg_trigger หมายถึงชื่อของทริกเกอร์

PostgreSQL ดรอปทริกเกอร์

เมื่อไม่ต้องการใช้งานตัวกระตุ้นอีกต่อไป คุณสามารถลบออกได้ง่ายๆ เช่นกัน วิธีการลบตัวกระตุ้น PostgreSQL ทริกเกอร์ เราใช้คำสั่ง DROP TRIGGER โดยมีรูปแบบดังต่อไปนี้:

DROP TRIGGER [IF EXISTS] trigger-name
ON table-name [ CASCADE | RESTRICT ];

พารามิเตอร์ชื่อทริกเกอร์หมายถึงชื่อของทริกเกอร์ที่จะถูกลบ

ชื่อตารางหมายถึงชื่อของตารางที่ต้องการลบทริกเกอร์

ส่วนคำสั่ง IF EXISTS พยายามลบทริกเกอร์ที่มีอยู่ หากคุณพยายามลบทริกเกอร์ที่ไม่มีอยู่โดยไม่ใช้ส่วนคำสั่ง IF EXISTS คุณจะได้รับข้อผิดพลาด

ตัวเลือก CASCADE จะช่วยให้คุณวางวัตถุทั้งหมดที่ขึ้นอยู่กับทริกเกอร์โดยอัตโนมัติ

หากคุณใช้ตัวเลือก RESTRICT ทริกเกอร์จะไม่ถูกลบหากออบเจ็กต์ขึ้นอยู่กับทริกเกอร์

ตัวอย่างเช่น:

หากต้องการลบทริกเกอร์ที่ชื่อ example_trigger บนตาราง Company ให้รันคำสั่งต่อไปนี้:

DROP TRIGGER example_trigger IF EXISTS
ON Company;

การใช้งาน pgAdmin

ต่อไปนี้เรามาดูกันว่าการดำเนินการทั้งสามอย่างนี้ทำได้อย่างไรโดยใช้ pgAdmin

วิธีการสร้างทริกเกอร์ใน PostgreSQL โดยใช้ pgAdmin

ต่อไปนี้คือวิธีการสร้างทริกเกอร์ใน PostgreSQL ใช้ pgAdmin:

ขั้นตอนที่ 1) เข้าสู่ระบบบัญชี pgAdmin ของคุณ

เปิด pgAdmin และเข้าสู่ระบบบัญชีของคุณโดยใช้ข้อมูลประจำตัวของคุณ

ขั้นตอนที่ 2) สร้างฐานข้อมูลสาธิต

  1. จากแถบนำทางด้านซ้าย คลิกฐานข้อมูล
  2. คลิกสาธิต

สร้างทริกเกอร์ใน PostgreSQL โดยใช้ pgAdmin

ขั้นตอนที่ 3) พิมพ์แบบสอบถาม

ในการสร้างตาราง Price_Audits ให้พิมพ์คำสั่ง SQL ลงในตัวแก้ไข:

CREATE TABLE Price_Audits (
   book_id INT NOT NULL,
    entry_date text NOT NULL
)

ขั้นตอนที่ 4) ดำเนินการแบบสอบถาม

คลิกปุ่มดำเนินการ

สร้างทริกเกอร์ใน PostgreSQL โดยใช้ pgAdmin

ขั้นตอนที่ 5) เรียกใช้ไฟล์ Code สำหรับฟังก์ชันการตรวจสอบ

เรียกใช้โค้ดต่อไปนี้เพื่อกำหนดฟังก์ชัน auditfunc:

CREATE OR REPLACE FUNCTION auditfunc() RETURNS TRIGGER AS $my_table$
   BEGIN
      INSERT INTO Price_Audits(book_id, entry_date) VALUES (new.ID, current_timestamp);
      RETURN NEW;
   END;
$my_table$ LANGUAGE plpgsql

ขั้นตอนที่ 6) เรียกใช้ไฟล์ Code เพื่อสร้างทริกเกอร์

รันโค้ดต่อไปนี้เพื่อสร้างทริกเกอร์ price_trigger:

CREATE TRIGGER price_trigger AFTER INSERT ON Price
FOR EACH ROW EXECUTE PROCEDURE auditfunc()

ขั้นตอนที่ 7) แทรกบันทึกใหม่

  1. รันคำสั่งต่อไปนี้เพื่อแทรกข้อมูลใหม่ลงในตารางราคา:
INSERT INTO Price
VALUES (3, 400)
  1. รันคำสั่งต่อไปนี้เพื่อตรวจสอบว่ามีการเพิ่มระเบียนเข้าไปในตาราง Price_Audits หรือไม่:
SELECT * FROM Price_Audits

สิ่งนี้ควรส่งคืนสิ่งต่อไปนี้:

สร้างทริกเกอร์ใน PostgreSQL โดยใช้ pgAdmin

ขั้นตอนที่ 8) ตรวจสอบเนื้อหาของตาราง

เรามาตรวจสอบเนื้อหาในตาราง Price_Audits กันเถอะ

รายชื่อทริกเกอร์โดยใช้ pgAdmin

ขั้นตอน 1) รันคำสั่งต่อไปนี้เพื่อตรวจสอบทริกเกอร์ในฐานข้อมูลของคุณ:

SELECT tgname FROM pg_trigger

สิ่งนี้ส่งคืนสิ่งต่อไปนี้:

รายชื่อทริกเกอร์โดยใช้ pgAdmin

หล่นping ทริกเกอร์ที่ใช้ pgAdmin

หากต้องการลบทริกเกอร์ที่ชื่อ example_trigger บนตาราง Company ให้รันคำสั่งต่อไปนี้:

DROP TRIGGER example_trigger IF EXISTS
ON Company

ดาวน์โหลดฐานข้อมูลที่ใช้ในบทช่วยสอนนี้

คำถามที่พบบ่อย

ทริกเกอร์แบบ BEFORE จะทำงานก่อนที่จะมีการบันทึกการเปลี่ยนแปลงแถว ดังนั้นจึงสามารถแก้ไขหรือปฏิเสธแถวนั้นได้ ส่วนทริกเกอร์แบบ AFTER จะทำงานหลังจากบันทึกการเปลี่ยนแปลงแล้ว เหมาะสำหรับงานบันทึกและตรวจสอบ

ทริกเกอร์ INSTEAD OF ถูกกำหนดไว้บนวิว ไม่ใช่ตาราง มันจะแทนที่คำสั่ง INSERT, UPDATE หรือ DELETE ด้วยตรรกะที่กำหนดเอง ทำให้วิวที่อ่านได้อย่างเดียวสามารถเขียนได้

ฟังก์ชันทริกเกอร์มักเขียนด้วยภาษา PL/pgSQL PostgreSQL นอกจากนี้ยังรองรับ PL/ ด้วยPythonเช่น PL/Perl, PL/Tcl และ C ดังนั้นคุณจึงสามารถเลือกภาษาที่เหมาะสมกับตรรกะของคุณได้

ใช้คำสั่ง ALTER TABLE table-name DISABLE TRIGGER trigger-name เพื่อปิดใช้งาน และใช้คำสั่ง ENABLE TRIGGER เพื่อเปิดใช้งานอีกครั้ง วิธีนี้จะช่วยป้องกันการลบข้อมูลping และสร้างทริกเกอร์ขึ้นใหม่ระหว่างการโหลดข้อมูลจำนวนมาก

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

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

ผู้ช่วยเขียนโค้ด AI จะแปลงคำขอที่เป็นภาษาธรรมดาให้เป็นคำสั่ง CREATE TRIGGER และฟังก์ชันทริกเกอร์ที่สมบูรณ์ แนะนำช่วงเวลา BEFORE หรือ AFTER และอธิบายโค้ด PL/pgSQL ที่สร้างขึ้นเพื่อให้ตรวจสอบได้อย่างรวดเร็ว

ใช่แล้ว เครื่องมือต่างๆ เช่น pgai และตัวช่วยที่ใช้ GPT จะแปลงกฎที่อธิบายไว้เป็น SQL สำหรับทริกเกอร์ และสามารถสร้างทริกเกอร์ INSERT ที่ติดแท็กหรือตรวจสอบความถูกต้องของข้อมูลใหม่โดยอัตโนมัติเมื่อข้อมูลเข้ามาได้

สรุปโพสต์นี้ด้วย: