Як перевірити тригер, якщо весь рядок після оновлення залишається однаковим?


11

Звичайно, я міг би зробити це для кожного стовпця, порівнюючи так:

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

Але це було б важко закодовано і важко підтримувати, якщо я додаю ще один стовпчик у майбутньому, наприклад.

Чи є спосіб перевірити, чи всі стовпці залишаються однаковими, не перевіряючи кожен окремий стовпчик вручну?


Чи можете ви використовувати EXCEPT
Скотт Ходжгін

Вибачте, але як EXCEPT буде використовуватися в моєму випадку? Я намагаюся порівняти старий рядок із новими значеннями рядків, з того, що я знаю, ОКРЕМИ, він використовується для порівняння існуючих рядків із двох запитів, а не в старому / новому контексті тригера ...
Mateus Viccari

Я не знайомий з вашими dbms - чи є спосіб вибору нового. * Крім вибору старого. *? Якщо кількість рядків = 0, рядки не змінюються
Скотт Ходгін

Відповіді:


15

Ви можете просто порівняти записи oldта newзаписи, за допомогою is not distinct fromяких правильно обробляються значення NULL (якщо всі стовпці визначені як NOT NULL, ви можете просто використовувати =або <>)

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

Те саме можна зробити, щоб перевірити, чи змінився хоча б один стовпець:

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

Як обробляються NULL за допомогою цих умов?
ypercubeᵀᴹ

@ ypercubeᵀᴹ: хороший момент. Я оновив свою відповідь.
a_horse_with_no_name

Thnx. Я зробив швидку перевірку і, здається, old=newсправляється зі справою точно так само old is not distinct from old. Іншими словами, я не міг знайти випадок, коли old=newдає результат NULL. Я цього не очікував!
ypercubeᵀᴹ

Я думаю, що різниця була б, old <> newале я не зовсім впевнений.
a_horse_with_no_name
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.