SQL Server Trigger : สอน คำสั่ง ของ Trigger, เรียน คำสั่ง ของ Trigger
 

Reference

Reference ในเว็บไซต์ Function.in.th เป็นการนำเสนอความรู้ในรูปแบบของแหล่งอ้างอิงของคำสั่งต่าง ๆ ที่ใช้ในการเขียนโปรแกรม โดยผู้ที่สนใจสามารถเข้ามาเรียนรู้การใช้งานคำสั่งของการเขียนโปรแกรมเหล่านี้ได้ ผ่านทาง URL code.function.in.th ทั้งนี้ผู้อ่านยังสามารถร่วมแสดงความคิดเห็นบนเนื้อหาที่มีสอนได้ ซึ่งถือเป็นการส่งเสริมให้มีการแลกเปลี่ยนประสบการณ์และความรู้ระหว่างผู้อ่านด้วยกันเอง
  • การสร้างและใช้งาน Trigger การสร้างและใช้งาน Trigger
    ข้อจำกัดของ Trigger ข้อจำกัดของ Trigger
    Inserted Table และ Deleted Table Inserted Table และ Deleted Table
    ประเภทของ Trigger ประเภทของ Trigger
    FOR TRIGGERS หรือ AFTER TRIGGERS FOR TRIGGERS หรือ AFTER TRIGGERS
    INSTEAD OF TRIGGER INSTEAD OF TRIGGER
    { CREATE | ALTER } TRIGGERS คำสั่งของการสร้างและแก้ไข Trigger
    DROP TRIGGERS การลบ Triggers
  • subject :
    การสร้างและใช้งาน Trigger

    content :
    การสร้างและใช้งาน Trigger
    > จะเกิดการทำงานก็ต่อเมื่อมีเหตุการณ์ที่เกี่ยวข้องกับการเปลี่ยนแปลงแก้ไขข้อมูลเกิดขึ้น
        ตรงกันกับที่ object นี้ได้ถูกกำหนดไว้
    > จะมีการทำงานในทุกๆครั้ง ที่มีการเปลี่ยนแปลงของข้อมูลภายในตารางที่กำหนด
        ทั้งที่เป็นผลมาจากการทำ INSERT หรือ UPDATE หรือ DELETE

  • subject :
    ข้อจำกัดของ Trigger

    content :
    ข้อจำกัดของ Trigger
    > ไม่สามารถใช้ได้กับ Temporary Table
    > ไม่สามารถส่งคืนข้อมูลกลับมาเป็น Recordset ได้
    > คำสั่ง WRITETEXT ไม่สามารถ ปลุกให้ Trigger ทำงานได้
    > คำสั่ง ต่อไปนี้ทำงานบน Trigger ไม่ได้ ได้แก่ ALTER DATABASE, CREATE DATABASE, DISK INIT,
        DISK RESIZE, DROP DATABASE, LOAD DATABASE, LOAD LOG, RECONFIGURE, RESTORE DATABASE,
        RESTORE LOG

  • subject :
    Inserted Table และ Deleted Table

    content :
    รู้จักและเข้าใจตาราง Inserted และ Deleted
    โดยตารางนี้จะใช้งานได้เพียงภายในระยะการทำงานของ Trigger หนึ่งๆเท่านั้น
    โดยตารางที่กล่าวถึงนี้จะเป็นตารางเปล่าๆที่ไม่มีข้อมูลใดๆ
    แต่จะมีโครงสร้างทั้งชื่อและจำนวนคอลัมน์ ตลอดจนประเภทข้อมูลเหมือนกับตาราง
    ที่ Trigger นั้นอาศัยอยู่ทุกประการ
    
    คำสั่ง INSERT กับ Trigger
    เมื่อมีการเพิ่มแถวข้อมูลให้กับตารางข้อมูลที่ Trigger อาศัยอยู่
    ระบบจะเพิ่มแถวข้อมูลเดียวกันนี้ไปยังตาราง Inserted ด้วย
    
    คำสั่ง DELETE กับ Trigger
    เมื่อมีการลบแถวข้อมูลออกจากตารางข้อมูลที่ Trigger อาศัยอยู่
    ระบบจะเพิ่มแถวข้อมูลที่ถูกลบออกนี้ไปยังตาราง Deleted ด้วย
    
    คำสั่ง UPDATE กับ Trigger
    เมื่อมีการแก้ไขข้อมูลในตารางข้อมูลที่ Trigger อาศัยอยู่
    ระบบจะทำงาน 2 ขั้นตอน คือ
    จะนำแถวข้อมูลก่อนการ update ไปเพิ่มไว้ในตาราง Deleted
    และจะนำแถวข้อมูลที่ได้หลังการ update ไปเพิ่มไว้ในตาราง Inserted

  • subject :
    ประเภทของ Trigger

    content :
    Trigger มี 2 ประเภท ได้แก่
    1) FOR TRIGGERS หรือ AFTER TRIGGERS
    2) INSTEAD OF TRIGGER

  • subject :
    FOR TRIGGERS หรือ AFTER TRIGGERS

    content :
    เป็น Trigger ซึ่งจะทำงานภายหลังจากที่มีคำสั่ง SQL ที่เกี่ยวข้อง
    กับการเปลี่ยนแปลงข้อมูล ( INSERT, DELETE, UPDATE )
    โดยมีขั้นตอนการทำงาน ดังนี้
    1) ทำคำสั่ง SQL ตามปกติ
    2) ที่ Table ใดๆ จะมีการตรวจสอบความถูกต้องของข้อมูลด้วย Constraint ต่างๆ
    3) ระบบทำการสร้างตาราง Inserted และ Deleted
    4) เริ่มทำงาน FOR TRIGGERS หรือ AFTER TRIGGERS
    โดยมีข้อจำกัดทางด้านการใช้งาน ดังนี้
    1) ใช้ได้กับ Table เท่านั้น
    2) สามารถสร้าง Trigger ได้หลายตัว เพื่อทำงานสำหรับคำสั่ง INSERT, DELETE, UPDATE
    3) สามารถทำงานร่วมกับ Table ที่ถูกควบคุมความถูกต้องด้วย CASCADING REFERENCES
    4) ในกรณีที่มีหลาย Trigger สามารถกำหนดลำดับแรกสุด และท้ายสุด ที่จะให้ Trigger ทำงานได้
    5) ไม่อนุญาติให้ใช้กับคอลัมน์ประเภท text, ntext, image ที่อยู่ในตาราง Inserted และ Deleted

  • subject :
    INSTEAD OF TRIGGER

    content :
    เป็น Trigger ซึ่งจะทำงานก่อนที่จะทำคำสั่ง SQL ที่เกียวข้อง
    กับการเปลี่ยนแปลงข้อมูล ( INSERT, DELETE, UPDATE )
    โดยสามารถใช้ได้กับ VIEW ด้วย ยกเว้น VIEW ที่มีคำสั่ง WITH CHECK
    โดยมีขั้นตอนการทำงาน ดังนี้
    1) ทำคำสั่ง SQL ตามปกติ
    2) ระบบทำการสร้างตาราง Inserted และ Deleted
    3) เริ่มทำงาน INSTEAD OF TRIGGER
    4) ที่ Table มีการตรวจสอบความถูกต้องของข้อมูลด้วย Constraint ต่างๆ
    โดยมีข้อจำกัดทางด้านการใช้งาน ดังนี้
    1) ใช้ได้กับ Table และ View
    2) สามารถสร้างได้เพียง Trigger ตัวเดียว เพื่อทำงานสำหรับคำสั่ง INSERT, DELETE, UPDATE
    3) ไม่สามารถทำงานร่วมกับ Table ที่ถูกควบคุมความถูกต้องด้วย CASCADING REFERENTIAL INTEGRITY
    4) ไม่จำเป็นต้องกำหนดลำดับของ Trigger เพราะมีได้เพียงตัวเดียวเท่านั้น
    5) อนุญาติให้ใช้ได้กับคอลัมน์ประเภท text, ntext, image ที่อยู่ภายในตาราง Inserted และ Deleted

  • subject :
    { CREATE | ALTER } TRIGGERS

    syntax :
    { CREATE | ALTER } TRIGGERS triggers_name
    ON { table_name | view_name }
    [ WITH ENCRYPTION ]
    { FOR | AFTER | INSTEAD OF }
    	{ [ DELETE ] [,] [ INSERT ] [,] [ UPDATE ] }
    [ WITH APPEND ]
    [ NOT FOR REPLICATION ]
    AS
    	<sql_statement>
    	// [ IF UPDATE(column_name) ] ใช้ตรวจสอบว่ามีการเปลี่ยนแปลงที่ คอลัมน์ ที่กำหนด หรือไม่

    content :
    คำสั่ง ROLLBACK TRANSACTION สามารถใช้ใน Trigger ได้
    เพราะว่า การทำงานของ Trigger จะมีการใช้คำสั่ง Begin Transaction ก่อนการทำงาน
    และคำสั่ง Commit Transaction หลังการทำงานภายในตัว Trigger เองอยู่แล้ว

    example :
    -- ex 1
    CREATE TABLE tbl_orders
    (
    	id int IDENTITY NOT NULL,
    	price money NOT NULL
    )
    GO
    CREATE TRIGGERS trg_orders
    ON orders
    FOR INSERT, UPDATE
    AS
    	PRINT "Occurs Modify Data In Orders Table."
    GO
    
    -- ex 2
    CREATE TRIGGERS trg_InsUpdPerson
    ON Person
    FOR INSERT, UPDATE
    AS
    BEGIN
    	DECLARE @age int
    	SELECT @age = a.age
    	FROM inserted AS a
    
    	IF @age < 0
    		BEGIN
    			ROLLBACK TRANSACTION
    		END
    END
    
    -- ex 3
    CREATE TRIGGERS trg_UpdPerson
    > 100 ) > 0
    		BEGIN
    			ROLLBACK TRANSACTION
    		END
    END
    
    -- ex 5
    CREATE TRIGGERS trg_DelPerson
    ON Person
    FOR DELETE
    AS
    BEGIN
    	DELETE User
    	FROM deleted AS a
    	WHERE User.person_id = a.id
    	// เป็นการ CASCADING DELETE
    END
    
    -- ex 6
    CREATE VIEW vw_detailUser
    AS
    BEGIN
    	SELECT
    		a.id
    		, a.name
    		, b.firstname 
    		, b.lastname
    		, b.sex
    	FROM
    		user a 
    		LEFT OUTER JOIN person b ON a.person_id = b.id
    END
    GO
    
    CREATE TRIGGERS trg_InsViewDetailUser
    ON vw_detailUser
    INSTEAD OF INSERT
    AS
    BEGIN
    	IF ( SELECT COUNT(*) FROM inserted ) > 0
    	BEGIN
    		INSERT INTO person ( firstname, lastname, sex )
    		SELECT a.firstname, a.lastname, a.sex
    		FROM inserted a
    
    		INSERT INTO user ( name )
    		SELECT a.name
    		FROM inserted a
    	END
    END

  • subject :
    DROP TRIGGERS

    syntax :
    DROP TRIGGERS triggers_name

    content :
    ใช้ในการลบ Triggers

    example :
    CREATE TABLE tbl_orders
    (
    	id int IDENTITY NOT NULL,
    	price money NOT NULL
    )
    GO
    CREATE TRIGGERS trg_orders
    ON orders
    FOR INSERT, UPDATE
    AS
    	PRINT "Occurs Modify Data In Orders Table."
    GO
    DROP TRIGGERS trg_orders
    GO

 
Share This Chapter Login with Facebook