danh sách các lỗi hủy bỏ hàng loạt trong máy chủ SQL


9

Trong SQL Server, nếu XACT_ABORT bị tắt thì một số lỗi sẽ chấm dứt câu lệnh hiện tại (ví dụ: cung cấp số lượng tham số không chính xác cho một thủ tục được lưu trữ có một số tham số) và một số lỗi sẽ hủy toàn bộ lô (ví dụ: cung cấp tham số cho lưu trữ thủ tục không lấy tham số). [Tham khảo]: http://www.sommarskog.se/error-handling-I.html#scope-abortion .

Những gì tôi muốn biết là liệu có một danh sách dứt khoát về lỗi nào đang hủy bỏ hàng loạt và lỗi nào đang chấm dứt.

Câu trả lời:


6

Tôi tin rằng có một vài trường hợp ngoại lệ, nhưng từ Mức độ lỗi động cơ cơ sở dữ liệu (MSDN) :

Thông báo lỗi có mức độ nghiêm trọng từ 19 trở lên sẽ dừng việc thực thi lô hiện tại.

Các lỗi chấm dứt kết nối cơ sở dữ liệu, thường có mức độ nghiêm trọng từ 20 đến 25, không được xử lý bởi khối CATCH vì việc thực thi bị hủy bỏ khi kết nối kết thúc.

Vì vậy, có vẻ như bạn có thể nhận được một danh sách dứt khoát từ truy vấn sau (tất nhiên điều này sẽ không cho phép bạn lọc ra những cái nào có thể do người dùng T-SQL gây ra):

SELECT message_id, severity, [text]
FROM sys.messages
WHERE language_id = 1033 
AND severity >= 19
ORDER BY severity, message_id;

Trong SQL Server 2012, điều này tạo ra 210 hàng.

Trong SQL Server 2016, điều này tạo ra 256 hàng.

Nhân tiện, tôi không tin hai kịch bản bạn mô tả trong câu hỏi của bạn hoạt động theo cách bạn nghĩ, ít nhất là không phải trong các phiên bản hiện đại của SQL Server. Tôi đã thử điều này trên cả năm 2012 và 2016 (Tôi tin rằng bài viết của Erland mô tả hành vi SQL Server 2000, tôi không nhớ nó có khác biệt gì không, nhưng ngày nay không liên quan lắm cho dù vậy).

USE tempdb;
GO

CREATE PROCEDURE dbo.pA -- no parameters
AS PRINT 1
GO
CREATE PROCEDURE dbo.pB -- two parameters
@x INT, @y INT
AS PRINT 1
GO

SET XACT_ABORT OFF;
GO

EXEC dbo.pA @foo = 1; 
PRINT '### Calling procedure that doesn''t take parameters with a parameter';
GO

EXEC dbo.pB; 
PRINT '### Calling procedure that takes 2 parameters with no parameters';
GO

EXEC dbo.pB @x = 1; 
PRINT '### Calling procedure that takes 2 parameters with not enough parameters';
GO

EXEC dbo.pB @x = 1, @y = 2, @z = 3; 
PRINT '### Calling procedure that takes 2 parameters with too many parameters';
GO

Tất cả đều tạo ra lỗi ở mức độ nghiêm trọng 16 và tất cả đều xảy ra với lô, bằng chứng là đầu ra in:

Msg 8146, Cấp 16, Trạng thái 2, Thủ tục pA, Dòng 11
Quy trình pA không có tham số và đối số được cung cấp.
### Quy trình gọi không lấy tham số với tham số
Msg 201, Cấp 16, Trạng thái 4, Quy trình pB,
Quy trình dòng 14 hoặc chức năng 'pB' mong đợi tham số '@x', không được cung cấp.
### Quy trình gọi có 2 tham số không có tham số
Msg 201, Cấp 16, Trạng thái 4, Quy trình pB,
Quy trình dòng 18 hoặc chức năng 'pB' mong đợi tham số '@y', không được cung cấp.
### Quy trình gọi có 2 tham số không đủ tham số
Msg 8144, Cấp 16, Trạng thái 2, Quy trình pB,
Quy trình 22 hoặc chức năng pB có quá nhiều đối số được chỉ định.
### Thủ tục gọi có 2 tham số với quá nhiều tham số

