webentwicklung-frage-antwort-db.com.de

trigger auslösen, falls vorhanden und erstellen

Ich möchte prüfen, ob der Trigger auf [tbl] vorhanden ist, und einen anderen erstellen. Ich habe es so versucht, aber es hat nicht funktioniert. Was mache ich falsch?

IF EXISTS (SELECT * FROM sys.objects WHERE [name] = '[dbo].[trg]' AND [type] = 'TR')
      DROP TRIGGER [dbo].[trg] ON [dbo].[tbl]
GO
CREATE TRIGGER [dbo].[trg] ON [dbo].[tbl] 
AFTER DELETE
AS
BEGIN
   //
END
GO
14
user3399326

Das [name]-Feld in sys.objects enthält nur den tatsächlichen Namen (d. H. trg), nicht einschließlich des Schemas (d. H. dbo) oder beliebige Textqualifizierer (d. H. [ und ]).

UND Sie geben den Tabellennamen nicht für DROP TRIGGER an, da der Auslöser selbst ein Objekt ist (im Gegensatz zu Indizes). Daher müssen Sie die ON-Klausel entfernen (die nur bei DDL- und Logon-Triggern verwendet wird).

IF EXISTS (SELECT * FROM sys.objects WHERE [name] = N'trg' AND [type] = 'TR')
BEGIN
      DROP TRIGGER [dbo].[trg];
END;

Beachten Sie, dass Sie dem Objektnamen-String-Literal eine N voranstellen sollten, da das [name]-Feld ein sysname-Datentyp ist, der NVARCHAR(128) entspricht.

Wenn Sie den Schemanamen integrieren möchten, können Sie die Funktion OBJECT_ID() verwenden, die Schemanamen und Textqualifizierer zulässt (Sie müssen dann mit object_id anstelle von name übereinstimmen):

IF EXISTS (SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID(N'[dbo].[trg]')
               AND [type] = 'TR')
BEGIN
      DROP TRIGGER [dbo].[trg];
END;

Und um es zu vereinfachen, da der Objektname innerhalb des Schemas eindeutig sein muss, müssen Sie wirklich nur auf seine Existenz prüfen. Wenn aus irgendeinem Grund ein anderer Objekttyp mit diesem Namen vorhanden ist, schlägt der DROP TRIGGER fehl, da das andere Objekt kein Trigger ist ;-). Daher verwende ich Folgendes:

IF (OBJECT_ID(N'[dbo].[trg]') IS NOT NULL)
BEGIN
      DROP TRIGGER [dbo].[trg];
END;
33
Solomon Rutzky

Wenn Sie SQL Server 2016 verwenden, können Sie eine kürzere Variante verwenden.

DROP TRIGGER IF EXISTS [dbo].[trg]

https://docs.Microsoft.com/de-de/sql/t-sql/statements/drop-trigger-transact-sql

4
Neshta

Kannst du es versuchen

SELECT * FROM sys.objects WHERE [name] = PARSENAME('[dbo].[trg]',1) AND [type] = 'TR'

BEARBEITEN:

Nun, srutzky hat dir schon die Antwort gegeben und gut erklärt, du kannst den Namen mit Hilfe von PARSENAME parsen.

0
mxix