4/17/2557

การสร้าง และประยุคใช้ Trigger (SQL Server) ตอนที่ 2

ผู้เขียนได้ทดลองสร้าง Trigger แบบง่ายๆให้เห็นถึงลักษณะการทำงาน และการประยุคใช้ไปแล้ว คราวนี้ผู้เขียนจะทำตัวอย่างง่ายๆในการประยุคใช้กับ View

ประโยชน์ของการประยุคใช้ Trigger กับ View
โดยปกติแล้ว View จะไม่สามารถเพิ่มข้อมูลได้ เพราะ View นั้นเกิดมาจากการทำ Relation ระหว่าง Table ขึ้นมา เพื่อนำไปใช้งานแบบ Read Only อย่างเดียว จึงเป็นหน้าที่ของโปรแกรมเมอร์ที่จะต้องเขียนคำสั่ง Insert เข้ามาจากโปรแกรมเอง แต่หากไม่เขียนคำสั่งในโปรแกรมก็สามารถเขียน Trigger ใส่ใน View ได้เลย และใช้ได้เหมือนกัน แบบของ Trigger ที่ใช้ก็คือ INSTEAD OF INSERT หรือเมื่อมีการใส่ข้อมูล

ผู้เขียนได้ใช้ Table CARSALE จากตอนที่แล้ว และสร้าง Table CARBRAND เพิ่มขึ้นมา


CARBRAND 
นำทั้งสอง Table มาสร้างเป็น View ชื่อ VIEW_CARBRAND โดยภายใน View มี Relation ดังนี้


SELECT     dbo.CARBRAND.BRAND, dbo.CARBRAND.MODEL, dbo.CARSALE.SHOWROOM
FROM         dbo.CARBRAND INNER JOIN
                      dbo.CARSALE ON UPPER(dbo.CARBRAND.MODEL) = UPPER(dbo.CARSALE.MODEL)

VIEW_CARBRAND
จากนั้นสร้าง Trigger ให้กับ VIEW_CARBRAND


CREATE TRIGGER insertToVIEW_CARBRAND
   ON  VIEW_CARBRAND
   INSTEAD OF INSERT
AS 
BEGIN
        --เพิ่ม MODEL ให้กับ Table CARSALE
INSERT INTO CARSALE(MODEL)
SELECT UPPER(MODEL) FROM INSERTED

        --เพิ่ม MODEL , BRAND ให้กับ Table CARBRAND
INSERT INTO CARBRAND
SELECT UPPER(MODEL),UPPER(BRAND) FROM INSERTED
END



จากนั้น Execute Trigger แล้ว ทดสอบใส่ค่า BRAND และ MODEL ที่ VIEW_CARBRAND

VIEW_CARBRAND
ข้อมูลของ Table CARBRAND ที่เพิ่มค่าผ่าน VIEW_CARBRAND เป็นผลมาจาก Trigger
ข้อมูลของ Table CARSALE ที่เพิ่มค่าผ่าน VIEW_CARBRAND เป็นผลมาจาก Trigger
จะเห็นได้ว่าการใช้ Trigger ลดภาระของโปรแกรมไปได้มาก และสามารถนำมาใช้แก้ปัญหาบางอย่างได้ดี
การทำงานในฝั่ง Server ก็จะลดเวลา และข้อผิดพลาดในการส่งข้อมูลได้มาก ทำให้โปรแกรมที่พัฒนาขึ้นมีความเสถียรขึ้นด้วย

โครงสร้างของ Table และ View


CREATE TABLE [dbo].[CARSALE](
[ID] [int] NULL,
[MODEL] [varchar](30) NOT NULL,
[SHOWROOM] [varchar](50) NULL
) ON [PRIMARY]



CREATE TABLE [dbo].[CARBRAND](
[MODEL] [varchar](30) NULL,
[BRAND] [varchar](30) NULL
) ON [PRIMARY]



CREATE VIEW [dbo].[VIEW_CARBRAND]
AS
SELECT     dbo.CARBRAND.BRAND, dbo.CARBRAND.MODEL, dbo.CARSALE.SHOWROOM
FROM         dbo.CARBRAND INNER JOIN
                      dbo.CARSALE ON UPPER(dbo.CARBRAND.MODEL) = UPPER(dbo.CARSALE.MODEL)

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

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