Như tôi nghi ngờ, tất nhiên, có những trường hợp ngoại lệ, như đã lưu ý trong các bình luận. Lỗi chuyển đổi là nghiêm trọng 16 nhưng hủy bỏ lô:

SET XACT_ABORT OFF;
SELECT CONVERT (INT, 'foo');
PRINT 'Made it.'; -- no print happens

Kết quả không bao gồm đầu ra in lần này:

Msg 245, Cấp 16,
Chuyển đổi trạng thái 1 không thành công khi chuyển đổi giá trị varchar 'foo' thành kiểu dữ liệu int.


Cảm ơn rât nhiều! Tôi nghĩ rằng tôi sẽ không thể sử dụng mức độ nghiêm trọng như một chỉ số vì sự không nhất quán trước đó. Rất vui khi biết đó không phải là trường hợp.
Jamie Alford

Aargh! Vẫn còn một số lỗi cấp độ nghiêm trọng 16 sẽ hủy bỏ lô. Nếu tôi chọn và thực thi: bắt đầu tran print @@ TRANCOUNT print convert (int, 'abc') theo sau: print @@ TRANCOUNT Sẽ có lỗi cấp 16 nhưng lô sẽ bị hủy bỏ.
Jamie Alford

BTW, nếu bạn phát hiện ra các trường hợp ngoại lệ được nêu ra với mức độ nghiêm trọng khác với trường hợp được khai báo, vui lòng báo cáo chúng thông qua kết nối
Remus Rusanu

2

Ngoài các loại lỗi được ghi nhận bởi @Aaron (nghĩa là Mức độ nghiêm trọng> = 19 và lỗi chuyển đổi), các loại lỗi sau, được ghi chú trong trang MSDN cho TRY ... CATCH , cũng sẽ hủy bỏ một đợt:

Các loại lỗi sau không được xử lý bởi khối CATCH khi chúng xảy ra ở cùng mức thực thi với cấu trúc TRY CAT CATCH:

  • Biên dịch lỗi, chẳng hạn như lỗi cú pháp, ngăn một lô chạy.

  • Các lỗi xảy ra trong quá trình biên dịch lại mức câu lệnh, chẳng hạn như lỗi phân giải tên đối tượng xảy ra sau khi biên dịch vì độ phân giải tên bị hoãn.

Các lỗi này được trả về mức đã chạy lô, thủ tục được lưu trữ hoặc kích hoạt.

Trong các ví dụ dưới đây, xin lưu ý rằng ba trong số chúng thậm chí là Mức độ nghiêm trọng 15.

VÍ DỤ 1

SET XACT_ABORT OFF;
SELECT @NotDeclared; -- parse error
PRINT 'Do you see me?';

Trả về:

Msg 137, Cấp 15, Trạng thái 2, Dòng 2
Phải khai báo biến vô hướng "@NotDeclared".

VÍ DỤ 2

SET XACT_ABORT OFF;
InvalidSQL; -- parse error
PRINT 'Do you see me?';

Trả về:

Msg 102, Cấp 15, Trạng thái 1, Dòng 2
Cú pháp không chính xác gần 'Không hợp lệ'.

VÍ DỤ 3

SET XACT_ABORT OFF;
SELECT 1 -- statement preceding THROW not terminated by semicolon
THROW 50505, N'Error, yo', 1; -- parse error
PRINT 'Do you see me?';

Trả về:

Msg 102, Cấp 15, Trạng thái 1, Dòng 3
Cú pháp không chính xác gần '50505'.

VÍ DỤ 4

SET XACT_ABORT OFF;
SELECT NoSuchColumn FROM sys.objects; -- compilation error
PRINT 'Do you see me?';

Trả về:

Msg 207, Cấp 16, Bang 1, Dòng 3
Tên cột không hợp lệ 'NoSuchColumn'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.