ตอนที่ 15 : การสร้าง Trigger บน SQL Server Database (SQL Server : Trigger) |
ตอนที่ 15 : การสร้าง Trigger บน SQL Server Database (SQL Server : Trigger) สำหรับ Trigger บน SQL Server เป็นฟีเจอร์ที่น่าสนใจมากและถ้านำมันไปใช้งานจะช่วยให้การเขียนโปรแกรมกับ SQL Server Database จะทำให้โปรแกรมนั้น ๆ มีประสิทธิภาพมากขึ้นมากเลยทีเดียว โดย Trigger นี้ เป็น Events (เหตุการณ์) ที่เกิดขึ้นกับ TABLE เช่นมีการใช้คำสั่ง INSERT, UPDATE, หรือ DELETE กับ TABLE ที่เราได้สร้าง Trigger ไว้ ก็จะทำให้ Trigger นั้นทำงานอัตโนมัติตามคำสั่ง SQL ที่เราได้เขียนไว้นั่นเอง โดย Trigger นี้สามารถเพิ่มเงื่อนไขเช่น { BEFORE | AFTER } จะให้ทำงานก่อนการเกิด Event หรือ หลังจากที่เกิด Event นั้นแล้ว รองรับ Action ทั้งหมด 3 รูปแบบคือ { INSERT | UPDATE | DELETE }
โครงสร้างของตาราง CUSTOMER, COUNTRY และ AUDIT
Table : CUSTOMER

Table : COUNTRY

Table : AUDIT

Create Trigger Syntax
CREATE TRIGGER <Schema_Name, sysname, Schema_Name>.<Trigger_Name, sysname, Trigger_Name>
ON <Schema_Name, sysname, Schema_Name>.<Table_Name, sysname, Table_Name>
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
-- DELETED
-- INSERTED
END
อธิบาย
INSERTED ในกรณีที่ Trigger นี้เกิดหลังจากที่ INSERT และ DELETE เราสามารถเรียก Column นั้นด้วยใช้ INSERTED.col_name
DELETED ในกรณีที่ Trigger นี้เกิดหลังจากที่ DELETE เราสามารถเรียก Column นั้นด้วยใช้ DELETED.col_name
Example 1 : ตัวอย่างการสร้าง Trigger ให้ DELETE ข้อมูลใน Table ที่เกี่ยวข้อง

จากรูปจะเห็นว่าตาราง CUSTOMER กับ AUDIT จะมีข้อมูลที่เชื่อมโยงกันด้วย CUSTOMER_ID ซึ่งเราจะสร้าง Trigger เมื่อลบข้อมูลจาก CUSTOMER ให้มันไปลบข้อมูลใน AUDIT ด้วย

คลิกขวาที่ Trigger ของตาราง CUSTOMER เลือก New Trigger
CREATE TRIGGER DelCustomer
ON [CUSTOMER]
AFTER DELETE
AS
BEGIN
SET NOCOUNT ON;
-- Declare Variable
DECLARE @sCustomerID VARCHAR(4);
-- Get CUSTOMER_ID from delete rows
SET @sCustomerID = (SELECT CUSTOMER_ID FROM DELETED)
-- Delete related table
DELETE FROM [AUDIT]
WHERE CUSTOMER_ID = @sCustomerID;
END
จากคำสั่งนี้จะเห็นว่าเมื่อมีการ DELETE ที่ CUSTOMER จะสั่งให้ DELETE ที่ audit ด้วยการ CUSTOMER_ID = DELETED.CUSTOMER_ID

รายการ Trigger ที่ถูกสร้างภายใต้ตาราง CUSTOMER

ทดสอบลบหรือ DELETE ข้อมูลในตาราง customer

หลังจากที่ลบข้อมูลใน CUSTOMER จะเห็นว่าใน AUDUT ถูกลบออกไปด้วย

การ Enabled และ Disabled ตัว Trigger
Example 2 : ตัวอย่างการสร้าง Trigger ให้ INSERT/UPDATE/DELETE ข้อมูล และอัพเดดข้อมูลที่เกี่ยวข้อง

จากรูปจะเห็นว่าตาราง CUSTOMER กับ AUDIT จะมีข้อมูลที่เชื่อมโยงกันด้วย CUSTOMER_ID ใน Column ของ USED ใน CUSTOMER จะเป็นค่า SUM มาจาก AUDIT โดยในตัวอย่างนี้เราจะทำ Trigger เมื่อ (INSERT/UPDATE/DELETE) ใน AUDIT ให้ทำการ SUM แล้วอัพเดดค่า USED ใน CUSTOMER ด้วย

สร้าง Trigger ภายใต้ AUDIT
CREATE TRIGGER [dbo].[SumUsed]
ON [dbo].[AUDIT]
AFTER INSERT,UPDATE,DELETE
AS
BEGIN
SET NOCOUNT ON;
-- Declare Variable
DECLARE @sCustomerID VARCHAR(4);
DECLARE @dUsed DECIMAL(18,2);
-- Get CUSTOMER_ID from Insert or Update rows
SET @sCustomerID = (SELECT CUSTOMER_ID FROM INSERTED)
-- Get CUSTOMER_ID from delete (When @sCustomerID IS NULL)
IF @sCustomerID IS NULL
BEGIN
SET @sCustomerID = (SELECT CUSTOMER_ID FROM DELETED)
END
-- Get SUM from insert/update AUDIT
SET @dUsed = (SELECT SUM(USED) FROM [AUDIT] WHERE CUSTOMER_ID = @sCustomerID)
-- Update USED in CUSTOMER
UPDATE CUSTOMER SET USED = @dUsed
WHERE CUSTOMER_ID = @sCustomerID;
END
จากคำสั่งนี้จะเห็นว่าเมื่อมีการ INSERT,UPDATE,DELETEที่ AUDIT จะสั่งให้ SUM ค่าแล้วไป UPDATE ที่ CUSTOMER
เพิ่มเติม จาก Code จะเห็นว่า INSERT,UPDATE อยู่ในเคสเดียวกันดึงจากตัวแปร INSERTED แต่ DELETE จะดึงมาจากตัวแปร DELETED

Trigger ที่ถูกสร้างภายใต้ AUDIT

ทดสอบ INSERT ขอมูล

จะเห็นว่าที่ CUSTOMER จะมีการ UPDATE คอลัมบ์ของ USED ให้อัตโนมัติ

ทดสอบ UPDATE ข้อมูล

จะเห็นว่าที่ CUSTOMER จะมีการ UPDATE คอลัมบ์ของ USED ให้อัตโนมัติ

ทดสอบ DELETE ข้อมูล

จะเห็นว่าที่ CUSTOMER จะมีการ UPDATE คอลัมบ์ของ USED ให้อัตโนมัติ
|