Bagaimana cara memeriksa pemicu jika seluruh baris tetap sama setelah pembaruan?

11

Tentu saja saya bisa melakukannya untuk setiap kolom yang membandingkan seperti ini:

if (old.column1 = new.column1 and old.column2 = new.column2...)

Tapi itu akan sulit dikodekan dan sulit untuk dipertahankan jika saya menambahkan kolom lain di masa depan, misalnya.

Apakah ada cara untuk memeriksa apakah semua kolom tetap sama tanpa memeriksa setiap kolom secara manual?

Mateus Viccari
sumber
Bisakah Anda menggunakan KECUALI - techonthenet.com/postgresql/except.php
Scott Hodgin
Maaf tapi bagaimana KECUALI akan digunakan dalam kasus saya? Saya mencoba membandingkan baris lama dengan nilai baris baru, dari apa yang saya ketahui KECUALI digunakan untuk membandingkan baris yang ada dari dua pertanyaan, bukan dalam konteks pemicu baru / baru ...
Mateus Viccari
Saya tidak terbiasa dengan dbms Anda - adakah cara untuk memilih yang baru. * Kecuali pilih yang lama. *? Jika rowcount = 0, tidak ada baris yang diubah
Scott Hodgin

Jawaban:

15

Anda cukup membandingkan olddan newcatatan yang menggunakan is not distinct fromyang menangani nilai NULL dengan benar (jika semua kolom didefinisikan sebagai BUKAN NULL, Anda cukup menggunakan =atau <>)

if old is not distinct from new then 
   .... do something
end if;

Hal yang sama dapat dilakukan untuk memeriksa apakah setidaknya satu kolom berubah:

if old is distinct from new then 
   .... do something
end if;
seekor kuda tanpa nama
sumber
Bagaimana NULL ditangani oleh kondisi ini?
ypercubeᵀᴹ
@ ypercubeᵀᴹ: poin bagus. Saya memperbarui jawaban saya.
a_horse_with_no_name
Thnx. Saya melakukan pemeriksaan cepat dan sepertinya old=newmenangani kasus ini persis seperti old is not distinct from old. Dengan kata lain, saya tidak dapat menemukan case yang old=newmemberikan hasil NULL. Saya tidak mengharapkan itu!
ypercubeᵀᴹ
Saya pikir perbedaannya ada pada old <> newtetapi saya tidak sepenuhnya yakin.
a_horse_with_no_name