การทริกเกอร์การยิงแม้จะไม่ได้รับผลกระทบ


10

นี่เป็นคำถามทั่วไปมากกว่า แต่แรงจูงใจสำหรับคำถามนี้เป็นปัญหาที่ฉันประสบขณะใช้ SQL Server

ฉันมีทริกเกอร์นี้แนบกับเหตุการณ์แทรกบนตารางที่มีตรรกะบางอย่างซึ่งเป็นผลข้างเคียงจะเพิ่มข้อผิดพลาดหากไม่มีแถวถูกแทรก เมื่อตรวจสอบเพิ่มเติมฉันพบว่ามีการยิงไกแม้จะไม่มีการแทรกแถว

ภาษาที่ใช้ในMicrosoft Docs บนทริกเกอร์ DMLดูเหมือนจะขัดแย้งกับพฤติกรรมนี้:

ทริกเกอร์ DML เป็นขั้นตอนการจัดเก็บชนิดพิเศษที่จะมีผลโดยอัตโนมัติเมื่อมีเหตุการณ์ DML เกิดขึ้นซึ่งมีผลต่อตารางหรือมุมมองที่กำหนดในทริกเกอร์

นี่เป็นพฤติกรรมเริ่มต้นใน DBMS หรือไม่ มีเหตุผลบางอย่างในการเริ่มต้นทริกเกอร์เมื่อไม่มีแถวที่ได้รับผลกระทบหรือไม่?

คำตอบ:


24

สำหรับการดำเนินการ DML จะมีทริกเกอร์ตามแถวและคำสั่งตาม

  • ทริกเกอร์แถวจะเริ่มทำงานเมื่อ (ก่อนหลังหรือแทน) แต่ละแถวจะได้รับผลกระทบ (แทรก / อัปเดต / ลบ) ดังนั้นพวกเขาจะยิง 100 ครั้งหากได้รับผลกระทบ 100 แถวและไม่ส่งเลยถ้าได้รับผลกระทบ 0 แถว

  • คำสั่งก่อให้เกิดไฟไหม้เมื่อINSERT / UPDATE / DELETEคำสั่งถูกดำเนินการ ไม่สำคัญว่าจะไม่มีแถวใดได้รับผลกระทบ ระดับคำสั่งจะเรียกใช้ไฟต่อไปและเพียงครั้งเดียวสำหรับคำสั่ง (ไม่ว่าจะเป็น 0, 100 หรือพันล้านแถวที่ได้รับผลกระทบ)

DBMS บางตัวมีทริกเกอร์ระดับแถวเท่านั้น (MySQL)

อื่น ๆ (เช่น SQL Server *ซึ่งเป็น DBMS ของคุณ) มีทริกเกอร์ระดับคำสั่งเท่านั้น

บางคน (DB2, Oracle, Postgres) มีทริกเกอร์ทั้งสองประเภท


*สถานะCREATE TRIGGERเอกสาร SQL Server :

ทริกเกอร์ DML ทำงานเมื่อผู้ใช้พยายามแก้ไขข้อมูลผ่านเหตุการณ์ data manipulation language (DML) เหตุการณ์ DML คือINSERT, UPDATEหรือDELETEข้อความสั่งบนตารางหรือมุมมอง สิ่งเหล่านี้จะเริ่มทำงานเมื่อมีเหตุการณ์ที่ถูกต้องถูกยิงโดยไม่คำนึงว่าแถวของตารางจะได้รับผลกระทบหรือไม่

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