Упровадження обробки помилок T-SQL
Помилка вказує на проблему або важливу проблему, яка виникає під час операції бази даних. Помилки може бути створено обробником баз даних SQL Server у відповідь на подію або помилку на рівні системи; або ви можете створити помилки програми в коді Transact-SQL.
Елементи помилок обробника баз даних
Якою б не була причина, кожна помилка складається з таких елементів:
- Номер помилки – унікальний номер, який визначає певну помилку.
- Повідомлення про помилку – текст, який описує помилку.
- Серйозність – числове позначення серйозності від 1 до 25.
- State – внутрішній код стану для умови обробника баз даних.
- Procedure – ім'я збереженої процедури або тригера, у яких сталася помилка.
- Номер рядка – яка інструкція в пакеті або процедурі викликала помилку.
Системні помилки
Системні помилки попередньо визначені, і їх можна переглянути в системному поданні sys.messages . Коли виникає системна помилка, SQL Server може виконати автоматичні виправлення залежно від важливості помилки. Наприклад, коли виникає висока серйозність помилки, SQL Server може автономно використовувати базу даних або навіть зупинити службу обробника баз даних.
Настроювані помилки
Ви можете створювати помилки в коді Transact-SQL для відповіді на умови програми або настроювати відомості, надіслані клієнтським програмам у відповідь на системні помилки. Ці помилки програми можна визначити в тексті, де їх створено, або попередньо визначити їх у таблиці sys.messages поряд із системними помилками. Номери помилок, які використовуються для настроюваних помилок, мають бути 50001 або пізнішими.
Щоб додати настроюване повідомлення про помилку до sys.messages, скористайтеся sp_addmessage. Користувач повідомлення має бути учасником фіксованих серверних ролей sysadmin або serveradmin.
Синтаксис sp_addmessage:
sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg'
[ , [ @lang= ] 'language' ]
[ , [ @with_log= ] { 'TRUE' | 'FALSE' } ]
[ , [ @replace= ] 'replace' ]
Ось приклад настроюваного повідомлення про помилку з таким синтаксисом:
sp_addmessage 50001, 10, N’Unexpected value entered’;
Крім того, ви можете визначити настроювані повідомлення про помилки, учасники ролі сервера sysadmin також можуть використовувати додатковий параметр , @with_log. Якщо встановлено значення TRUE, помилка також записується в журналі застосунків Windows. Будь-яке повідомлення, записане до журналу програм Windows, також записується до журналу помилок SQL Server. Будьте розсудливі з використанням @with_log параметра, тому що мережеві та системні адміністратори, як правило, не подобається програми, які "чат" в системних журналах. Однак, якщо помилка має бути захоплена оповіщенням, повідомлення про помилку спочатку має бути записано до журналу програм Windows.
Примітка
Підвищення системних помилок не підтримується.
Повідомлення можна замінити, не видаляючи їх спочатку за допомогою @replace параметра = "замінити".
Повідомлення можна настроювати, і для кількох мов можна додавати різні номери помилок на основі language_id значення.
Примітка
Англійські повідомлення language_id 1033.
Піднести помилки за допомогою ФУНКЦІЇ RAISERROR
Як PRINT, так і RAISERROR можна використовувати, щоб повертати відомості або попереджувальні повідомлення програмам. Функція RAISERROR дає змогу програмам піднести помилку, яку може спіймати процес викликів.
RAISERROR
Можливість піднести помилки в T-SQL спрощують обробку помилок у програмі, оскільки вони надсилаються як будь-яка інша системна помилка. RaiseRROR використовується для:
- Довідка з виправлення неполадок із кодом T-SQL.
- Перевірте значення даних.
- Повернення повідомлень, які містять текст змінної.
Примітка
Використання інструкції PRINT схоже на підвищення рівня важливості 10.
Нижче наведено приклад настроюваного повідомлення про помилку за допомогою функції RAISERROR.
RAISERROR (N'%s %d', -- Message text,
10, -- Severity,
1, -- State,
N'Custom error message number',
2)
Коли спрацьовує, повертається:
Custom error message number 2
У попередньому прикладі %d – це покажчик місця заповнення для числа, а %s – це покажчик місця заповнення для рядка. Крім того, зверніть увагу, що номер повідомлення не згадується. Якщо під час застосування цього синтаксису виникають помилки з рядками повідомлень, вони завжди мають номер помилки 50000.
Піднімання помилок за допомогою функції THROW
Інструкція THROW пропонує простіший спосіб підвищення помилок у коді. Помилки мають містити не менше 50 000.
КИДАТИ
ФУНКЦІЯ THROW відрізняється від ФУНКЦІЇ RAISERROR кількома способами:
- Помилки, підняті throw, завжди мають важливість 16.
- Повідомлення, повернуті throw, не пов'язані з жодними записами в sys.sysmessages.
- Помилки, підняті throw, призводять до скасування транзакції, якщо вона використовується в поєднанні з SET XACT_ABORT ON і сеанс завершується.
THROW 50001, 'An Error Occured',0
Записування кодів помилок за допомогою @@Error
Більшість традиційних кодів обробки помилок у програмах SQL Server створено за допомогою @@ERROR. Структурована обробка винятків була введена в SQL Server 2005 і забезпечує сильну альтернативу використанню @@ERROR. Він буде обговорюватися на наступному уроці. Великий обсяг наявного коду обробки помилок SQL Server базується на @@ERROR, тому важливо зрозуміти, як з ним працювати.
@@ERROR
@@ERROR – це системна змінна, яка містить номер помилки останньої помилки, що сталася. Одна з суттєвих проблем із @@ERROR полягає в тому, що значення, яке вона тримає, швидко скидається, коли виконується кожна додаткова інструкція.
Наприклад, розглянемо такий код:
RAISERROR(N'Message', 16, 1);
IF @@ERROR <> 0
PRINT 'Error=' + CAST(@@ERROR AS VARCHAR(8));
GO
Можливо, під час виконання коду буде повернуто номер помилки в друкованому рядку. Однак, коли код виконується, він повертає:
Msg 50000, Level 16, State 1, Line 1
Message
Error=0
Помилку було піднято, але надруковане повідомлення – "Помилка=0". У першому рядку виводу можна побачити, що помилка, як і очікувалося, насправді становила 50 000, а повідомлення передано ФУНКЦІЇ RAISERROR. Це пов'язано з тим, що інструкцію IF, яка слідує за інструкцією RAISERROR, виконано успішно та спричинило скидання значення @@ERROR. Тому під час роботи з @@ERROR важливо записати номер помилки в змінну, щойно його буде піднято, а потім продовжити обробку змінною.
Перегляньте наведений нижче код, який демонструє таке:
DECLARE @ErrorValue int;
RAISERROR(N'Message', 16, 1);
SET @ErrorValue = @@ERROR;
IF @ErrorValue <> 0
PRINT 'Error=' + CAST(@ErrorValue AS VARCHAR(8));
Коли цей код виконується, він повертає такий результат:
Msg 50000, Level 16, State 1, Line 2
Message
Error=50000
Номер помилки повідомляється правильно зараз.
Централізація обробки помилок
Ще однією важливою проблемою використання @@ERROR для обробки помилок є те, що важко централізовано використовувати код T-SQL. Обробка помилок зазвичай розсіюється по всьому коду. За допомогою етикеток і операторів GOTO можна було б централізовано обробляти помилки за допомогою @@ERROR. Тим не менш, це буде похмуро більшістю розробників сьогодні як погана практика кодування.
Створення оповіщень про помилку
Для певних категорій помилок адміністратори можуть створювати оповіщення SQL Server, оскільки вони хочуть отримувати сповіщення одразу після їх виникнення. Це може навіть застосовуватися до користувацьких повідомлень про помилки. Наприклад, може знадобитися піднести оповіщення щоразу, коли заповниться журнал транзакцій. Оповіщення зазвичай використовуються, щоб привернути увагу адміністраторів до особливо серйозних помилок (наприклад, серйозності 19 або вище).
Підвищення оповіщень
Оповіщення можна створювати для певних повідомлень про помилки. Служба оповіщення працює, зареєструвавшись як служба зворотного виклику в службі журналювання подій. Це означає, що оповіщення працюють лише з помилками, що ввійшли в систему.
Є два способи зробити помилку піднімаючи оповіщення– можна скористатися параметром WITH LOG під час підвищення помилки або змінити повідомлення, щоб зробити його записаним, виконавши sp_altermessage. Параметр WITH LOG впливає лише на поточний оператор. Використання sp_altermessage змінює поведінку помилок для всіх майбутніх користувачів. Змінювати системні помилки за допомогою sp_altermessage можна лише з SQL Server 2005 з пакетом оновлень 3 (SP3) або SQL Server 2008 з пакетом оновлень 1 (SP1) і далі.