2011-09-21 3 views
1

Это ОЧЕНЬ странная проблема. Я спросил об этом раньше: How did my trigger get deleted?Как мой триггер был удален? sql

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

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

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

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

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

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

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

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

ответ

0

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

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

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

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

1

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

2

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

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

+1

Согласовано. Вероятно, это утверждение похоже на: DROP TABLE MyTable SELECT * INTO MyTable FROM AnotherTable WHERE Поле = True –

2

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

Смежные вопросы