Как отлаживать триггер T-SQL?

У меня есть таблица t, которая имеет триггер после триггера после триггера. Точно как я отлаживаю его? я не эксперт в этом, поэтому вопрос и шаги могут выглядеть глупо.

Действия, которые я выполнил до сих пор:  1. подключитесь к server instance через SSMS (используя учетную запись Windows Admin)

  • щелкните правой кнопкой мыши триггер node из дерева lefthand в SSMS и дважды щелкните его, чтобы открыть его, код триггера открывается в новом окне запроса (вызовите это окно-1) как: blah....,

    ALTER TRIGGER trgInsAfter AS .... BEGIN ... END
    
  • откройте другое окно запроса (вызовите это окно-2), введите sql, чтобы вставить строку в таблицу t:

    insert t(c1,c2) values(1,'aaa')
    
  • установить точку прерывания в окне-1 (в кодах запуска)

  • установить точку прерывания в Window-2 (код вставки SQL)

  • нажмите кнопку "Отладка" на панели инструментов, а Window-2 - текущее окно

    удаляется точка останова SQL-кода вставки, но когда я смотрю на Window-1, точка останова в кодах запуска имеет подсказку, в которой 'unable to bind SQL breakpoint, object containing the breakpoint not loaded'

Я могу понять проблему: как можно SSMS знать, что код в Window-1 является триггером

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

Любые предложения?

Спасибо

Ответ 1

Ты на самом деле слишком задумываешься об этом.

Сначала я запускаю этот запрос в одном окне (чтобы настроить все):

create table X(ID int not null)
create table Y(ID int not null)
go
create trigger T_X on X
after insert
as
    insert into Y(ID) select inserted.ID
go

Я могу отбросить это окно. Я открываю новое окно запроса, пишу:

insert into X(ID) values (1),(2)

И установите точку останова на этой строке. Затем я запускаю отладчик (Debug из меню или панели инструментов или Alt-F5) и жду (какое-то время отладчик никогда не был слишком быстрым), чтобы он ударил эту точку останова. И затем, попав туда, я выбираю Step Into (F11). И lo (после другого небольшого ожидания) открывается новое окно, которое является моим триггером, а следующая строка кода, где останавливается отладчик, - это строка insert into Y... в триггере. Теперь я могу установить любые оставшиеся точки останова, которые я хочу включить в триггер.

Ответ 2

В SSMS есть меню DEBUG, но вы, вероятно, должны быть на сервере, чтобы иметь возможность отлаживать, поэтому, если это удаленный доступ, он не будет настроен для него. Эта опция отладки позволит вам выполнять код и входить в ваш триггер и отлаживать его таким образом (как вы отлаживаете большинство других кодов).

Debug menu

Если у вас нет доступа к меню/функции отладки, вам придется отлаживать "вручную":

Сначала убедитесь, что ваш триггер работает правильно, вставив вход триггера в таблицу отладки. Затем вы можете проверить правильность его имени. Затем вы можете отлаживать запрос триггера, как и любой другой запрос sql, используя значения из таблицы отладки.

Ответ 3

По какой-то причине я не смог получить решение @Damien_The_Unbeliever для работы. По крайней мере, не на триггере, прикрепленном к столу. Когда я делал Step Into, он просто выполнял запрос каждый раз, не входя в триггер.

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

Итак......

В итоге я создал общую таблицу отладки.

USE [Your_DB]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[Debug_Table](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [varchar](60) NOT NULL,
    [Value] [sql_variant] NULL,
    [Description] [varchar](max) NULL,
    [Captured] [datetime] NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF
GO

И затем в моем триггере я сделал что-то вроде этого...

DECLARE @ItemNum nvarchar(128)
SELECT  @ItemNum = Item_Number FROM inserted

DECLARE @debugOn as bit = 1
-- Debug
    IF @debugOn = 1
    BEGIN
        INSERT INTO Debug_Table (Name, Value, Description, Captured)
        VALUES ( 'Item Number', @ItemNum, 'The item number from the inserted table in tr_VaultItemIterations_ZCode_Monitor.', GETDATE())
    END;
-- End Debug

После запуска триггера из таблицы я могу просмотреть любую из переменных, которые я вставил в Debug_Table.

После завершения отладки вы можете легко отключить вставки отладки, изменив переменную @debugOn на 0 в случае, если вам понадобится снова отладить в будущем; или просто удалите код отладки вообще.

Ответ 4

Я также не смог Step Into, это пошло бы прямо над моим триггером INSTEAD OF INSERT. Поэтому я заменил триггер следующим образом:

ALTER TRIGGER [MyView_Instead_Insert] 
   ON  [MyView] 
   INSTEAD OF INSERT
AS 
BEGIN
SET NOCOUNT ON

select * into temp from INSERTED

END

Создал таблицу с именем temp с exaccty именами столбцов и значениями INSERTED.