ผู้เขียนได้ทดลองสร้าง Trigger แบบง่ายๆให้เห็นถึงลักษณะการทำงาน และการประยุคใช้ไปแล้ว คราวนี้ผู้เขียนจะทำตัวอย่างง่ายๆในการประยุคใช้กับ View
ประโยชน์ของการประยุคใช้ 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)
ขอบคุณครับจะติดตามต่อไปนะครับ
ตอบลบผมพึ่งใช้ sql ได้ไม่นาน คับ ตกใจที่เห็นว่า ทำแบบนี้ได้ด้วย มัวแต่ไปเขียนคำสั่งในโปรแกรมซะนาน ขอถามคับ
ตอบลบ- ผมอยากให้โปรแกรม(vb.net) สามารถรู้ได้ว่า มีการ update ที่ data base จากนั้น ให้โปรแกรม(vb.net)ส่ง notify มาเตือนคับ จะใช้วิธีไหนดีคับ รู้มาว่าให้เขียน timer ไป check data base เอาเอง พอจะมีวิธีอื่นมั้ยคับ
คงไม่มีวิธีอื่นครับ Database คงส่งข้อมูลไปที่ App ไม่ได้
ตอบลบต้องให้ App เข้ามาเช็คเองครับ ว่ามีความเปลี่ยนแปลงเกิดขึ้นหรือไม่