Понимание сценария обработки ошибок SQL - PullRequest
3 голосов
/ 20 апреля 2011

Я новичок в SQL и пытаюсь понять следующий скрипт. может кто-нибудь сломать это для меня?

ErrorHandler:   
IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Error occurred in script to update version: transaction rolled back', 182, 4)
END
ELSE
COMMIT

У меня есть знания по Java, поэтому я понимаю циклы. Это синтаксис SQL, с которым мне нужна помощь.

  1. Например, что символ двойного @ представляет?
  2. ROLLBACK TRANSACTION - это зарезервированные ключевые слова SQL?
  3. Что означает ELSE COMMIT?

Спасибо, Ray

Ответы [ 4 ]

5 голосов
/ 20 апреля 2011
  1. @@ указывает переменные на стороне сервера.Думайте о них как о SQL-эквиваленте $var в сценарии на стороне клиента.
  2. ROLLBACK указывает, что при возникновении ошибки сервер БД должен «отменить» текущую транзакцию - в основном отбросить все выполненные измененияпока не произошла ошибка.например, в банковской транзакции, в которой вы переводите деньги со счета № 1 на счет № 2, если с депозитом № 2 что-то идет не так, вы «отменяете» снятие с № 1, чтобы деньги просто не исчезали из-за ошибки.
  3. ELSE COMMIT просто означает «сделай так».

В псевдокоде:

if (something went wrong) {
   undo all operations performed since the transaction started;
   send out an error message
} else {
   save the operations and commit them to disk
}
2 голосов
/ 20 апреля 2011

@@ ERROR будет содержать номер ошибки, если он не равен 0, произошла ошибка Рекомендуется хранить это в переменной, потому что любое действие сбрасывает его в 0, то же самое относится к @@ rowcount, см. Здесь: Когда следует хранить @@ ROWCOUNT в переменной?

Так что, если он не равен 0, скрипт откатывает любую работу, если он равен 0, он совершает транзакцию

фиксация означает, что изменения сохраняются, откат означает, что изменения возвращаются в состояние до начала транзакции

Начните здесь, чтобы получить больше информации http://www.sommarskog.se/error_handling_2005.html

0 голосов
/ 20 апреля 2011

Структура блока выглядит следующим образом:

IF @@ERROR <> 0 
BEGIN 
  ROLLBACK TRANSACTION 
  RAISERROR('Error occurred in script to update version: transaction rolled back',  182, 4) 
END 
ELSE 
  COMMIT 

Так что это базовое условие, написанное на t-sql (никакого отношения к java :)).Токены BEGIN и END являются просто разделителями и используются точно так же, как { и } в java - поэтому они используются в ветви IF (две команды) и не используются в ветви else (одна команда - не обязательно)

Ошибка @@ (и другие переменные, начинающиеся с @@, например @@ ROWCOUNT) - это системные переменные. @@ Error содержит последний код ошибки, заданный командой, и во фрагменте проверяется, все ли в порядке.

При наличии ошибок выполняются два действия
- выдана команда ROLLBACK TRANSACTION , которая отменяет все изменения, внесенные в базу данных (с момента последней операции BEGIN TRANSACTION)
- возникает ошибка no, чтобы сообщить вызывающемуаварийное завершение кода.

Здесь константы (182 и 4) используются для параметров вызова RaiseError @severity и @state.Я подозреваю, что 182 является опечаткой, потому что @severity должен быть числом в диапазоне 0-25, и (по соглашению) 18 используется для «ошибки пользователя с высокой серьезностью».Параметр @state - это просто некоторые данные, которые вы можете добавить к вызову, чтобы различать несколько сообщений об ошибках.

Если ошибок нет, выдается одна COMMIT TRANSACTION , которая делаетвсе изменения (со времени последней НАЧАЛА СДЕЛКИ) постоянны и доступны всем другим пользователям данных.

0 голосов
/ 20 апреля 2011

@@Error - это специальное значение в SQL Server, которое содержит номер ошибки, произошедшей с последним выполненным оператором (или в этом случае оператором до метки Goto ErrorHandler). Если он равен нулю, последний оператор успешно выполнен.

Rollback Transaction (и соответствует Commit) технически являются частью лексикона SQL. Они гарантируют, что в случае возникновения ошибки откат текущей транзакции. Это означает, что все изменения базы данных, которые произошли в сценарии, будут отменены, как если бы они никогда не имели место, или если не было ошибок (поскольку @@Error = 0), эти изменения будут сохранены в базе данных.

RAISERROR (Transact-SQL)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...