2015-06-25 36 views
10

Chciałbym sprawdzić, czy wyzwalacz istnieje w [tbl] i utworzyć inny. Próbowałem tego w ten sposób, ale nie działał. Co ja robię źle?uruchom wyzwalacz, jeśli istnieje i utwórz

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 

Odpowiedz

22

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; 
+0

cześć scrutzky. Pojawia się błąd: Niepoprawna składnia w pobliżu "dbo". W bazie danych znajduje się już obiekt o nazwie "trg". – user3399326

+0

@ user3399326 Właśnie zaktualizowałem swoją odpowiedź, aby rozwiązać ten błąd. Jest to spowodowane przez '' '' 'DROP TRIGGER'. –

+0

@scurtzky: w końcu zadziałało. wielkie dzięki!! – user3399326

0

można spróbować

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

EDIT:

Dobrze srutzky już dał ci odpowiedź i dobrze wyjaśnione, można analizować nazwę za pomocą PARSENAME.

+0

Po co zawracać sobie głowę pseudonimem? Po prostu zdejmij schemat. :) –

+0

@SeanLange True, tylko odrobina dodatkowych informacji nie zaszkodzi =) – mxix