Как мой триггер был удален? - PullRequest
3 голосов
/ 29 июня 2011

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

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

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

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

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

UPDATE:

Извините, я не хочу тратить ваше время. Я только что понял, что если я изменю имя триггера, он не будет удален. Кроме того, если я изменю триггер, чтобы он вообще ничего не делал, он все равно будет удален. Из этого я могу только догадываться, что другие разработчики явно удаляют его, но я искал в трассировке имя триггера, а его там нет. Я буду беспокоить их и посмотрю, что они скажут. Спасибо за предложения.

ОБНОВЛЕНИЕ 2:

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

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

Ответы [ 3 ]

4 голосов
/ 29 июня 2011

Мысли:

  • Для удаления триггера требуется разрешение ALTER = не должно использоваться приложением
  • Триггеры могут быть отключены с помощью ALTER TABLE
  • Триггерыможет быть сбит с толку, проверяя @@ ROWCOUNT в начале, чтобы перехватывать фиктивные обновления и т. д.
  • Кодируется ли триггер только для отдельных строк и не запускается
  • Существует ли триггер в sys.objects/sys.triggers: не полагайтесь на Обозреватель объектов в SSMS
  • Триггер можно удалить, если таблица была отброшена и создана заново
  • Триггер не сработает для TRUNCATE TABLE
1 голос
/ 06 декабря 2017

У меня была идентичная проблема, которую я обнаружил в сценарии создания, в котором отсутствовал окончательный оператор GO.

Сценарий 1

IF EXISTS (....)
    DROP PROC MyProc
GO

CREATE PROC MyProc
.....
/* GO statement is missing */

Сценарий 2

IF EXISTS (....)
    DROP TRIGGER MyDisappearingTrigger
GO

CREATE TRIGGER MyDisappearingTrigger
.....
GO

Когда я проверял MyProc в проводнике объектов, это выглядело так:

CREATE PROC MyProc
AS
...

IF EXISTS (....)
    DROP TRIGGER MyDisappearingTrigger
GO

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

0 голосов
/ 29 июня 2011

проверьте с помощью команды MERGE в таблице, это вызовет ошибку триггеров

...