2012-11-14 37 views
6

Tôi có cò dưới đây:SQL Server - Sau khi Insert/Đối Insert - Rollback

CREATE Trigger instructor_expertise on CourseSections 
    After Insert 
    As Begin 
    ...... 

    If (Not Exists(Select AreaName From AreasOfInstructor Where (InstructorNo = @InstructorNo AND AreaName = @AreaName))) 
    Begin 
    RAISERROR('Course not in instructors expertise', 16, 1) 
    rollback transaction 
    End 
    GO 

Câu hỏi của tôi là, không 'giao dịch rollback' loại bỏ các hàng? Thay vào đó, nếu đó là 'Cho Chèn', 'giao dịch rollback' có xóa hàng trong trường hợp đó không?

Xin cảm ơn !!!

+0

@MitchWheat: giao dịch sẽ luôn tồn tại - không? Rõ ràng hoặc ngầm định. Và việc khôi phục sẽ chấm dứt giao dịch đó và hoàn tác mọi thứ mà giao dịch này đang cố gắng thực hiện cho bảng. –

+1

Có, xin lỗi Marc, đó là chính xác. Tôi có nghĩa là một giao dịch rõ ràng. Tôi nghĩ rằng tôi có thể đã lúng túng nước ... Tôi sẽ xóa bình luận trước đó. –

+0

Bạn lấy các giá trị đó ở đâu '@ InstructorNo' và' @ AreaName' từ ?? Về cơ bản, nếu bạn gọi 'ROLLBACK TRANSACTION' trong trigger của bạn, bạn sẽ ** dừng và hủy bỏ **' INSERT' của bạn và không có hàng nào được chèn vào ở tất cả –

Trả lời

13

tuyên bố INSERT của bạn luôn chạy trong một giao dịch - một trong hai bạn đã xác định một cách rõ ràng, hoặc nếu không muốn nói , sau đó SQL Server sẽ sử dụng một giao dịch ngầm định.

Bạn đang chèn một (hoặc nhiều) hàng vào bảng của mình. Sau đó - vẫn còn bên trong giao dịch - kích hoạt AFTER INSERT chạy và kiểm tra các điều kiện nhất định - thường sử dụng bảng giả Inserted có sẵn bên trong trình kích hoạt, chứa các hàng đã được chèn.

Nếu bạn gọi ROLLBACK TRANSACTION trong kích hoạt của bạn, sau đó có - giao dịch của bạn, với tất cả những gì nó đã làm, là cuộn lại và nó như thể đó INSERT bao giờ xảy ra - không có gì xuất hiện trong bảng cơ sở dữ liệu của bạn.

Ngoài ra: FOR INSERT cũng giống như AFTER INSERT trong SQL Server - cò được thực hiện sau khi tuyên bố INSERT đã làm công việc của mình.

Một điều cần lưu ý (mà rất nhiều lập trình viên có được sai): kích hoạt là bắn một lần mỗi đợt - KHÔNG một lần cho mỗi hàng! Vì vậy, nếu bạn chèn 20 hàng cùng một lúc, trình kích hoạt được kích hoạt sau khi và bảng giả Inserted bên trong trình kích hoạt chứa 20 hàng. Bạn cần tính đến điều đó khi viết trình kích hoạt - bạn đang không phải luôn xử lý chỉ một hàng đang được chèn!

+1

+1. Đặc biệt đối với các bit hàng loạt! :) –

0

không có nó không thể bởi vì khi họ không có hàng tồn tại sau đó nó sẽ đi vào bắt đầu khối ...

+1

cảm ơn cho trả lời! Làm thế nào tôi nên ngăn chặn hàng được thêm vào sau đó? – zoe

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