Pole w sys.objects
[name]
będzie zawierać tylko rzeczywistą nazwę (tj trg
) nie tym schemacie (tj dbo
w tym przypadku) lub jakichkolwiek kwalifikatorów tekstowych (tj [
i ]
w tym przypadku).
ORAZ nie określa się nazwy tabeli dla DROP TRIGGER
, ponieważ wyzwalacz jest obiektem samodzielnie (w przeciwieństwie do indeksów). Musisz więc usunąć klauzulę ON
(która jest używana tylko z wyzwalaczami DDL i logowania).
IF EXISTS (SELECT * FROM sys.objects WHERE [name] = N'trg' AND [type] = 'TR')
BEGIN
DROP TRIGGER [dbo].[trg];
END;
Należy pamiętać, że należy poprzedzić ciąg nazwa obiektu dosłowne z N
ponieważ pole [name]
jest sysname
typ danych, który przyrównuje do NVARCHAR(128)
.
Jeśli chciał zawierać nazwę schematu, można użyć funkcji OBJECT_ID()
który ma umożliwić nazw schematów i kwalifikatorów tekstowych (będzie wtedy trzeba dopasować przeciwko object_id
zamiast name
):
IF EXISTS (SELECT * FROM sys.objects WHERE [object_id] = OBJECT_ID(N'[dbo].[trg]')
AND [type] = 'TR')
BEGIN
DROP TRIGGER [dbo].[trg];
END;
Aby uprościć, ponieważ nazwa obiektu musi być unikalna w ramach schematu, naprawdę wystarczy przetestować jego istnienie. Jeśli z jakiegoś powodu istnieje inny typ obiektu o tej nazwie, DROP TRIGGER
zakończy się niepowodzeniem, ponieważ ten inny obiekt nie jest, no cóż, wyzwalaczem ;-). Dlatego używam następujące:
IF (OBJECT_ID(N'[dbo].[trg]') IS NOT NULL)
BEGIN
DROP TRIGGER [dbo].[trg];
END;
cześć scrutzky. Pojawia się błąd: Niepoprawna składnia w pobliżu "dbo". W bazie danych znajduje się już obiekt o nazwie "trg". – user3399326
@ user3399326 Właśnie zaktualizowałem swoją odpowiedź, aby rozwiązać ten błąd. Jest to spowodowane przez '' '' 'DROP TRIGGER'. –
@scurtzky: w końcu zadziałało. wielkie dzięki!! – user3399326