ท่านที่เคยเขียนโปรแกรม และเคยใช้ Event handle ก็จะนึกถึงการทำงานของ Trigger ไม่ยาก
Trigger ก็คือ Code คำสั่ง SQL ที่ถูกสร้างขึ้นให้ทำงานกับ Table หรือ View โดยที่คำสั่งเหล่านั้นจะทำงานก็ต่อเมื่อมีการเปลี่ยนแปลงอย่างใดอย่างหนึ่งกับ Table หรือ View (เปรียบเหมือน Event นั่นเอง) เช่น
- เมื่อมีการเพิ่มข้อมูล (Insert)
- เมื่อมีการปรับปรุงข้อมูล (Update)
- เมื่อมีการลบ (Delete)
หรือจะทำงานหลังจากมีการเปลี่ยนแปลงก็ได้ เช่น
- หลังจากเพิ่มข้อมูลแล้ว (Inserted)
- หลังจากปรับปรุงข้อมูล (Updated)
- หลังจากลบข้อมูลแล้ว (Deleted)
คำสั่งในการสร้าง Trigger
รูปแบบคำสั่งในการสร้าง Trigger ไม่มีความซับซ้อนแต่อย่างใด คล้ายๆกับการสร้าง View มีรูปแบบดังนี้
-- คำสั่งสร้าง Trigger เพื่อให้ทำงานหลังจาก..
CREATE TRIGGER [ชื่อของ Trigger]
ON [ชื่อ Table ที่ Trigger ทำงาน]
AFTER [ทำงานหลังจากเพิ่มข้อมูล หรือ ปรับปรุงข้อมูล หรือ ลบข้อมูล]
AS
BEGIN
-- คำสั่งเมื่อ Trigger เริ่มทำงาน
END
-- คำสั่งสร้าง Trigger เพื่อให้ทำงานไปพร้อมๆกับ...
CREATE TRIGGER [ชื่อของ Trigger]
ON [ชื่อ Table ที่ Trigger ทำงาน]
INSTEAD OF [ทำงานเมื่อมีการเพิ่มข้อมูล หรือ ปรับปรุงข้อมูล หรือ ลบข้อมูล]
AS
BEGIN
-- คำสั่งเมื่อ Trigger เริ่มทำงาน
END
ผู้เขียนได้สร้าง Table ขึ้นมาเพื่อให้บ่งบอกว่ารถรุ่นไหน มีจำหน่ายอยู่ที่ตัวแทนเขตไหน พร้อมกับการใส่ ID ให้แต่ละรายการ
โครงสร้าง Table CARSALE |
CREATE TRIGGER AUTOID
ON CARSALE
AFTER INSERT
AS
BEGIN
-- ประกาศให้ @O_ID รับตัวเลขจำนวนเต็ม
DECLARE @O_ID INT;
-- นำ @O_ID ไปรับค่า ID ล่าสุด
SELECT @O_ID=(SELECT TOP 1 ID FROM CARSALE ORDER BY ID DESC)
-- ถ้า @O_ID เป็นค่าว่าง ให้เท่ากับ 0 แทน
IF(@O_ID IS NULL) SET @O_ID=0
-- นำ @O_ID มาบวกเพิ่มอีก 1 แล้วค่อยปรับปรุงไปที่ Table
UPDATE CARSALE SET ID=@O_ID+1 FROM INSERTED
WHERE INSERTED.MODEL=CARSALE.MODEL
END
เมื่อทำการ Execute Trigger แล้วทดสอบเพิ่มข้อมูลใน Table จะพบว่ามีการใส่ ID ให้อัตโนมัติ
ID เพิ่มขึ้นเรื่อยๆ |
CREATE TRIGGER SWITCH_SHOWROOM
ON CARSALE
AFTER INSERT,UPDATE
AS
BEGIN
--ประกาศให้ @MODEL รับค่าของ Column MODEL ที่ใส่ข้อมูลรุ่นของรถเข้ามา
DECLARE @MODEL VARCHAR(30)
--ประกาศให้ @SHOWROOM รับชื่อสาขา
DECLARE @SHOWROOM VARCHAR(50)
--รับค่ารุ่นของรถที่ใส่เข้ามา
SELECT @MODEL=(SELECT MODEL FROM INSERTED )
--ตรวจสอบรุ่นของรถ และกำหนดสาขาที่มีขาย
IF(UPPER(@MODEL)='PRIUS') SET @SHOWROOM='สาขารังสิต' ELSE
IF(UPPER(@MODEL)='VIOS') SET @SHOWROOM='สาขาพระรามสอง' ELSE
IF(UPPER(@MODEL)='YARIS') SET @SHOWROOM='สาขาแจ้งวัฒนะ' ELSE
IF(UPPER(@MODEL)='CAMRY') SET @SHOWROOM='สาขาศรีนครินทร์' ELSE
IF(UPPER(@MODEL)='FORTUNER') SET @SHOWROOM='สาขานวนคร' ELSE
--นอกจากรถ 5 รุ่นนี้แล้วให้ระบุว่าไม่มีสาขาขายรุ่นนี้
SET @SHOWROOM='ไม่มีสาขาที่ขายรุ่นนี้'
--ใส่สาขาให้ข้อมูลที่เพิ่มเข้ามา
UPDATE CARSALE SET SHOWROOM=@SHOWROOM FROM INSERTED
WHERE INSERTED.MODEL=CARSALE.MODEL
END
เมื่อทดสอบจะพบว่าเมื่อระบุถึงรุ่นของรถเข้ามาแล้ว Trigger 2 ตัวที่สร้างขึ้นจะทำงานตามคำสั่งที่เขียนไว้
การใช้ Trigger มีประโยชน์อย่างมากในการช่วยพัฒนาโปรแกรม ช่วยแบ่งเบา Process ของโปรแกรมไปได้อย่างมาก เพราะ Trigger จะทำงานบน Database Server
และนอกจากนี้ยังใช้แก้ปัญหาในการ Customize โปรแกรมสำเร็จรูปที่ไม่สามารถแก้ไขในตัวโปรแกรมได้อีกด้วย ทั้งการ Clone ข้อมูลออกไปใช้ รวมถึงการตรวจสอบข้อมูลต่างๆ ซึ่งผู้เขียนจะได้นำเสนอในตอนต่อไป
เขียน trigger ตัวเดียวให้ทำงานกะหลาย table ได้หรือป่าวคับ
ตอบลบผมลองทำแล้วข้อมูลมันเบิ้ลกันมากเลยคับอย่างผมมี table1,table2,table3
ที่นี้ผม insert ข้อมูลลงใน table1 และสั่งให้ trigger copy ข้อมูลจาก table1 ใส่ใน table2 และ table3 ข้อมูลใน table2 จะเปน 2 เท่าของ table1 และข้อมูลใน table3 จะเปน 2 เท่าของ table2 คับ
อันนี้เป็นเบื้องต้นครับ คุณจำเป็นต้องใส่ where ข้อมูลใหม่เข้าไปด้วยครับ
ตอบลบเอาไว้ว่างๆ ผมจะทำตัวอย่างมาลงละกันครับ
คำสั่งนี้ จะเรียกด้วย php code ได้หรือไม่คะ พอดีเปลี่ยนจากapp มาเป็น web app อ่าคะ
ตอบลบทำไมเราต้องสร้าง View Trigger ขึ้นมาใช้งานค่ะ
ตอบลบทำไมเราต้องสร้าง View Trigger ขึ้นมาใช้งาน
ตอบลบ