ผู้เขียนได้ทดลองสร้าง Trigger แบบง่ายๆให้เห็นถึงลักษณะการทำงาน
และการประยุคใช้ไปแล้ว คราวนี้ผู้เขียนจะทำตัวอย่างง่ายๆในการประยุคใช้กับ
View
ประโยชน์ของการประยุคใช้ Trigger กับ View
โดยปกติแล้ว View จะไม่สามารถเพิ่มข้อมูลได้ เพราะ View นั้นเกิดมาจากการทำ Relation ระหว่าง Table ขึ้นมา เพื่อนำไปใช้งานแบบ Read Only อย่างเดียว จึงเป็นหน้าที่ของโปรแกรมเมอร์ที่จะต้องเขียนคำสั่ง Insert เข้ามาจากโปรแกรมเอง แต่หากไม่เขียนคำสั่งในโปรแกรมก็สามารถเขียน Trigger ใส่ใน View ได้เลย และใช้ได้เหมือนกัน แบบของ Trigger ที่ใช้ก็คือ INSTEAD OF INSERT หรือเมื่อมีการใส่ข้อมูล
ผู้เขียนได้ใช้ Table CARSALE จากตอนที่แล้ว และสร้าง Table 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)
จากนั้นสร้าง 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
จะเห็นได้ว่าการใช้ 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)
ประโยชน์ของการประยุคใช้ Trigger กับ View
โดยปกติแล้ว View จะไม่สามารถเพิ่มข้อมูลได้ เพราะ View นั้นเกิดมาจากการทำ Relation ระหว่าง Table ขึ้นมา เพื่อนำไปใช้งานแบบ Read Only อย่างเดียว จึงเป็นหน้าที่ของโปรแกรมเมอร์ที่จะต้องเขียนคำสั่ง Insert เข้ามาจากโปรแกรมเอง แต่หากไม่เขียนคำสั่งในโปรแกรมก็สามารถเขียน Trigger ใส่ใน View ได้เลย และใช้ได้เหมือนกัน แบบของ Trigger ที่ใช้ก็คือ INSTEAD OF INSERT หรือเมื่อมีการใส่ข้อมูล
ผู้เขียนได้ใช้ Table CARSALE จากตอนที่แล้ว และสร้าง Table CARBRAND เพิ่มขึ้นมา
CARBRAND |
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 |
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 |
การทำงานในฝั่ง 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)