Drop trigger, если существует и создает

Я хотел бы проверить, существует ли триггер на [tbl] и создать другой. Я пробовал это так, но не работал. Что я делаю неправильно?

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

Ответ 1

Поле [name] в sys.objects будет содержать только фактическое имя (т.е. trg), не включая схему (т.е. dbo в этом случае) или любые текстовые определители (т.е. [ и ] в этом случае).

И, вы не укажете имя таблицы для DROP TRIGGER, поскольку триггер - это объект сам по себе (в отличие от индексов). Поэтому вам нужно удалить предложение ON (которое используется только с триггерами DDL и Logon).

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

Обратите внимание, что вы должны префикс литерала строки имени объекта с помощью N, так как поле [name] является типом sysname, который равен NVARCHAR(128).

Если вы хотите включить имя схемы, вы можете использовать функцию OBJECT_ID(), которая разрешает имена схем и классификаторы текста (тогда вам нужно будет сопоставлять с object_id вместо name):

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

И для упрощения, поскольку имя объекта должно быть уникальным в схеме, вам действительно нужно только проверить его существование. Если по какой-то причине существует другой тип объекта с этим именем, DROP TRIGGER будет терпеть неудачу, так как это другой объект, ну, а не триггер;-). Следовательно, я использую следующее:

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

Ответ 2

Можете ли вы попробовать

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

EDIT:

Ну, сруцки уже дал вам ответ и хорошо объяснил, вы можете проанализировать имя с помощью PARSENAME.