Most popular

วันศุกร์ที่ 8 กรกฎาคม พ.ศ. 2554

การสร้าง และประยุคใช้ Trigger (SQL Server) ตอนที่ 1

Trigger คืออะไร?
ท่านที่เคยเขียนโปรแกรม และเคยใช้ 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


การแก้ไข Trigger นั้นก็เพียงแค่เปลี่ยนคำสั่ง CREATE เป็น ALTER เท่านั้นเองครับ

มือใหม่มักจะงง เมื่อ Execute คำสั่ง CREATE TRIGGER ไปแล้วแต่ยังเขียนไม่เสร็จ เมื่อ Execute อีกครั้งจะพบปัญหาว่า มี Trigger อยู่แล้ว ก็เพราะเมื่อใช้คำสั่ง CREATE TRIGGER ไปแล้ว TRIGGER ก็จะถูกสร้างทันที หากจะแก้ไขชุดคำสั่งที่ TRIGGER ก็ให้เปลี่ยน CREATE เป็น ALTER แทน
ตัวอย่างการสร้าง Trigger เพื่อใช้งาน
ผู้เขียนได้สร้าง Table ขึ้นมาเพื่อให้บ่งบอกว่ารถรุ่นไหน มีจำหน่ายอยู่ที่ตัวแทนเขตไหน พร้อมกับการใส่ ID ให้แต่ละรายการ

โครงสร้าง Table CARSALE
สร้าง Trigger ชื่อ AUTOID เพื่อทำการกำหนด ID ของรายการอัตโนมัติ

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 เพิ่มขึ้นเรื่อยๆ
ต่อไปเป็นการสร้าง Trigger SWITCH_SHOWROOM ขึ้นมาเพื่อกำหนดสาขาที่มีรถแต่ละรุ่นขายอยู่ ตัวอย่างคำสั่งของ Trigger ดังนี้


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 ข้อมูลออกไปใช้ รวมถึงการตรวจสอบข้อมูลต่างๆ ซึ่งผู้เขียนจะได้นำเสนอในตอนต่อไป



  รับวางระบบงาน ระบบ Network และพัฒนาระบบ Data warehouse และ ERP ด้วยทีมงานที่มีประสบการณ์ ติดต่อได้ที่ e-mail : arrays2003@hotmail.com

5 ความคิดเห็น:

  1. ไม่ระบุชื่อ24 สิงหาคม 2554 เวลา 14:50

    เขียน trigger ตัวเดียวให้ทำงานกะหลาย table ได้หรือป่าวคับ
    ผมลองทำแล้วข้อมูลมันเบิ้ลกันมากเลยคับอย่างผมมี table1,table2,table3
    ที่นี้ผม insert ข้อมูลลงใน table1 และสั่งให้ trigger copy ข้อมูลจาก table1 ใส่ใน table2 และ table3 ข้อมูลใน table2 จะเปน 2 เท่าของ table1 และข้อมูลใน table3 จะเปน 2 เท่าของ table2 คับ

    ตอบลบ
  2. อันนี้เป็นเบื้องต้นครับ คุณจำเป็นต้องใส่ where ข้อมูลใหม่เข้าไปด้วยครับ
    เอาไว้ว่างๆ ผมจะทำตัวอย่างมาลงละกันครับ

    ตอบลบ
  3. คำสั่งนี้ จะเรียกด้วย php code ได้หรือไม่คะ พอดีเปลี่ยนจากapp มาเป็น web app อ่าคะ

    ตอบลบ
  4. ไม่ระบุชื่อ3 มีนาคม 2565 เวลา 14:07

    ทำไมเราต้องสร้าง View Trigger ขึ้นมาใช้งานค่ะ

    ตอบลบ
  5. ไม่ระบุชื่อ3 มีนาคม 2565 เวลา 14:07

    ทำไมเราต้องสร้าง View Trigger ขึ้นมาใช้งาน

    ตอบลบ