2012-12-16 2 views
0

Я запутался в поведении Management Studio. Я создал простой триггер для тестирования (действие UPDATE), он должен отображать сообщение (печать) на вкладке «Сообщения», но не отображается вкладка «Сообщения», и я не вижу никакого вывода. Если я выполняю любой другой запрос, это нормально, я мог видеть вкладку вкладки и вкладки результатов. Триггер сам работает (данные меняются).SQL Server Management Studio - PRINT от триггера, не отображающего

Вот мой код:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[Trigger1] 
ON [dbo].[TestTable] 
FOR UPDATE 
AS 
    PRINT ('YAHOOOOO!!!') /* can't see this message */ 
    UPDATE TestTable 
    SET TestData = 'testitem' 
    WHERE (TestId = 2) 
+2

Вы действительно выполняете инструкцию 'UPDATE', которая запускает триггер? Тот, который указан в вопросе, является частью определения триггера, а не отдельным утверждением. Это похоже на ошибку. Вам нужно «GO» после инструкции «PRINT», так что это отдельная партия. –

+0

Привет, Мартин! Спасибо за ответ. Чтобы проверить его, я просто нажимаю TestTable -> Edit Top 200 Rows, а затем вручную значение изменения в строке # 10 f.e. и сразу же строка # 2 изменит значение столбца TestData на «Anna», поэтому я думаю, что триггер работает, извините, я очень новичок – igorGIS

+2

Если вы делаете это в графических инструментах в SSMS, это, вероятно, просто не отображает эти ошибки сообщений в любом месте. Попробуйте запустить инструкцию 'UPDATE' из нового окна запроса вместо использования редактора пользовательского интерфейса. –

ответ

2

2 проблемы

  1. Ваш триггер будет вызывать «слишком много рекурсии» ошибка, потому что он пытается обновить таблицу (в пределах триггера), который вызывает триггер снова, который затем пытается обновить таблицу, затем вызывает триггер ... ad infinitum (теоретически). На практике SQL Server убивает его после обнаружения ошибки.

  2. «Редактировать Top 200 строк» ​​- это специальная функция, которая имеет собственное окно сообщений, поэтому вы не можете увидеть какой-либо вывод. Вам нужно запустить свой код в новом окне запроса.

В новом окне запроса переопределить триггер следующим образом:

ALTER TRIGGER [dbo].[Trigger1] 
ON [dbo].[TestTable] 
FOR UPDATE 
AS 
    PRINT 'YAHOOOOO!!!'; /* can't see this message */ 
GO 

Затем запустите этот UPDATE заявление самостоятельно.

UPDATE TestTable 
SET TestData = 'testitem' 
WHERE TestId = 2; 

Примечание: Поставьте посторонние скобки.

+0

Это зависит от настройки для ['RECURSIVE_TRIGGERS'] (http://msdn.microsoft.com/en-us/library/ms190739.aspx), будет ли она выходить из системы (после 32 вызовов) или просто не вызывать триггер. В любом случае этот код в триггере не имеет никакого смысла. –

+0

Нет, это не так, что я попросил ОП переопределить триггер. – RichardTheKiwi

+0

Ой, ребята, мои плохие, теперь я понял, что инструкции PRINT и UPDATE - это разные части, UPDATE фактически запускает триггер – igorGIS

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