2009-09-11 19 views
15

Hãy nói rằng tôi đã có một kích hoạt như thế này:T-SQL: Một cách thích hợp để CLOSE/deallocate con trỏ trong bản cập nhật cò

CREATE TRIGGER trigger1 
    ON [dbo].[table1] 
    AFTER UPDATE 
AS 
BEGIN    
    --declare some vars 
    DECLARE @Col1 SMALLINT 
    DECLARE @Col1 TINYINT 

    --declare cursor   
    DECLARE Cursor1 CURSOR FOR 
    SELECT Col1, Col2 FROM INSERTED    

    --do the job 
    OPEN Cursor1 
    FETCH NEXT FROM Cursor1 INTO @Col1, @Col2 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF ...something... 
     BEGIN   
      EXEC myProc1 @param1 = @Col1, @Param2 = @Col2 
     END    
     ELSE 
     IF ...something else... 
     BEGIN   
      EXEC myProc2 @param1 = @Col1, @Param2 = @Col2 
     END  

     FETCH NEXT FROM Cursor1 INTO @Col1, @Col2    
    END 

    --clean it up  
    CLOSE Cursor1 
    DEALLOCATE Cursor1     
END 

Tôi muốn chắc chắn rằng Cursor1 luôn đóng cửa và deallocated. Ngay cả myProc1 hoặc myProc2 đều thất bại.

Tôi có nên sử dụng khối try/catch không?

+0

[đọc bắt buộc] (http://www.sommarskog.se/error-handling-I.html). –

Trả lời

15

Có, sử dụng TRY/CATCH nhưng chắc chắn rằng bạn deallocate vv sau. Thật không may, không có cuối cùng trong SQL Server.

Tuy nhiên, tôi khuyên bạn nên gói này trong một thử/catch

CREATE TRIGGER trigger1 ON [dbo].[table1] AFTER UPDATE 
AS 
BEGIN       
    --declare some vars 
    DECLARE @Col1 SMALLINT, @Col1 TINYINT 

    BEGIN TRY 
     --declare cursor    
     DECLARE Cursor1 CURSOR FOR 
     SELECT Col1, Col2 FROM INSERTED      

     --do the job 
     OPEN Cursor1 
     FETCH NEXT FROM Cursor1 INTO @Col1, @Col2 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      IF ...something... 
        EXEC myProc1 @param1 = @Col1, @Param2 = @Col2 
      ELSE 
      IF ...something else... 
        EXEC myProc2 @param1 = @Col1, @Param2 = @Col2 

      FETCH NEXT FROM Cursor1 INTO @Col1, @Col2        
     END 
    END TRY 
    BEGIN CATCH 
     --do what you have to 
    END CATCH 

    BEGIN TRY 
     --clean it up    
     CLOSE Cursor1 
     DEALLOCATE Cursor1         
    END TRY 
    BEGIN CATCH 
     --do nothing 
    END CATCH 
END 

Cho dù một con trỏ vào một kích hoạt là một ý tưởng tốt là một vấn đề khác ...

+0

Lý do của bạn để gói dọn dẹp con trỏ trong một khối try/catch khi bắt không làm gì? –

+4

@NickDeVore: bởi vì con trỏ có thể đã được đóng, tùy thuộc vào cách proc1 hoặc proc2 thất bại (trong một kích hoạt, có thể thử/bắt vv). Cẩn tắc vô ưu. – gbn

+0

Bạn có thể sử dụng cú pháp TRY/CATCH trong trình kích hoạt không? Những gì tôi biết là khi một lỗi xảy ra trong một kích hoạt toàn bộ giao dịch thất bại, cho dù có thử/bắt hay không. –

1

Điều bạn nên làm là không bao giờ sử dụng con trỏ trong trình kích hoạt. Thay vào đó, hãy viết mã dựa trên tập hợp đúng. Nếu ai đó đã nhập dữ liệu vào bảng 100.000 hồ sơ mới của bạn, bạn sẽ khóa bảng trong nhiều giờ và mang lại cơ sở dữ liệu của bạn để tạm dừng. Nó là một thực tế rất nghèo để sử dụng một con trỏ trong một kích hoạt.

+1

Nếu ai đó đã nhập dữ liệu vào bảng 100.000 bản ghi mới này, nó sẽ không khóa bảng của tôi chút nào (vì đây là trình kích hoạt sau khi cập nhật;) Nhưng nghiêm túc. Đừng hiểu lầm tôi. Tôi hoàn toàn hiểu ý của bạn và bạn đúng. Tôi sẽ không bao giờ sử dụng một con trỏ trong một kích hoạt trừ khi điều này là hoàn toàn cần thiết và trong trường hợp của tôi nó được. Về lý thuyết chỉ vài hàng có thể được cập nhật cùng một lúc từ ứng dụng của tôi (trừ khi ai đó sẽ cập nhật từ Management Studio). Tất cả mọi thứ hoạt động hoàn hảo (và nhanh chóng) nhưng tôi tự hỏi nếu một trong những SP của tôi không thành công. Tôi có nên lo lắng không? – Novitzky

+0

Tôi khuyên bạn nên kiểm tra bằng cách thực hiện thay đổi đối với proc hoặc chèn dữ liệu sẽ đảm bảo rằng proc sẽ thất bại. Sau đó, bạn sẽ biết điều gì sẽ xảy ra. – HLGEM

+0

Cảm ơn. Đây chính là điều tôi sẽ làm. Như tôi đã nói trước khi tôi phải sử dụng con trỏ (nếu không nó sẽ là quá nhiều thay đổi trong ứng dụng của tôi) nhưng tôi có thể thay đổi SP của tôi. Dù sao cũng cảm ơn bạn. – Novitzky

Các vấn đề liên quan