4/17/2557

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

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

แสดงความคิดเห็น