08 November 2013

ตัวอย่างการใช้งาน Triggers บน SQL Server

    มาตามสัญญาาาาาาาาา บทความที่แล้วผมก็ได้พูดถึง Triggers ไปแล้วนะครับว่ามันคืออะไร แนวคิดเป็นยังไง แต่มาบทความนี้เราจะมาลองใช้งาน Triggers กัน ผมจะทดลองเขียนบน SQL Server ซื่งจะให้ภาษา T/SQL เช่นเดียวกับ Stored Procedures ถ้าพร้อมแล้ว เปิด SQL Server Management ขึ้นมาเลยครับ

    ขั้นตอนแรก ผมจะสร้างเทเบิลมาก่อน 2 เทเบิล โดย Table_A คือตัวที่จะทำการเขียน Triggers ฝังไว้ ส่วน Table_B คือเทเบิลผลลัพธ์ โดยภายในจะมีฟิลด์สองฟิลด์เหมือนกันทั้งสองเทเบิลคือ id Type:int (auto run indentity) และ txt Type:nvarchar(50) แต่ความจริงแล้วการทำ Triggers ไม่ได้จำกัดนะครับว่าเทเบิลจะต้องเหมือนกัน
*** หมายเหตุ *** Type ของฟิลด์ txt เป็น nvarchar(50) ไม่ใช่ text ตามรูปนะครับ


    ขั้นที่ 2 ทำการสร้าง Triggers โดยไปที่เทเบิลที่เราต้องการดักจับเหตุการณ์ ตัวอย่าง : Table_A -> Triggers -> คลิกขวา New Triggers...
    หลังจากกด New Triggers แล้วจะเห็นโค๊ดดังนี้
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

-- เป็นชื่อของ Triggers นะครับ แต่ถ้าเราสร้างขึ้นมาแล้ว จะต้องเปลี่ยนจาก CREATE เป็น ALTER นะครับ
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name> 
-- ส่วนนี้คือส่วนที่บอกว่าจะดักเหตุการณ์ที่เทเบิลไหน
   ON  <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name> 
-- ในส่วนนี้จะเป็นส่วนที่บอกว่าเราต้องการจะดักจับเหตุการณ์ใด
-- สามารถเลือกดักจับพร้อมกันได้ทั้ง 3 เหตุการณ์นะครับ
   AFTER <Data_Modification_Statements, , INSERT,DELETE,UPDATE>
AS 
BEGIN
-- ส่วนนี้จะเป็นส่วนการเขียนโค๊ดการทำงานต่างๆ
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;

    -- Insert statements for trigger here

END
GO

    โค๊ดด้านล่างนี้คือโค๊ดตัวอย่าง การทำงานก็คือเมื่อมีการเพิ่มข้อมูลที่เทเบิล A ก็ในนำข้อมูลนั้นไปใส่เทเบิล B ด้วย
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER SnareInsert -- *** EDIT สร้าง Trigger ชื่อ SnareInsert
   ON dbo.Table_A   -- *** EDIT ดักจับเหตุการณ์ที่เทเบิล A
   AFTER INSERT    -- *** EDIT ดักจับเหตุการณ์ INSERT
AS 
BEGIN
 DECLARE @txtInsert nvarchar(50) -- *** EDIT ประกาศตัวแปรชื่อ txtInsert ประเภท nvarchar(50)
 SET @txtInsert = (SELECT txt FROM inserted) -- *** EDIT เซ็ตค่าให้ txtInsert เท่ากับค่า txt ที่ Insert เข้ามา
 
 -- SET NOCOUNT ON added to prevent extra result sets from
 -- interfering with SELECT statements.
 SET NOCOUNT ON;
 
    -- Insert statements for trigger here
    INSERT INTO Table_B VALUES (@txtInsert) -- *** EDIT ทำการ Insert ข้อมูลไปที่เทเบิล B

END
GO
    ผลลัพธ์ : รูปด้านล่างนี้แสดงถึงผลจากการเพิ่มข้อมูล "FromTableA" เข้าสู่ Table_A หลังจากนั้น ก็เพิ่มข้อมูล "FromTableB" เข้าสู่ Table_B สังเกตได้ว่าข้อมูลที่เข้าสู่เทเบิล A จะถูก insert ไปที่เทเบิล B ด้วย