2014-02-26 9 views
12

Ich habe eine Tabelle t, die einen "After Insert" -Trigger namens trgInsAfter hat. Genau wie debugge ich es? Ich bin kein Experte dafür, also könnten die Frage und die ausgeführten Schritte albern aussehen.Wie Debuggen eines T-SQL-Triggers?

Die Schritte i so weit durchgeführt werden: 1. bis die Verbindung server instance über SSMS (mit einem Windows-Admin-Konto)

  1. rechts, um den Auslöserknoten von dem linken Baum klicken Sie in SSMS und doppelklicken Sie auf öffnen, wird der Code des Abzugs wird in einer neuen Abfragefenster (nennen das window-1) als geöffnet: bla ....,

    ALTER TRIGGER trgInsAfter AS .... BEGIN ... END 
    
  2. weitere Abfrage Fenster geöffnet (nennen das window-2), Geben Sie die SQL ein, um eine einzufügen Zeile in der Tabelle T:

    insert t(c1,c2) values(1,'aaa') 
    
  3. einen Haltepunkt in Window-1 gesetzt (in dem Code des Trigger)

  4. einen Haltepunkt in Window-2 gesetzt (der Einsatz von SQL-Code)

  5. klicken Sie in der Symbolleiste auf die Schaltfläche Debuggen während window-2 das aktuelle Fenster

    ist

    den Einsatz von SQL-Code der Haltepunkt erreicht wird, aber wenn ich auf window-1 suchen, der Haltepunkt im Code der Trigger ein Tooltip sagen 'unable to bind SQL breakpoint, object containing the breakpoint not loaded'

Ich Art von Problem verstehen: Wie kann SSMS wissen, dass der Code in Window-1 ist der Auslöser

ich zu debuggen? Ich kann nicht sehen, wo SSMS zu sagen, dass 'hey, der Code in diesem Abfrage-Editor ist Tabelle t's Trigger Code einfügen'

Irgendwelche Vorschläge?

Dank

+0

http://timwise.blogspot.co.uk/2012/05/debugging-stored-procedures-in-vs2010.html –

Antwort

24

Sie überdenken dies tatsächlich.

ich zum ersten Mal dieser Abfrage in einem Fenster laufen (setzen Dinge):

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 

dann kann ich das Fenster verwerfen.Ich öffne ein neues Abfragefenster, schreibe:

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

Und setzen Sie einen Haltepunkt auf dieser Linie. Ich dann die Debugger starten (Debug aus dem Menü oder in der Symbolleiste oder Alt-F5) und warte (für eine Weile, der Debugger ist nie zu schnell gewesen) dafür, dass Haltepunkt zu treffen. Und dann, nachdem ich dort getroffen habe, wähle ich Step Into (F11). Und lo (nach einer weiteren kleinen Wartezeit) wird ein neues Fenster geöffnet, das mein Auslöser ist, und die nächste Codezeile, an der der Debugger stoppt, ist die insert into Y... Zeile im Trigger. Ich kann jetzt weitere Haltepunkte innerhalb des Triggers setzen.

+1

Perfect, tat F11 den Trick! Ich glaube, ich habe mit C++/C# -Code zu lange und stieg in die Gewohnheit, alle relevanten Quellcodedateien zu laden und voreingestellten Haltepunkte :( – bondijct

+0

Ich will nur, dass die Quelle des Trigger enthält, in dem automatisch tauchte Fenster hinzufügen Code, der Weg ist wie folgt formatiert: 'mssql :: // mywin7pc \ bdsql/mydemodb// = 338100245' \ / /?/= id – bondijct

+0

Leider kann ich nicht auf Werte in den virtuellen Tischen 'inserted' und' deleted' – Santhos

3

Es gibt eine ausprüfenmenü in SSMS, aber Sie müssen wahrscheinlich auf dem Server zu debuggen zu können, so dass, wenn es einen Remote-Zugriff ist, ist es nicht richtig für sie eingerichtet werden . Mit dieser Debug-Option können Sie Code ausführen und in Ihren Trigger einsteigen und ihn auf diese Weise debuggen (wie Sie die meisten anderen Codes debuggen würden).

Debug menu

Wenn nicht Zugriff auf die Debug-Menü/Funktion, müssen Sie debuggen „von Hand“:

zunächst sicher, Ihre Trigger richtig laufen, indem die Eingabe des Trigger in ein Einfügen Debug-Tabelle. Dann können Sie überprüfen, ob es korrekt aufgerufen wurde. Dann können Sie die Abfrage des Triggers wie jede andere SQL-Abfrage mit den Werten aus der Debug-Tabelle debuggen.

0

aus irgendeinem Grund konnte ich nicht @-Lösung Damien_The_Unbeliever an die Arbeit. Zumindest nicht auf einen Trigger an einer Tabelle. Wenn ich einen Step Into gemacht habe, führte es die Abfrage jedes Mal aus, ohne in den Auslöser zu treten.

Dann bemerkte ich in den Kommentaren dieses Ansatzes, die Sie ohnehin nicht der Tabellenwerte sehen. So

......

landete ich eine generische Debug Tabelle zu erstellen.

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 

Und dann in meinem Stecher habe ich so etwas wie dieses ...

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 

Nach dem Abzug aus der Tabelle feuerte ich, dass ich auf die Debug_Table eingefügt eine der Variablen sehen konnte.

Nachdem Sie mit dem Debuggen fertig sind, könnten Sie problemlos Debugging-Einfügungen deaktivieren, indem Sie die @debugOn Variable in 0 ändern, für den Fall, dass Sie jemals wieder in Zukunft debuggen müssen; oder entfernen Sie einfach den Debug-Code.

0

konnte ich auch nicht Step Into, würde es direkt über meine INSTEAD OF INSERT Trigger gehen. So landete ich mit den Trigger ersetzt bis:

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

select * into temp from INSERTED 

END 

, die eine Tabelle mit dem Namen Temp erstellt mit exaclty die Spaltennamen und Werte von INSERTED.