Триггер SQL Server «AFTER INSERT» не видит только что вставленную строку - PullRequest
42 голосов
/ 01 января 2009

Рассмотрим этот триггер:

ALTER TRIGGER myTrigger 
   ON someTable 
   AFTER INSERT
AS BEGIN
  DELETE FROM someTable
         WHERE ISNUMERIC(someField) = 1
END

У меня есть таблица, someTable, и я пытаюсь помешать людям вставлять плохие записи. Для целей этого вопроса у плохой записи есть поле "someField", которое полностью числовое.

Конечно, правильный способ сделать это НЕ с триггером, но я не контролирую исходный код ... только базу данных SQL. Поэтому я не могу предотвратить вставку плохой строки, но я могу сразу же удалить ее, что достаточно для моих нужд.

Триггер работает с одной проблемой ... когда он срабатывает, он, кажется, никогда не удаляет только что вставленную плохую запись ... он удаляет все старые плохие записи, но не удаляет только что вставленную плохую запись , Поэтому часто появляется одна плохая запись, которая не удаляется, пока кто-то другой не придет и не сделает еще одну ВСТАВКУ.

Это проблема в моем понимании триггеров? Вновь вставленные строки еще не зафиксированы во время работы триггера?

Ответы [ 12 ]

0 голосов
/ 05 января 2009

Возможно ли, что INSERT действителен, но после этого выполняется отдельное ОБНОВЛЕНИЕ, которое недействительно, но не сработает триггер?

0 голосов
/ 01 января 2009

Методы, описанные выше, очень хорошо описывают ваши варианты. Но что видят пользователи? Я не могу себе представить, как такой простой конфликт между вами и теми, кто отвечает за программное обеспечение, не может привести к путанице и антагонизму с пользователями.

Я бы сделал все, что мог, чтобы найти какой-то другой выход из тупика - потому что другие люди могли легко увидеть любые изменения, которые вы делаете, как эскалацию проблемы.

EDIT:

Я забью свой первый "undelete" и позволю опубликовать вышеупомянутое, когда этот вопрос впервые появился. Я, конечно, смутился, когда увидел, что это от JOEL SPOLSKY. Но похоже, что он приземлился где-то рядом. Голосовать не нужно, но я внесу это в протокол.

IME, триггеры так редко являются правильным ответом на что-либо, кроме мелкозернистых ограничений целостности, выходящих за рамки бизнес-правил.

...