Oracle, безусловно, более элегантный и в этом случае ... Вот то, что вы можете попробовать:
CREATE TRIGGER counter_trigger
ON my_table AFTER INSERT, UPDATE
AS
BEGIN
update t
set t.my_counter +=1,
t.value += 1
from my_table t
where exists (-- restrict to inserted or updated rows ...
select null
from inserted i
where i.Id = t.Id
) and (exists (-- ... where the specific column was updated
select null
from deleted d
where d.Id = t.Id
and d.some_column <> t.some_column -- add some form of coalesce here if column is nullable.
)
or not exists (-- ... or the whole row was inserted.
select null
from deleted d
where d.Id = t.Id
)
);
END
GO
выше делает следующие предположения. Если это не так, вам придется немного изменить код:
- В таблице есть столбец первичного ключа с именем
Id
.
some_column
не может быть опущен. Если это так, отрегулируйте условие для учета нулей.
- У вашей базы данных установлен набор
recursive triggers enabled
, установленный в false
. Если вы не знаете об этой настройке, вы, вероятно, все в порядке.
Мы не являемся сервисом перевода кода. –