Jak sprawdzić wyzwalacz, jeśli cały wiersz pozostaje taki sam po aktualizacji?

11

Oczywiście mógłbym to zrobić dla każdej kolumny, porównując w ten sposób:

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

Ale na przykład byłoby to mocno zakodowane i trudne do utrzymania, jeśli dodam inną kolumnę w przyszłości.

Czy istnieje sposób sprawdzenia, czy wszystkie kolumny pozostają takie same bez ręcznego sprawdzania poszczególnych kolumn?

Mateus Viccari
źródło
Czy możesz użyć WYJĄTKOWO
Scott Hodgin,
Przepraszam, ale w jaki sposób w moim przypadku zostanie WYJĄTKOWO? Próbuję porównać stary wiersz z nowymi wartościami wiersza, z tego, co wiem o WYJĄTKU, służy do porównania istniejących wierszy z dwóch zapytań, a nie w starym / nowym kontekście wyzwalacza ...
Mateus Viccari,
Nie znam twojego dbms- czy istnieje sposób na wybranie nowego. * Oprócz wyboru starego. *? Jeśli liczba wierszy = 0, żadne wiersze nie uległy zmianie
Scott Hodgin,

Odpowiedzi:

15

Możesz po prostu porównać rekordy oldi, za newpomocą is not distinct fromktórych poprawnie obsługuje wartości NULL (jeśli wszystkie kolumny są zdefiniowane jako NOT NULL, możesz po prostu użyć =lub <>)

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

To samo można zrobić, aby sprawdzić, czy zmieniła się co najmniej jedna kolumna:

if old is distinct from new then 
   .... do something
end if;
koń bez imienia
źródło
W jaki sposób NULL są obsługiwane przez te warunki?
ypercubeᵀᴹ
@ ypercubeᵀᴹ: dobry punkt. Zaktualizowałem swoją odpowiedź.
a_horse_w_no_name
Dziękuję Zrobiłem szybkie sprawdzenie i wydaje się, że old=newtak samo jest ze skrzynką old is not distinct from old. Innymi słowy, nie mogłem znaleźć przypadku, w którym dałoby old=newwynik NULL. Nie spodziewałem się tego!
ypercubeᵀᴹ
Myślę, że różnica byłaby z tym, old <> newale nie jestem do końca pewien.
a_horse_w_no_name