Как мой триггер был удален?SQL - PullRequest
1 голос
/ 22 сентября 2011

Это очень странная проблема. Я спрашивал об этом раньше здесь: Как мой триггер был удален?

Я переименовал свой триггер и подумал, что он прекратил свое действие, но проблема, похоже, снова возникла. Вот описание:

Если вы можете понять это, вы настоящий гуру SQL! Это одна из самых странных вещей, которые я когда-либо видел.

Я добавил триггер к таблице в нашей базе данных. Сервер SQL 2008. Триггер не делает ничего особенно сложного. Просто изменяет поле LastUpdated в таблице при изменении определенных полей. Это триггер «после обновления».

Существует большое унаследованное приложение C ++, которое выполняет все виды огромных запросов к этой базе данных. Каким-то образом (я понятия не имею, как) он удаляет этот триггер. Он не удаляет другие триггеры, и я уверен, что он не сбрасывает явно триггер или таблицу. Разработчики этого приложения даже ничего не знают о моих триггерах.

Как это возможно ??

Я попытался запустить трассировку с использованием SQL Server Profiler, и я просмотрел каждую отправляемую команду и выполнил их с помощью SQL Management Studio, но на мой триггер это не повлияло. Кажется, это происходит только когда я запускаю приложение. WTF: (

Другие разработчики считают, что они не удаляют его явно. Он не существует в sys.objects или sys.triggers, так что это не сбой с SSMS. Так растерянно :( Думаю, я просто переименую его и надеюсь на лучшее? Не могу придумать, что еще можно попробовать. Несколько комментариев ниже спрашивают, удаляется ли триггер, или он просто отключен, или не работает. он полностью удаляется. Кроме того, проблема не связана с фактическим содержимым триггера. Как я уже говорил, я удаляю содержимое и заменяю каким-то чрезвычайно простым кодом, который ничего не делает, затем он все еще удаляется.

Приветствие Mark

Ответы [ 4 ]

2 голосов
/ 22 сентября 2011

Ищите пропадание стола - вы можете быть удивлены тем, что на самом деле вызывает падение вашего стола. (Разные вещи, которые вы делаете через пользовательский интерфейс SSMS, в отличие от непосредственного использования tsql.)

Вы можете предотвратить падение этого типа таблицы неосторожности следующим образом: Сервис -> Параметры -> Дизайнеры-> Снимите флажок «Запретить сохранение изменений, требующих пересоздания таблицы»

2 голосов
/ 22 сентября 2011

Возможно, вы можете создать триггер DDL в базе данных и зарегистрировать все операторы удаления объектов.В частности, вы можете записать события перетаскивания в таблицу для регистрации, чтобы отследить ее или просто вычеркнуть заблокировать.

1 голос
/ 22 сентября 2011

Код другого приложения сбрасывает и заново создает всю таблицу? Если это так, возможно, он не знает о триггере.

0 голосов
/ 22 сентября 2011

Спасибо за предложения всем.В частности, предложение Биллинка о создании триггера DDL было классным.Я не знал, что такая вещь существует.

В любом случае, после 3-х месяцев размышлений о том, что здесь происходит WTF, я наконец дошел до сути.Надеюсь, это рассмешит кого-то:)

У меня есть куча скриптов для создания различных триггеров.Они имеют типичный формат: «если триггер существует, то удалить», «идти», затем «создать триггер» и еще один «идти».Я использую скрипт для добавления всех этих отдельных триггеров в базу данных за один раз.Я пропустил одну из команд "go" в нижней части команды create (во всех этих сотнях строк).Это означает, что триггер A был добавлен в базу данных с «если триггер B существует, то удалить» внизу.Классический!Человек, который был настолько запутанным ...

Приветствия
Марк

...