ความแตกต่างระหว่างทริกเกอร์ FOR และ AFTER?


120

อะไรคือความแตกต่างระหว่างFORและAFTERทริกเกอร์?


5
+1: ฉันอ่านบทความออนไลน์ของ SQL Server Books เกี่ยวกับ Triggers และจบลงด้วยคำถามเดียวกัน
pfunk

ฉันพบว่าบทความนี้มีประโยชน์: dotnettricks.com/learn/sqlserver/…
Matt

คำตอบ:


154

ไม่มีความแตกต่างพวกเขาทำสิ่งเดียวกัน

CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE

ก็เหมือนกับ

CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE

INSTEAD OFทริกเกอร์ที่แตกต่างกันและไฟก่อนและแทนการแทรกและสามารถนำมาใช้ในมุมมองในการสั่งซื้อที่จะแทรกค่าที่เหมาะสมลงในตารางพื้นฐาน


14
ฉันชอบความคิดเห็นเกี่ยวกับการแทรกในมุมมองโดยใช้ทริกเกอร์ ข้อมูลที่มีประโยชน์มาก ไชโย
Mariusz

ขอโทษคุณ @ เบ็นสถานการณ์ที่จะแทรกเข้าไปในมุมมองคืออะไร? ขอบคุณ ^ - ^
Jeancarlo Fontalvo

@JeancarloFontalvo, 1) เข้ากันได้. ตารางพื้นฐานสามารถเปลี่ยนแปลงได้หากมุมมองยังคงเหมือนเดิม 2) การควบคุมการเข้าถึงผู้ใช้บางรายอาจได้รับอนุญาตให้เขียนลงในคอลัมน์บางคอลัมน์เท่านั้น
เบ็น

17

@ เบ็นเป๊ะเลย

นี่คือบทความ MSDN การสำรวจ SQL Server Triggers

ย่อหน้าจากบทความ:

ไวยากรณ์นั้นเป็นที่ยอมรับใน SQL Server เวอร์ชันเก่า อย่างไรก็ตามตอนนี้มีทริกเกอร์สองประเภทใน SQL Server 2000 ฉันต้องการอ้างถึงทริกเกอร์ FOR เป็นทริกเกอร์หลัง ดังนั้นสำหรับส่วนที่เหลือของบทความนี้ฉันจะอ้างถึงทริกเกอร์หลังหรือแทน

เช่นเดียวกับทริกเกอร์ AFTER ที่คุณเห็นก่อนหน้านี้ทริกเกอร์นี้จะป้องกันไม่ให้เกิดการเปลี่ยนแปลงกับฟิลด์นามสกุล อย่างไรก็ตามกฎนี้ใช้กฎทางธุรกิจที่แตกต่างจากตัวอย่างก่อนหน้านี้ เนื่องจากทริกเกอร์ INSTEAD OF เริ่มทำงานแทนคำสั่ง UPDATE ทริกเกอร์ INSTEAD OF จึงประเมินว่าการทดสอบกฎทางธุรกิจผ่านหรือไม่ หากการทดสอบกฎทางธุรกิจผ่านไปเพื่อให้การอัปเดตเกิดขึ้นทริกเกอร์ INSTEAD OF จะต้องเรียกใช้คำสั่ง UPDATE อย่างชัดเจนอีกครั้ง


4

AFTER ระบุว่าทริกเกอร์ DML จะเริ่มทำงานก็ต่อเมื่อการดำเนินการทั้งหมดที่ระบุในคำสั่ง SQL ทริกเกอร์ดำเนินการสำเร็จ การดำเนินการเรียงซ้อนอ้างอิงและการตรวจสอบข้อ จำกัด ทั้งหมดจะต้องสำเร็จก่อนที่ทริกเกอร์นี้จะเริ่มทำงาน AFTER เป็นค่าเริ่มต้นเมื่อ FOR เป็นคำหลักเดียวที่ระบุ

ไม่สามารถกำหนด AFTER ทริกเกอร์บนมุมมองได้

INSTEAD OF ระบุว่าทริกเกอร์ DML ถูกเรียกใช้งานแทนคำสั่ง SQL ที่ทริกเกอร์ดังนั้นการลบล้างการกระทำของคำสั่งทริกเกอร์ ไม่สามารถระบุ INSTEAD OF สำหรับทริกเกอร์ DDL หรือล็อกออน

https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql


1
วลีนี้ "AFTER เป็นค่าเริ่มต้นเมื่อ FOR เป็นคำหลักเดียวที่ระบุ" สับสนมาก พวกเขาสามารถพูดได้ดีกว่านี้
FMFF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.