Saya memiliki pemicu tabel pada UPDATE dan INSERT yang menambahkan baris ke tabel lain. Hanya perlu menambahkan baris jika salah satu dari empat kolom diubah. Saya mencoba menggunakan JIKA UPDATE (col) untuk menguji perubahan tetapi memiliki blind spot. Ini hanya menguji bahwa beberapa nilai masuk. Saya perlu masuk lebih dalam, saya perlu membandingkan nilai lama dan baru untuk melihat perubahan yang sebenarnya telah terjadi. Itu harus bekerja dengan INSERT dan UPDATE.
Dalam hal PEMBARUAN yang mudah karena tabel yang dimasukkan dan dihapus memiliki nilai yang dapat saya bandingkan di dalam pelatuk. Namun, untuk INSERT hanya tabel sisipan yang memiliki nilai. Karena saya membutuhkan ini semua di pemicu yang sama, bagaimana saya menangani kasus INSERT itu?
Berikut ini skrip pemicu yang ingin saya ubah:
ALTER TRIGGER [dbo].[trATPerson_alter]
ON [mydb].[dbo].[AT_Person]
AFTER INSERT,UPDATE
AS
BEGIN
SET NOCOUNT ON;
-- Not all updates require a push
IF (UPDATE([First_Name]) OR UPDATE([Last_Name]) OR UPDATE([JobCode]) OR UPDATE([Inactive]))
BEGIN
INSERT INTO [mydb].[dbo].[AT_Person_To_Push] (
[Facility],
[VendorID],
[Person_code],
[First_Name],
[Last_Name],
[JobCode],
[Alink],
[Inactive]
)
SELECT [Facility],
[VendorID],
[Person_code],
[First_Name],
[Last_Name],
[JobCode],
[Alink],
[Inactive]
FROM inserted
END
END
Jawaban:
Anda dapat menangani INSERT dan UPDATE dengan operator set KECUALI. EXISTS hanya akan mengevaluasi TRUE baik jika itu hanya INSERT, atau jika itu adalah UPDATE dengan nilai yang berbeda untuk setiap kolom ini.
sumber
EXISTS
memeriksa apakah ada baris yang berubah. Jika Anda menyimpan sisipan dari pertanyaan, Anda kemudian akan mencatat semua baris yang diperbarui ketika hanya satu perubahan yang berarti.Jika pembaruan dapat memengaruhi banyak baris, Anda harus melindungi dari dua hal:
AT_Person_To_Push
. Jika 5 baris diperbarui, tetapi hanya 2 yang diperbarui dengan cara yang kami pedulikan, maka kami hanya perlu memproses 2 baris yang relevan.Begini cara saya menanganinya:
inserted
kedeleted
, karenainserted
akan memiliki baris untuk menyisipkan dan pembaruan sementaradeleted
hanya akan memiliki baris untuk pembaruan.EXISTS
denganEXCEPT
untuk menemukan baris di manainserted
nilai berbeda darideleted
nilai. Anda tidak dapat menggunakani.First_Name != d.First_Name OR i.Last_Name != d.Last_Name...
karena tabel yang dihapus akan kosong (dan LEFT JOIN akan mengembalikan nol) ketika pemicu menangani INSERT.AT_Person_To_Push
.sumber
Coba ini,
sumber