Ответ 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;