| การสร้างและใช้งาน 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