Требовать явного значения в инструкции UPDATE? - PullRequest
1 голос
/ 25 августа 2011

Есть ли способ, с помощью триггера или какого-либо другого средства, гарантировать, что определенное поле всегда задано явно при обновлении строки, даже при запуске специального SQL через SQL Server Management Studio? В частности, все наши таблицы имеют поля change_note, и мы всегда хотим, чтобы это поле устанавливалось для каждого обновления. Вещи, которые мы рассмотрели и выбросили:

  1. Установите для change_note значение NOT NULL. Мы делаем это, но это не помогает. Как только change_note имеет начальное значение, вы можете запустить столько операторов UPDATE, сколько захотите, но забудьте обновить change_note, и NOT NULL останется довольным, потому что предыдущее значение все еще находится в change_note.

  2. Используйте триггер, чтобы сравнить старую версию change_note с новым значением change_note. Иногда вы хотите, чтобы change_note было таким же, как было ранее. Мы не хотим гарантировать, что change_note изменяется, мы хотим гарантировать, что значение для него явно указывается в любом обновлении.

  3. Запретите разрешения для запуска специального SQL и заставьте всех обновлять данные только через наш API хранимых процедур, и сделайте change_note обязательным параметром для всех SP, которые обновляют соответствующие таблицы. У нас слишком много специальных запросов для этого.

Тупик! Есть идеи?

Спасибо!

Ответы [ 5 ]

4 голосов
/ 25 августа 2011

Вы можете использовать функцию Update () в теле триггера. Он проверит, пытался ли оператор, который запустил триггер, изменить значение в столбце:

if Update(column)
    --do whay you want;BEGIN....END;

Вы можете найти больше информации об этом в:

http://msdn.microsoft.com/en-us/library/ms187326.aspx

http://msdn.microsoft.com/en-us/library/aa258254(v=sql.80).aspx

1 голос
/ 25 августа 2011

Триггер будет выполнять эту работу (убедитесь, что вы пишете его для обработки нескольких вставок / обновлений записей). Тем не менее, ваши первый и второй пункты кажутся мне взаимоисключающими. Как бы вы узнали, какие из них нужно изменить, если не NULL недостаточно хорошо. У вас есть какое-то бизнес-правило?

0 голосов
/ 25 августа 2011

см. Этот пост: https://stackoverflow.com/questions/6896834/is-possible-to-restrict-the-db2-database-operators-must-using-where-clause-in, и это комментарии, и пост, на который он ссылается.

0 голосов
/ 25 августа 2011

Требовать от всех пользователей выполнения изменений, вставляя обновленные значения в другую таблицу (где change_note НЕ NULL), и использовать триггеры для копирования значений поверх?

0 голосов
/ 25 августа 2011

Используйте # 2 и обработайте часть "иногда" в вашем триггере обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...