PostgreSQL - ทริกเกอร์
PostgreSQL Triggers คือฟังก์ชันเรียกกลับฐานข้อมูลซึ่งจะดำเนินการ / เรียกใช้โดยอัตโนมัติเมื่อเกิดเหตุการณ์ฐานข้อมูลที่ระบุ
ต่อไปนี้เป็นประเด็นสำคัญเกี่ยวกับทริกเกอร์ PostgreSQL -
สามารถระบุทริกเกอร์ PostgreSQL เพื่อเริ่มการทำงาน
ก่อนที่จะมีการพยายามดำเนินการในแถว (ก่อนที่จะตรวจสอบข้อ จำกัด และพยายาม INSERT, UPDATE หรือ DELETE)
หลังจากการดำเนินการเสร็จสิ้น (หลังจากตรวจสอบข้อ จำกัด และ INSERT, UPDATE หรือ DELETE เสร็จสิ้น)
แทนการดำเนินการ (ในกรณีของการแทรกอัพเดตหรือลบในมุมมอง)
ทริกเกอร์ที่ถูกทำเครื่องหมายสำหรับแต่ละแถวจะถูกเรียกหนึ่งครั้งสำหรับทุกแถวที่การดำเนินการแก้ไข ในทางตรงกันข้ามทริกเกอร์ที่ถูกทำเครื่องหมายสำหรับแต่ละ STATEMENT จะดำเนินการเพียงครั้งเดียวสำหรับการดำเนินการใด ๆ ก็ตามไม่ว่าจะแก้ไขกี่แถวก็ตาม
ทั้งคำสั่ง WHEN และการดำเนินการทริกเกอร์อาจเข้าถึงองค์ประกอบของแถวที่กำลังแทรกลบหรืออัปเดตโดยใช้การอ้างอิงของแบบฟอร์ม NEW.column-name และ OLD.column-nameโดยที่ชื่อคอลัมน์คือชื่อของคอลัมน์จากตารางที่เกี่ยวข้องกับทริกเกอร์
หากมีการระบุคำสั่ง WHEN คำสั่ง PostgreSQL ที่ระบุจะถูกเรียกใช้เฉพาะสำหรับแถวที่ส่วนคำสั่ง WHEN เป็นจริง หากไม่มีระบุคำสั่ง WHEN คำสั่ง PostgreSQL จะดำเนินการสำหรับทุกแถว
หากมีการกำหนดทริกเกอร์ชนิดเดียวกันหลายตัวสำหรับเหตุการณ์เดียวกันทริกเกอร์จะเริ่มทำงานตามลำดับตัวอักษรตามชื่อ
คำหลักก่อนหลังหรือแทนคำหลักกำหนดว่าจะดำเนินการทริกเกอร์เมื่อใดโดยสัมพันธ์กับการแทรกการแก้ไขหรือการลบแถวที่เกี่ยวข้อง
ทริกเกอร์จะหลุดโดยอัตโนมัติเมื่อตารางที่เกี่ยวข้องถูกทิ้ง
ตารางที่จะแก้ไขต้องมีอยู่ในฐานข้อมูลเดียวกับตารางหรือมุมมองที่แนบทริกเกอร์และต้องใช้เพียง tablenameไม่ใช่ database.tablename.
ตัวเลือกข้อ จำกัด เมื่อระบุสร้างไก จำกัด สิ่งนี้เหมือนกับทริกเกอร์ทั่วไปยกเว้นว่าสามารถปรับระยะเวลาของการยิงไกได้โดยใช้ข้อ จำกัด ของชุด คาดว่าทริกเกอร์ข้อ จำกัด จะเพิ่มข้อยกเว้นเมื่อมีการละเมิดข้อ จำกัด ที่ใช้
ไวยากรณ์
ไวยากรณ์พื้นฐานของการสร้างไฟล์ trigger มีดังนี้ -
CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
ON table_name
[
-- Trigger logic goes here....
];
ที่นี่ event_nameอาจเป็นการดำเนินการINSERT, DELETE, UPDATEและTRUNCATEในตารางที่กล่าวถึงtable_name. คุณสามารถเลือกระบุสำหรับแต่ละแถวหลังชื่อตารางได้
ต่อไปนี้เป็นไวยากรณ์ของการสร้างทริกเกอร์ในการดำเนินการ UPDATE ในคอลัมน์ที่ระบุอย่างน้อยหนึ่งคอลัมน์ของตารางดังนี้ -
CREATE TRIGGER trigger_name [BEFORE|AFTER] UPDATE OF column_name
ON table_name
[
-- Trigger logic goes here....
];
ตัวอย่าง
ให้เราพิจารณากรณีที่เราต้องการให้มีการทดลองตรวจสอบสำหรับทุกระเบียนที่แทรกในตาราง COMPANY ซึ่งเราจะสร้างขึ้นใหม่ดังต่อไปนี้ (วางตาราง COMPANY หากคุณมีอยู่แล้ว)
testdb=# CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);
เพื่อทำการทดลองตรวจสอบต่อไปเราจะสร้างตารางใหม่ชื่อ AUDIT ซึ่งจะแทรกข้อความบันทึกเมื่อใดก็ตามที่มีรายการในตาราง COMPANY สำหรับบันทึกใหม่ -
testdb=# CREATE TABLE AUDIT(
EMP_ID INT NOT NULL,
ENTRY_DATE TEXT NOT NULL
);
ในที่นี้ ID คือ ID เร็กคอร์ด AUDIT และ EMP_ID คือ ID ซึ่งจะมาจากตาราง COMPANY และ DATE จะเก็บการประทับเวลาเมื่อสร้างเรกคอร์ดในตาราง COMPANY ตอนนี้ให้เราสร้างทริกเกอร์ในตาราง COMPANY ดังนี้ -
testdb=# CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();
โดย auditlogfunc () คือ PostgreSQL procedure และมีคำจำกัดความดังต่อไปนี้ -
CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$
BEGIN
INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);
RETURN NEW;
END;
$example_table$ LANGUAGE plpgsql;
ตอนนี้เราจะเริ่มงานจริง ให้เราเริ่มแทรกบันทึกในตาราง COMPANY ซึ่งจะส่งผลให้สร้างบันทึกบันทึกการตรวจสอบในตาราง AUDIT ดังนั้นให้เราสร้างหนึ่งระเบียนในตาราง COMPANY ดังนี้ -
testdb=# 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
ในเวลาเดียวกันจะมีการสร้างระเบียนหนึ่งรายการในตาราง AUDIT บันทึกนี้เป็นผลมาจากทริกเกอร์ซึ่งเราได้สร้างขึ้นในการดำเนินการ INSERT บนตาราง COMPANY ในทำนองเดียวกันคุณสามารถสร้างทริกเกอร์ของคุณในการอัปเดตและลบการดำเนินการตามความต้องการของคุณ
emp_id | entry_date
--------+-------------------------------
1 | 2013-05-05 15:49:59.968+05:30
(1 row)
รายชื่อทริกเกอร์
คุณสามารถแสดงรายการทริกเกอร์ทั้งหมดในฐานข้อมูลปัจจุบันได้จาก pg_trigger ตารางดังนี้ -
testdb=# SELECT * FROM pg_trigger;
คำสั่ง PostgreSQL ข้างต้นจะแสดงรายการทริกเกอร์ทั้งหมด
หากคุณต้องการแสดงรายการทริกเกอร์บนตารางใดตารางหนึ่งให้ใช้ AND อนุประโยคกับชื่อตารางดังนี้ -
testdb=# SELECT tgname FROM pg_trigger, pg_class WHERE tgrelid=pg_class.oid AND relname='company';
คำสั่ง PostgreSQL ข้างต้นจะแสดงรายการเพียงรายการเดียวดังนี้ -
tgname
-----------------
example_trigger
(1 row)
การทิ้งทริกเกอร์
ต่อไปนี้คือคำสั่ง DROP ซึ่งสามารถใช้เพื่อวางทริกเกอร์ที่มีอยู่ -
testdb=# DROP TRIGGER trigger_name;