2012-01-31 3 views
6

Khi tạo tập lệnh SQL để tạo trình kích hoạt trên bảng, tôi muốn kiểm tra xem trình kích hoạt chưa tồn tại trước khi tạo. Nếu không, tập lệnh không thể chạy nhiều lần.SQL: Tại sao CREATE TRIGGER cần đứng trước GO

Vì vậy, tôi đã thêm một tuyên bố để trước tiên kiểm tra xem trình kích hoạt có tồn tại không. Sau khi thêm câu lệnh đó, câu lệnh CREATE TRIGGER không còn hoạt động nữa.

IF NOT EXISTS (SELECT name FROM sysobjects 
       WHERE name = 'tr_MyTable1_INSERT' AND type = 'TR') 
BEGIN 
    CREATE TRIGGER tr_MyTable1_INSERT 
     ON MyTable1 
     AFTER INSERT 
    AS 
    BEGIN 
     ... 
    END 
END 
GO 

Điều này cho phép:

Msg 156, Level 15, State 1, Line 5 
Incorrect syntax near the keyword 'TRIGGER'. 

Các giải pháp sẽ được thả cò hiện có và sau đó tạo mới:

IF EXISTS (SELECT name FROM sysobjects 
      WHERE name = 'tr_MyTable1_INSERT' AND type = 'TR') 
    DROP TRIGGER tr_MyTable1_INSERT 
GO 
CREATE TRIGGER tr_MyTable1_INSERT 
    ON MyTable1 
    AFTER INSERT 
AS 
BEGIN 
    ... 
END 
GO 

Câu hỏi của tôi là: w hy là ví dụ đầu tiên thất bại? Điều gì là sai với việc kiểm tra kích hoạt tồn tại?

Trả lời

10

Certain statements need to be the first in a batch (như trong, nhóm câu lệnh được phân tách bằng GO).

Trích:

CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, TẠO QUY TẮC, CREATE SCHEMA, CREATE TRIGGER, và câu lệnh CREATE VIEW không thể kết hợp với báo cáo khác trong một lô. Câu lệnh CREATE phải bắt đầu lô. Tất cả các câu lệnh khác theo sau đó sẽ được hiểu là một phần của định nghĩa của câu lệnh CREATE đầu tiên.

1

Nó chỉ đơn giản là một trong những quy tắc cho lô SQL Server (xem):

http://msdn.microsoft.com/en-us/library/ms175502.aspx

Nếu không, bạn có thể thay đổi một đối tượng, nói một bảng, và sau đó tham khảo các thay đổi trong cùng một nhóm , trước khi thực sự thay đổi.

+0

Sự sụt giảm sẽ trình bày cùng một vấn đề như tạo? – JeffO

1

Thay đổi giản đồ phải luôn là các cuộc gọi theo lô riêng biệt ... Tôi đoán họ làm điều đó để gaurantee SELECT của bạn sẽ thành công, nếu bạn sửa đổi lược đồ trong cùng một lô họ có thể không có khả năng gaurantee đó. Chỉ cần đoán ...