Rumah >pangkalan data >tutorial mysql >Bagaimanakah Saya Boleh Mencegah Pencetus Rekursif dalam Pelayan SQL?

Bagaimanakah Saya Boleh Mencegah Pencetus Rekursif dalam Pelayan SQL?

DDD
DDDasal
2024-12-31 14:19:14630semak imbas

How Can I Prevent Recursive Triggers in SQL Server?

Mencegah Pencetus Rekursif dalam SQL Server

Dalam SQL Server 2008, pencetus pada jadual tblMedia, [dbo].[tblMediaAfterInsertOrUpdate], secara tidak sengaja menyebabkan tingkah laku rekursif. Tingkah laku ini berlaku apabila pencetus dicetuskan dan seterusnya mencetuskan dirinya sendiri.

Untuk memahami masalah, mari kita periksa pencetus:

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
    ...

Selepas Sisip atau Kemas Kini: Pencetus dilaksanakan sebelum sisipan atau kemas kini dilakukan komited.

Potensi Rekursi: Pernyataan kemas kini di dalam pencetus cuba mengubah suai jadual tblMedia. Pengubahsuaian ini berpotensi mencetuskan pencetus yang sama sekali lagi, membawa kepada gelung tak terhingga.

Mencegah Rekursi: Untuk mengelakkan tingkah laku rekursif ini, kita boleh menggunakan fungsi TRIGGER_NESTLEVEL() untuk menyemak tahap bersarang daripada pencetus. Jika tahap bersarang lebih daripada 1, pencetus sedang digunakan oleh pencetus lain dan harus dilangkau.

ALTER TRIGGER [dbo].[tblMediaAfterInsertOrUpdate]
ON [dbo].[tblMedia]
BEFORE INSERT, UPDATE
AS
BEGIN
    IF TRIGGER_NESTLEVEL() <= 1 /* Prevent recursion */
    BEGIN
        ...
    END
END

Penjelasan:

  • PENCETUS_NESTLEVEL () fungsi mengembalikan bilangan tahap pencetus bersarang. Jika pencetus semasa ialah pencetus paling luar (yang pertama dilaksanakan), tahap bersarang ialah 1.
  • Jika tahap bersarang lebih besar daripada 1, pencetus sedang digunakan oleh pencetus lain dan harus dilangkau untuk mengelakkan pengulangan.
  • Jika tahap bersarang ialah 1, pencetus tidak digunakan secara rekursif dan boleh meneruskannya dengan normal pelaksanaan.

Dengan memasukkan semakan ini ke dalam pencetus, kami menghalangnya daripada berulang selama-lamanya dan memastikan pengubahsuaian data yang diperlukan dilakukan sekali sahaja.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencegah Pencetus Rekursif dalam Pelayan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn