4 Errors and Exception Handling
This chapter describes the flexible error trapping and error handling you can use in your PL/SQL programs.
For more information on error-handling and exceptions in PL/SQL, see «PL/SQL Error Handling» in Oracle Database PL/SQL Language Reference .
See the end of this chapter for TimesTen-specific considerations.
The following topics are covered:
Under standing exceptions
This section provides an overview of exceptions in PL/SQL programming, covering the following topics:
About exceptions
An exception is a PL/SQL error that is raised during program execution, either implicitly by TimesTen or explicitly by your program. Handle an exception by trapping it with a handler or propagating it to the calling environment.
For example, if your SELECT statement returns multiple rows, TimesTen returns an error (exception) at runtime. As the following example shows, you would see TimesTen error 8507, then the associated ORA error message. ( ORA messages, originally defined for Oracle Database, are similarly implemented by TimesTen.)
You can handle such exceptions in your PL/SQL block so that your program completes successfully. For example:
Exc eption types
There are three types of exceptions:
Predefined exceptions are error conditions that are defined by PL/SQL.
Non-predefined exceptions include any standard TimesTen errors.
User-defined exceptions are exceptions specific to your application.
In TimesTen, these three types of exceptions are used in the same way as in Oracle Database.
Exception | Description | How to handle |
---|---|---|
Predefined TimesTen error | One of approximately 20 errors that occur most often in PL/SQL code | You are not required to declare these exceptions. They are predefined by TimesTen. TimesTen implicitly raises the error. |
Non-predefined TimesTen error | Any other standard TimesTen error | These must be declared in the declarative section of your application. TimesTen implicitly raises the error and you can use an exception handler to catch the error. |
User-defined error | Error defined and raised by the application | These must be declared in the declarative section. The developer raises the exception explicitly. |
Trapping exceptions
This section describes how to trap predefined TimesTen errors or user-defined errors.
Trap ping predefined TimesTen errors
Trap a predefined TimesTen error by referencing its predefined name in your exception-handling routine. PL/SQL declares predefined exceptions in the STANDARD package.
Table 4-1 lists predefined exceptions supported by TimesTen, the associated ORA error numbers and SQLCODE values, and descriptions of the exceptions.
Table 4-1 Predefined exceptions
Exception name | Oracle Database error number | SQLCODE | Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Exception name | Oracle Database error number | SQLCODE | Description | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Parameter | Description |
---|---|
exception_name | Exception name. The maximum length is 31 characters |
message | Default error message. The maximum length is 1,021 characters |
The statement CREATE EXCEPTION creates a new exception for use in PSQL modules. If an exception of the same name exists, the statement will fail with an appropriate error message.
The exception name is a standard identifier. In a Dialect 3 database, it can be enclosed in double quotes to make it case-sensitive and, if required, to use characters that are not valid in regular identifiers. See Identifiers for more information.
The default message is stored in character set NONE , i.e., in characters of any single-byte character set. The text can be overridden in the PSQL code when the exception is thrown.
Any user connected to the database can create an exception.
- Creating an exception named E_LARGE_VALUE:
- Creating an exception named ERROR_REFIN_RATE:
Grouping CREATE EXCEPTION statements together in system update scripts will simplify working with them and documenting them. A system of prefixes for naming and categorising groups of exceptions is recommended.
Custom exceptions are stored in the system table RDB$EXCEPTIONS .
Что такое код alter exception
Встроенные исключения в Oracle PL/SQL, блок Exception, коды ошибок
Задание:
Вам представлен следующий код PL / SQL :
SET SERVEROUTPUT ON;
Измените его таким образом, чтобы:
· если пользователь выбирает для второго числа 0, выводилось сообщение «Деление на ноль!»;
· если пользователь вводит символьные значения типа ‘ abc ‘, выводилось сообщение «Неверный тип данных»;
· в других ситуациях выводилось сообщение «Неизвестная ошибка».
Результат выполнения кода должен быть таким, как представлено на рис. Лаб. 18.1-1.
Примечание. Некоторые исключения все равно перехватываться не будут. Убедитесь, что ваш код перехватывает исключения для 0 и ‘ abc ‘.
Как поймать и обрабатывать только определенные исключения Oracle?
От этого и this , я думаю, что нет предопределенных Именованных Исключений Системы для ORA-00955.
Как я могу переписать следующее, чтобы поймать только ошибку ORA-00955?
BTW Есть ли какой-либо синтаксис для улавливания ошибок, просто указав коды ошибок?
2 ответа
У вас есть два варианта:
Обратитесь к исключению напрямую по номеру:
Другой вариант — использовать директиву EXCEPTION_INIT Pragma, чтобы связать известный номер ошибки Oracle с пользовательским исключением;
BTW Есть ли какой-либо синтаксис для улавливания ошибок, просто указав коды ошибок?
Да, я продемонстрировал это в первом примере
Дальнейшее чтение вариантов для этого:
Подобно тому, что уже предложил Сатья, но мне нравится избегать when others полностью, если это возможно — необработанное исключение, как правило, является правильным результатом для исключений, которые вы специально не обрабатываете:
Исключения в python. Конструкция try — except для обработки исключений
Исключения (exceptions) — ещё один тип данных в python. Исключения необходимы для того, чтобы сообщать программисту об ошибках.
Самый простейший пример исключения — деление на ноль:
Разберём это сообщение подробнее: интерпретатор нам сообщает о том, что он поймал исключение и напечатал информацию (Traceback (most recent call last)).
Далее имя файла (File «»). Имя пустое, потому что мы находимся в интерактивном режиме, строка в файле (line 1);
Выражение, в котором произошла ошибка (100 / 0).
Название исключения (ZeroDivisionError) и краткое описание исключения (division by zero).
Разумеется, возможны и другие исключения:
В этих двух примерах генерируются исключения TypeError и ValueError соответственно. Подсказки дают нам полную информацию о том, где порождено исключение, и с чем оно связано.
Рассмотрим иерархию встроенных в python исключений, хотя иногда вам могут встретиться и другие, так как программисты могут создавать собственные исключения. Данный список актуален для python 3.3, в более ранних версиях есть незначительные изменения.
- BaseException — базовое исключение, от которого берут начало все остальные.
- SystemExit — исключение, порождаемое функцией sys.exit при выходе из программы.
- KeyboardInterrupt — порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl+C).
- GeneratorExit — порождается при вызове метода close объекта generator.
- Exception — а вот тут уже заканчиваются полностью системные исключения (которые лучше не трогать) и начинаются обыкновенные, с которыми можно работать.
- StopIteration — порождается встроенной функцией next, если в итераторе больше нет элементов.
- ArithmeticError — арифметическая ошибка.
- FloatingPointError — порождается при неудачном выполнении операции с плавающей запятой. На практике встречается нечасто.
- OverflowError — возникает, когда результат арифметической операции слишком велик для представления. Не появляется при обычной работе с целыми числами (так как python поддерживает длинные числа), но может возникать в некоторых других случаях.
- ZeroDivisionError — деление на ноль.
- AssertionError — выражение в функции assert ложно.
- AttributeError — объект не имеет данного атрибута (значения или метода).
- BufferError — операция, связанная с буфером, не может быть выполнена.
- EOFError — функция наткнулась на конец файла и не смогла прочитать то, что хотела.
- ImportError — не удалось импортирование модуля или его атрибута.
- LookupError — некорректный индекс или ключ.
- IndexError — индекс не входит в диапазон элементов.
- KeyError — несуществующий ключ (в словаре, множестве или другом объекте).
- MemoryError — недостаточно памяти.
- NameError — не найдено переменной с таким именем.
- UnboundLocalError — сделана ссылка на локальную переменную в функции, но переменная не определена ранее.
- OSError — ошибка, связанная с системой.
- BlockingIOError
- ChildProcessError — неудача при операции с дочерним процессом.
- ConnectionError — базовый класс для исключений, связанных с подключениями.
- BrokenPipeError
- ConnectionAbortedError
- ConnectionRefusedError
- ConnectionResetError
- FileExistsError — попытка создания файла или директории, которая уже существует.
- FileNotFoundError — файл или директория не существует.
- InterruptedError — системный вызов прерван входящим сигналом.
- IsADirectoryError — ожидался файл, но это директория.
- NotADirectoryError — ожидалась директория, но это файл.
- PermissionError — не хватает прав доступа.
- ProcessLookupError — указанного процесса не существует.
- TimeoutError — закончилось время ожидания.
- ReferenceError — попытка доступа к атрибуту со слабой ссылкой.
- RuntimeError — возникает, когда исключение не попадает ни под одну из других категорий.
- NotImplementedError — возникает, когда абстрактные методы класса требуют переопределения в дочерних классах.
- SyntaxError — синтаксическая ошибка.
- IndentationError — неправильные отступы.
- TabError — смешивание в отступах табуляции и пробелов.
- IndentationError — неправильные отступы.
- SystemError — внутренняя ошибка.
- TypeError — операция применена к объекту несоответствующего типа.
- ValueError — функция получает аргумент правильного типа, но некорректного значения.
- UnicodeError — ошибка, связанная с кодированием / раскодированием unicode в строках.
- UnicodeEncodeError — исключение, связанное с кодированием unicode.
- UnicodeDecodeError — исключение, связанное с декодированием unicode.
- UnicodeTranslateError — исключение, связанное с переводом unicode.
- Warning — предупреждение.
Теперь, зная, когда и при каких обстоятельствах могут возникнуть исключения, мы можем их обрабатывать. Для обработки исключений используется конструкция try — except.
Первый пример применения этой конструкции:
В блоке try мы выполняем инструкцию, которая может породить исключение, а в блоке except мы перехватываем их. При этом перехватываются как само исключение, так и его потомки. Например, перехватывая ArithmeticError, мы также перехватываем FloatingPointError, OverflowError и ZeroDivisionError.
Также возможна инструкция except без аргументов, которая перехватывает вообще всё (и прерывание с клавиатуры, и системный выход и т. д.). Поэтому в такой форме инструкция except практически не используется, а используется except Exception. Однако чаще всего перехватывают исключения по одному, для упрощения отладки (вдруг вы ещё другую ошибку сделаете, а except её перехватит).
Ещё две инструкции, относящиеся к нашей проблеме, это finally и else. Finally выполняет блок инструкций в любом случае, было ли исключение, или нет (применима, когда нужно непременно что-то сделать, к примеру, закрыть файл). Инструкция else выполняется в том случае, если исключения не было.
спящий внешний ключ: ошибка при выполнении DDL «alter table. «
У меня довольно простая структура объектов, которая дает мне ошибку, которую я не могу решить. Проделали кучу поиска, и я думаю, что это должно быть довольно распространенным случаем, поэтому не уверен, в чем проблема. У меня эти три класса:
при сохранении в DAO я получаю ошибки, которые я действительно не понимаю, например
У меня есть эти свойства в моей конфигурации
Мне показалось, что я довольно тщательно прошел через документы и думаю, что это довольно простой дизайн объектов. любые идеи относительно того, как разрешить, и где в документах я должен более тщательно исследовать, чтобы понять первопричину?
Конструкция On E:Exception Do
Добрый день! Подскажите пожалуйста, в чем смысл конструкции On E:Exception Do? Что такое E? Правильно ли я понимаю, что эта конструкция реагирует на любое исключение?
Добавлено через 44 минуты
Проблема решена, разобрался.
Комментарий модератора | |
|
Добавлено через 4 часа 55 минут
Решение:
E — объект класса Exception. Да, данная конструкция и правда реагирует на любое исключение, дальнейшая обработка сводится к определению типа (например, E.ClassName) и выводу сообщения (например, E.Message), либо иному действию.
Все исключения:
Как избавится от «First chance exception Exception class EOutOfResources with message ‘Out of system resources’.»?
Как избавится от «First chance exception at $765CC54F. Exception class EOutOfResources with message.
First chance exception at $77ADB09E. Exception class EAccessViolation with message ‘Access Violation’. Process
Объясните в каких случаях возникает эта ошибка, из-за чего? Как справиться с этой ошибкой? Только.
Database Exception – yii\db\Exception ↵ Caused by: PDOException
«Database Exception – yii\db\Exception Caused by: PDOException» Помогите , пожалуйста.
В приведенном ниже вообще возможно срабатывание блока else? Тут и EMyException блок не срабатывает, т.к. Exception более общий случай и встречается раньше:
Ну, так ты написал предка перед потомком, кто ж тебе виноват что ты сам же и заблокировал тем самым возможность поймать именно потомка. Обычно предок ловится после потомка
Что такое код alter exception
с помощью конструкции try .. exceprion можно экранировать ошибки, а как вывести сообщение об ошибке, скажем в Мемо?
Ну и ищи в хелпе по этим ключевым словам. Находится за секунды и с примером.
try
except On E:Exception
Memo1.Lines.Add (E.Message)
end
Че нить типа такого
try
.
except
on e:exception do
begin
MLog.Lines.Add(«Ошибка вышла «+#+e.Message);
raise Exception.Create(«Ошибка в разтаком-то модуле «+e.Message);
end;
end;
А On здесь зачем?
> А On здесь зачем?
Иначе undeclared identifier: «e»
> YurikGL © (14.06.08 19:40) [5]
Гы. и верно ведь. позор на мои седины. :o)
> Гы. и верно ведь. позор на мои седины. :o)
Вопрос, как к мастеру. насколько корректно
raise Exception.Create(«Ошибка в разтаком-то модуле «+e.Message);
в секции except?
Я использую эту конструкцию для «вытаскивания» всей цепочки ошибок. Т.е. если одна функция вызывает другую, та — третью и т.д. выйдет весь текст ошибки по цепочке.
> YurikGL © (14.06.08 20:49) [7]
Дык. а что ж тут некорректного? Все нормально.
Совет — посмотрите в сторону Assert, бывает очень полезно. Дело в том, что сообщение EAssertionFailed содержит имя модуля и номер строки. То есть, для локализации ошибки можно использовать что-то типа этого:
on E: Exception do
Assert(false, «Ошибка » + E.ClassName + «: » + E.Message);
можно и без on, через ExceptObject
> Юрий Зотов © (14.06.08 21:37) [8]
На E.ClassName ругается, зараза.
> Германн © (15.06.08 01:23) [10]
>
>
> > Юрий Зотов © (14.06.08 21:37) [8]
>
> На E.ClassName ругается, зараза.
>
Был не прав. Не ругается и не зараза.
> Дык. а что ж тут некорректного? Все нормально.
Юрий, раньше Вы меня за такое ругали. А теперь это корректно?
Сам обычно использую такую конструкцию:
function ReCreateEObject(E: Exception; const FuncName: string): Exception;
var
S: string;
begin
S := Format(«%s -> %s», [FuncName, E.Message]);
Result := ExceptClass(E.ClassType).Create(S);
end;
try
.
except
on E: Exception do
begin
.
raise ReCreateEObject(E, «MyFunc»);
end;
end;
> Loginov Dmitry © (15.06.08 10:45) [12]
1. За такое я ругать не мог (потому что это самый обычный способ «ручного» отслеживания и ругать тут не за что). А вот за что-то, хотя внешне и похожее, но по сути другое — мог.
2. Зачем пересоздавать объект исключения, если можно просто изменить его Message?
> Loginov Dmitry © (15.06.08 10:45) [12]
> Сам обычно использую такую конструкцию:
И сейчас будем ругать.
Хотя класс исключения будет тот же, но иная
дополнительная информация будет утеряна.
Сравни
try
raise TMyException.Create(«error»);
except
on E: TMyException do
begin
E.Message := Format(«reraise %s», [E.Message]);
raise;
end;
end;
—
Regards, LVT.
для системных исключений нельзая изменить текст. Изменение текста катит только для родных дельфийский эксепшенов.
> Loginov Dmitry © (15.06.08 17:42) [15]
> Изменение текста катит только для родных дельфийский эксепшенов.
В дельфи иных исключений и нет.
> В дельфи иных исключений и нет.
procedure TForm1.Button6Click(Sender: TObject);
var
a, b: double;
begin
a := 1;
b := 0;
try
a := a / b;
floattostr(a);
except
on E: Exception do
begin
E.Message := Format(«reraise %s», [E.Message]);
raise;
end;
end;
end;
Куда reraise девается? То-то же!
> Loginov Dmitry © (15.06.08 18:05) [17]
> Куда reraise девается? То-то же!
Ну и не надо никаких on E: Exception.
Если обработчику неизвестно исключение —
он _обязан_ его пропустить.
Коды ошибок SQL для клиентских приложений базы данных SQL: ошибки подключения к базе данных и другие проблемы SQL error codes for SQL Database client applications: Database connection errors and other issues
В этой статье перечислены коды ошибок SQL для клиентского приложения базы данных SQL, включая ошибки подключения к базе данных, временные ошибки (или временные сбои), ошибки управления ресурсами, проблемы при копировании баз данных, ошибки пула эластичных БД и другие ошибки. This article lists SQL error codes for SQL Database client applications, including database connection errors, transient errors (also called transient faults), resource governance errors, database copy issues, elastic pool, and other errors. Большинство категорий относятся к базам данных SQL Azure и не применяются к Microsoft SQL Server. Most categories are particular to Azure SQL Database, and do not apply to Microsoft SQL Server. Дополнительные сведения см. в статье Системные сообщения об ошибках. See also system error messages.
Ошибки подключения к базе данных и временные ошибки Database connection errors, transient errors, and other temporary errors
В следующей таблице перечислены коды ошибок SQL для ошибок потери подключения и других временных ошибок, которые могут возникнуть, когда приложение пытается получить доступ к базе данных SQL. The following table covers the SQL error codes for connection loss errors, and other transient errors you might encounter when your application attempts to access SQL Database. Учебники по началу работы с подключением к базе данных SQL Azure доступны в разделе Подключение к базе данных SQL Azure. For getting started tutorials on how to connect to Azure SQL Database, see Connecting to Azure SQL Database.
Наиболее распространенные ошибки подключения к базе данных, а также временные сбои и ошибки Most common database connection errors and transient fault errors
Инфраструктура Azure способна динамически изменять конфигурацию серверов при высокой рабочей нагрузке на службу баз данных SQL. The Azure infrastructure has the ability to dynamically reconfigure servers when heavy workloads arise in the SQL Database service. Такое динамическое поведение может привести к разрыву подключения между клиентской программой и базой данных SQL. This dynamic behavior might cause your client program to lose its connection to SQL Database. Такое состояние называется временной ошибкой. This kind of error condition is called a transient fault.
Настоятельно рекомендуем включить в клиентской программе логику повторных попыток, чтобы программа смогла восстановить подключение после определенного периода, позволяющего временной ошибке самоустраниться. It is strongly recommended that your client program has retry logic so that it could reestablish a connection after giving the transient fault time to correct itself. Рекомендуется подождать 5 секунд, прежде чем выполнять первую повторную попытку. We recommend that you delay for 5 seconds before your first retry. Повторная попытка после ожидания менее 5 секунд может привести к перегрузке облачной службы. Retrying after a delay shorter than 5 seconds risks overwhelming the cloud service. Для каждой последующей повторной попытки ожидание должно увеличиваться экспоненциально, но не более чем до 60 секунд. For each subsequent retry the delay should grow exponentially, up to a maximum of 60 seconds.
Временные сбои обычно проявляются в виде одного из следующих сообщений об ошибке из клиентских программ: Transient fault errors typically manifest as one of the following error messages from your client programs:
Примеры кода с логикой повторных попыток см. в следующих статьях: For code examples of retry logic, see:
Обсуждение периода блокировки для клиентов, которые используют ADO.NET, см. в статье Организация пулов соединений SQL Server (ADO.NET). A discussion of the blocking period for clients that use ADO.NET is available in SQL Server Connection Pooling (ADO.NET).
Коды ошибок для временных сбоев Transient fault error codes
Ниже приведены временные ошибки, для которых в приложении следует реализовать логику повтора. The following errors are transient, and should be retried in application logic:
Код ошибки Error code | Уровень серьезности Severity | Description (Описание) Description |
---|---|---|
4060 4060 | 16 16 | Невозможно открыть базу данных %.*ls, запрашиваемую именем входа. Cannot open database «%.*ls» requested by the login. Вход в систему не выполнен. The login failed. Дополнительные сведения см. в разделе ошибки с 4000 по 4999 . For more information, see Errors 4000 to 4999 |
40197 40197 | 17 17 | При обработке вашего запроса служба обнаружила ошибку. The service has encountered an error processing your request. Повторите попытку позже. Please try again. Код ошибки: %d. Error code %d.
Эта ошибка возникает, если служба не работает по причине обновления программного или аппаратного обеспечения, аппаратных ошибок или проблем при отработке отказа. You receive this error when the service is down due to software or hardware upgrades, hardware failures, or any other failover problems. Код ошибки (% d), внедренный в сообщение об ошибке 40197 , содержит дополнительные сведения о типе сбоя или отработки отказа, которые произошли. The error code (%d) embedded within the message of error 40197 provides additional information about the kind of failure or failover that occurred. В сообщении об ошибке 40197 может быть указан код ошибки 40020, 40143, 40166 или 40540. Some examples of the error codes are embedded within the message of error 40197 are 40020, 40143, 40166, and 40540. При повторном подключении сервер Базы данных SQL автоматически подключается к рабочей копии базы данных. Reconnecting to your SQL Database server automatically connects you to a healthy copy of your database. Приложение должно зафиксировать ошибку 40197, зарегистрировать указанный в сообщении код ошибки (%d) для устранения неполадок и повторять попытки подключения к базе данных SQL, пока не появится доступ к ресурсам, а подключение не будет восстановлено. Your application must catch error 40197, log the embedded error code (%d) within the message for troubleshooting, and try reconnecting to SQL Database until the resources are available, and your connection is established again. Дополнительные сведения см. в разделе временные ошибки. For more information, see Transient errors. |
40501 40501 | 20 20 | Служба в настоящий момент занята. The service is currently busy. Повторите запрос через 10 секунд. Retry the request after 10 seconds. Идентификатор инцидента: %ls. Incident ID: %ls. Код: %d. Code: %d. Дополнительные сведения можно найти в разделе For more information, see: ограничения ресурсов сервера базы данных • • Database server resource limits • ограничения на основе DTU для отдельных баз данных • DTU-based limits for single databases • ограничения на основе DTU для эластичных пулов • DTU-based limits for elastic pools • ограничения на основе виртуальное ядро для отдельных баз данных • vCore-based limits for single databases • ограничения на основе виртуальное ядро для эластичных пулов • vCore-based limits for elastic pools • ограничения ресурсов для управляемого экземпляра . • Managed instance resource limits. |
40613 40613 | 17 17 | База данных %.*ls на сервере %.*ls в данный момент недоступна. Database ‘%.*ls’ on server ‘%.*ls’ is not currently available. Повторите попытку подключения позже. Please retry the connection later. Если проблема повторится, обратитесь в службу поддержки пользователей и сообщите идентификатор трассировки сеанса %.*ls. If the problem persists, contact customer support, and provide them the session tracing ID of ‘%.*ls’.
Эта ошибка может возникать, если уже имеется выделенное административное соединение (DAC), установленное для базы данных. This error may occur if there is already an existing dedicated administrator connection (DAC) established to the database. Дополнительные сведения см. в разделе временные ошибки. For more information, see Transient errors. |
49918 49918 | 16 16 | Не удается обработать запрос. Cannot process request. Недостаточно ресурсов для обработки запроса. Not enough resources to process request.
Служба в настоящий момент занята. The service is currently busy. Повторите запрос позже. Please retry the request later. Дополнительные сведения можно найти в разделе For more information, see: |
49919 49919 | 16 16 | Невозможно обработать запрос на создание или обновление. Cannot process create or update request. Для подписки «%ld» выполняется слишком много операций создания или обновления. Too many create or update operations in progress for subscription «%ld».
Служба занята обработкой нескольких запросов на создание или обновление для вашей подписки или сервера. The service is busy processing multiple create or update requests for your subscription or server. В данный момент запросы блокируются для оптимизации ресурсов. Requests are currently blocked for resource optimization. Выполните запрос sys.dm_operation_status для ожидающих операций. Query sys.dm_operation_status for pending operations. Подождите, пока выполнятся ожидающие запросы на создание или обновление, либо удалите один из ожидающих запросов и повторите свой запрос позже. Wait until pending create or update requests are complete or delete one of your pending requests and retry your request later. Дополнительные сведения можно найти в разделе For more information, see: |
49920 49920 | 16 16 | Не удается обработать запрос. Cannot process request. Для подписки «%ld» выполняется слишком много операций. Too many operations in progress for subscription «%ld».
Служба занята обработкой нескольких запросов для этой подписки. The service is busy processing multiple requests for this subscription. В данный момент запросы блокируются для оптимизации ресурсов. Requests are currently blocked for resource optimization. Выполните запрос sys.dm_operation_status для состояния операции. Query sys.dm_operation_status for operation status. Подождите, пока выполнятся ожидающие запросы, либо удалите один из ожидающих запросов и повторите свой запрос позже. Wait until pending requests are complete or delete one of your pending requests and retry your request later. Дополнительные сведения можно найти в разделе For more information, see: |
4221 4221 | 16 16 | Произошел сбой при входе в базу данных-получатель для чтения из-за длительного ожидания выполнения HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING. Login to read-secondary failed due to long wait on ‘HADR_DATABASE_WAIT_FOR_TRANSITION_TO_VERSIONING’. Вход в реплику невозможен, так как отсутствуют версии строк для транзакций, которые выполнялись при перезапуске реплики. The replica is not available for login because row versions are missing for transactions that were in-flight when the replica was recycled. Чтобы устранить проблему, откатите реплику или зафиксируйте активные транзакции в первичной реплике. The issue can be resolved by rolling back or committing the active transactions on the primary replica. Большинство таких случаев можно избежать, если не выполнять длительные транзакции записи в базе данных-источнике. Occurrences of this condition can be minimized by avoiding long write transactions on the primary. |
Коды внедренных ошибок Embedded error codes
Следующие ошибки внедрены в более общий код ошибки 40197: The following errors are embedded in the more general error code 40197:
Код ошибки Error code | Уровень серьезности Severity | Description (Описание) Description |
---|---|---|
1104 1104 | 17 17 | В базе данных TEMPDB закончилось место во время сброса. TEMPDB ran out of space during spilling. Создание пространства путем удаления объектов и (или) перезаписи запроса для использования меньшего количества строк. Create space by dropping objects and/or rewrite the query to consume fewer rows. Если проблема сохраняется, попробуйте обновить ее до более высокой цели уровня обслуживания. If the issue still persists, consider upgrading to a higher service level objective. |
40020 40020 | 16 16 | База данных находится в состоянии перехода, а транзакции завершаются. The database is in transition and transactions are being terminated. |
40143 40143 | 16 16 | Реплика, содержащая узел данных для запрошенной секции, не является первичной. The replica that the data node hosts for the requested partition is not primary. |
40166 40166 | 16 16 | Выполняется перенастройка CloudDB, и все новые пользовательские транзакции прерываются. A CloudDB reconfiguration is going on and all new user transactions are aborted. |
40540 40540 | 16 16 | Транзакция была прервана, так как база данных перемещена в режим «только для чтения». Transaction was aborted as database is moved to read-only mode. Это временная ситуация, и повторите операцию. This is a temporary situation and please retry the operation. |
Сведения о других внедренных ошибках можно найти с помощью запроса sys.messages . Details on other embedded errors can be found by querying sys.messages :
Ошибки копирования базы данных Database copy errors
При копировании базы данных в базе данных SQL Azure могут возникнуть следующие ошибки. The following errors can be encountered while copying a database in Azure SQL Database. Дополнительные сведения см. в статье Копирование базы данных SQL Azure. For more information, see Copy an Azure SQL Database.
Код ошибки Error code | Уровень серьезности Severity | Description (Описание) Description |
---|---|---|
40635 40635 | 16 16 | Клиент с IP-адресом %.*ls временно отключен. Client with IP address ‘%.*ls’ is temporarily disabled. |
40637 40637 | 16 16 | Возможность создания копии базы данных в настоящее время отключена. Create database copy is currently disabled. |
40561 40561 | 16 16 | Не удалось скопировать базу данных. Database copy failed. Исходная или целевая база данных не существует. Either the source or target database does not exist. |
40562 40562 | 16 16 | Не удалось скопировать базу данных. Database copy failed. Исходная база данных удалена. The source database has been dropped. |
40563 40563 | 16 16 | Не удалось скопировать базу данных. Database copy failed. Целевая база данных удалена. The target database has been dropped. |
40564 40564 | 16 16 | Произошел сбой при копировании базы данных из-за внутренней ошибки. Database copy failed due to an internal error. Удалите целевую базу данных и повторите попытку. Please drop target database and try again. |
40565 40565 | 16 16 | Не удалось скопировать базу данных. Database copy failed. Допускается не более одной одновременной операции копирования базы данных из одного источника. No more than 1 concurrent database copy from the same source is allowed. Удалите целевую базу данных и повторите попытку позднее. Please drop target database and try again later. |
40566 40566 | 16 16 | Произошел сбой при копировании базы данных из-за внутренней ошибки. Database copy failed due to an internal error. Удалите целевую базу данных и повторите попытку. Please drop target database and try again. |
40567 40567 | 16 16 | Произошел сбой при копировании базы данных из-за внутренней ошибки. Database copy failed due to an internal error. Удалите целевую базу данных и повторите попытку. Please drop target database and try again. |
40568 40568 | 16 16 | Не удалось скопировать базу данных. Database copy failed. Исходная база данных стала недоступна. Source database has become unavailable. Удалите целевую базу данных и повторите попытку. Please drop target database and try again. |
40569 40569 | 16 16 | Не удалось скопировать базу данных. Database copy failed. Целевая база данных стала недоступна. Target database has become unavailable. Удалите целевую базу данных и повторите попытку. Please drop target database and try again. |
40570 40570 | 16 16 | Произошел сбой при копировании базы данных из-за внутренней ошибки. Database copy failed due to an internal error. Удалите целевую базу данных и повторите попытку позднее. Please drop target database and try again later. |
40571 40571 | 16 16 | Произошел сбой при копировании базы данных из-за внутренней ошибки. Database copy failed due to an internal error. Удалите целевую базу данных и повторите попытку позднее. Please drop target database and try again later. |
Ошибки управления ресурсами Resource governance errors
Ниже представлены ошибки, возникающие из-за чрезмерного использования ресурсов при работе с базой данных SQL Azure. The following errors are caused by excessive use of resources while working with Azure SQL Database. Например: For example:
- транзакция остается открытой слишком долго; A transaction has been open for too long.
- транзакция содержит слишком много блокировок; A transaction is holding too many locks.
- приложение использует слишком много памяти; An application is consuming too much memory.
- приложение использует слишком много пространства TempDb . An application is consuming too much TempDb space.
Связанные разделы: Related topics:
- Дополнительные сведения можно найти в разделе For more information, see:
- Ограничения ресурсов сервера базы данных Database server resource limits
- Ограничения на основе DTU для отдельных баз данных DTU-based limits for single databases
- Ограничения на основе DTU для эластичных пулов DTU-based limits for elastic pools
- ограничения на основе виртуальное ядро для отдельных баз данных vCore-based limits for single databases
- ограничения для эластичных пулов на основе виртуальное ядро vCore-based limits for elastic pools
- Ограничения ресурсов управляемых экземпляров. Managed instance resource limits.
Код ошибки Error code | Уровень серьезности Severity | Description (Описание) Description |
---|---|---|
10928 10928 | 20 20 | Идентификатор ресурса: %d. Resource ID: %d. Предел %s для базы данных составляет %d, и он достигнут. The %s limit for the database is %d and has been reached. Дополнительные сведения см. в статье Ограничения ресурсов Базы данных SQL для отдельных баз данных и баз данных в пуле. For more information, see SQL Database resource limits for single and pooled databases.
Идентификатор ресурса указывает на ресурс, предел которого был достигнут. The Resource ID indicates the resource that has reached the limit. Для рабочих потоков идентификатор ресурса = 1. For worker threads, the Resource > Для сеансов идентификатор ресурса — 2. For sessions, the Resource > Дополнительные сведения об этой ошибке и способах ее устранения см. в статье: For more information about this error and how to resolve it, see: |
10929 10929 | 20 20 | Идентификатор ресурса: %d. Resource ID: %d. Минимальная гарантия %s составляет %d, максимальное значение равно %d, а текущее использование для базы данных — %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. Тем не менее, в настоящее время сервер слишком занят, чтобы обработать более чем %d запросов для этой базы данных. However, the server is currently too busy to support requests greater than %d for this database. Идентификатор ресурса указывает на ресурс, предел которого был достигнут. The Resource ID indicates the resource that has reached the limit. Для рабочих потоков идентификатор ресурса = 1. For worker threads, the Resource > Для сеансов идентификатор ресурса — 2. For sessions, the Resource > Дополнительные сведения можно найти в разделе For more information, see: ограничения ресурсов сервера базы данных • • Database server resource limits • ограничения на основе DTU для отдельных баз данных • DTU-based limits for single databases • ограничения на основе DTU для эластичных пулов • DTU-based limits for elastic pools • ограничения на основе виртуальное ядро для отдельных баз данных • vCore-based limits for single databases • ограничения на основе виртуальное ядро для эластичных пулов • vCore-based limits for elastic pools • ограничения ресурсов для управляемого экземпляра . • Managed instance resource limits. В противном случае повторите попытку позже. Otherwise, please try again later. |
40544 40544 | 20 20 | База данных достигла предельного размера. The database has reached its size quota. Секционируйте или удалите данные, удалите индексы или попробуйте найти возможное решение в документации. Partition or delete data, drop indexes, or consult the documentation for possible resolutions. Сведения об масштабировании базы данных см. в статье масштабирование ресурсов отдельной базы данных и масштабирование ресурса эластичного пула. For database scaling, see Scale single database resources and Scale elastic pool resources. |
40549 40549 | 16 16 | Сеанс остановлен из-за наличия транзакции с длительным временем выполнения. Session is terminated because you have a long-running transaction. Попробуйте сократить время выполнения транзакции. Try shortening your transaction. Сведения о пакетировании см. в разделе Использование пакетной обработки для повышения производительности приложения базы данных SQL. For information on batching, see How to use batching to improve SQL Database application performance. |
40550 40550 | 16 16 | Сеанс остановлен, поскольку он использует слишком много блокировок. The session has been terminated because it has acquired too many locks. Попробуйте сократить количество читаемых или изменяемых строк в одной транзакции. Try reading or modifying fewer rows in a single transaction. Сведения о пакетировании см. в разделе Использование пакетной обработки для повышения производительности приложения базы данных SQL. For information on batching, see How to use batching to improve SQL Database application performance. |
40551 40551 | 16 16 | Сеанс остановлен из-за чрезмерного использования TEMPDB . The session has been terminated because of excessive TEMPDB usage. Попробуйте изменить запрос, чтобы сократить использование временного табличного пространства. Try modifying your query to reduce the temporary table space usage.
Если вы используете временные объекты, то для экономии места в базе данных TEMPDB удаляйте их сразу после того, как в них исчезнет необходимость. If you are using temporary objects, conserve space in the TEMPDB database by dropping temporary objects after they are no longer needed by the session. Дополнительные сведения об использовании tempdb в базе данных SQL см. в разделе база данных tempdb в базе данных SQL. For more information on tempdb usage in SQL Database, see Tempdb database in SQL Database. |
40552 40552 | 16 16 | Сеанс остановлен из-за чрезмерного использования места для журналов транзакций. The session has been terminated because of excessive transaction log space usage. Попробуйте сократить количество изменяемых строк в одной транзакции. Try modifying fewer rows in a single transaction. Сведения о пакетировании см. в разделе Использование пакетной обработки для повышения производительности приложения базы данных SQL. For information on batching, see How to use batching to improve SQL Database application performance.
В случае выполнения массовых вставок с использованием служебной программы bcp.exe или класса System.Data.SqlClient.SqlBulkCopy попробуйте ограничить количество строк, копируемых на сервер при каждой транзакции, с помощью параметра -b batchsize или BatchSize . If you perform bulk inserts using the bcp.exe utility or the System.Data.SqlClient.SqlBulkCopy class, try using the -b batchsize or BatchSize options to limit the number of rows copied to the server in each transaction. В случае перестройки индекса с помощью оператора ALTER INDEX попробуйте использовать параметр REBUILD WITH ONLINE = ON . If you are rebuilding an index with the ALTER INDEX statement, try using the REBUILD WITH ONLINE = ON option. Сведения о размерах журналов транзакций для модели приобретения Виртуальное ядро см. в следующих статьях: For information on transaction log sizes for the vCore purchasing model, see: |
40553 40553 | 16 16 | Сеанс остановлен из-за чрезмерного потребления памяти. The session has been terminated because of excessive memory usage. Попробуйте изменить запрос и задать обработку меньшего числа строк. Try modifying your query to process fewer rows.
Сокращение количества операций ORDER BY и GROUP BY в коде Transact-SQL позволяет уменьшить потребление памяти при выполнении запроса. Reducing the number of ORDER BY and GROUP BY operations in your Transact-SQL code reduces the memory requirements of your query. Сведения об масштабировании базы данных см. в статье масштабирование ресурсов отдельной базы данных и масштабирование ресурса эластичного пула. For database scaling, see Scale single database resources and Scale elastic pool resources. |
Ошибки пула эластичных БД Elastic pool errors
Приведенные ниже ошибки связаны с созданием и использованием эластичных пулов. The following errors are related to creating and using elastic pools:
Код ошибки Error code | Уровень серьезности Severity | Description (Описание) Description | Корректирующее действие Corrective action |
---|---|---|---|
1132 1132 | 17 17 | Хранилище эластичного пула достигло своего предельного значения. The elastic pool has reached its storage limit. Уровень использования хранилища для эластичного пула не может превышать (%d) МБ. The storage usage for the elastic pool cannot exceed (%d) MBs. Попытка записи данных в базу данных, когда было достигнуто предельное значение хранилища эластичного пула. Attempting to write data to a database when the storage limit of the elastic pool has been reached. Сведения об ограничениях ресурсов см. в следующих статьях: For information on resource limits, see: • ограничения на основе DTU для эластичных пулов • DTU-based limits for elastic pools • ограничения на основе виртуальное ядро для эластичных пулов. • vCore-based limits for elastic pools. |
Если это возможно, попробуйте увеличить DTU эластичного пула и (или) добавить в него пространство хранения для увеличения предельного размера его хранилища, сократить объем памяти, используемой отдельными базами данных в эластичном пуле, или удалить базы данных из пула. Consider increasing the DTUs of and/or adding storage to the elastic pool if possible in order to increase its storage limit, reduce the storage used by individual databases within the elastic pool, or remove databases from the elastic pool. Сведения о масштабировании эластичных пулов см. в статье масштабирование ресурсов эластичного пула. For elastic pool scaling, see Scale elastic pool resources. |
10929 10929 | 16 16 | Минимальная гарантия %s составляет %d, максимальное значение равно %d, а текущее использование для базы данных — %d. The %s minimum guarantee is %d, maximum limit is %d, and the current usage for the database is %d. Тем не менее, в настоящее время сервер слишком занят, чтобы обработать более чем %d запросов для этой базы данных. However, the server is currently too busy to support requests greater than %d for this database. Сведения об ограничениях ресурсов см. в следующих статьях: For information on resource limits, see: • ограничения на основе DTU для эластичных пулов • DTU-based limits for elastic pools • ограничения на основе виртуальное ядро для эластичных пулов. • vCore-based limits for elastic pools. В противном случае повторите попытку позже. Otherwise, please try again later. Минимальное количество DTU или виртуальных ядер на базу данных; максимальное количество DTU или виртуальных ядер на базу данных. DTU / vCore min per database; DTU / vCore max per database. Общее количество одновременных работников (запросов) по всем базам данных в эластичном пуле превысило ограничение пула. The total number of concurrent workers (requests) across all databases in the elastic pool attempted to exceed the pool limit. |
Если это возможно, попробуйте увеличить DTU или число виртуальных ядер эластичного пула для увеличения предельно допустимого количества работников или удалить базы данных из эластичного пула. Consider increasing the DTUs or vCores of the elastic pool if possible in order to increase its worker limit, or remove databases from the elastic pool. |
40844 40844 | 16 16 | База данных ‘%ls’ на сервере ‘%ls’ является базой данных выпуска ‘%ls’ в эластичном пуле и не может иметь связь непрерывной копии. Database ‘%ls’ on Server ‘%ls’ is a ‘%ls’ edition database in an elastic pool and cannot have a continuous copy relationship. | Недоступно N/A |
40857 40857 | 16 16 | Эластичный пул для сервера ‘%ls’ не найден, имя эластичного пула: ‘%ls’. Elastic pool not found for server: ‘%ls’, elastic pool name: ‘%ls’. На указанном сервере указанный эластичный пул не существует. Specified elastic pool does not exist in the specified server. | Укажите допустимое имя эластичного пула. Provide a valid elastic pool name. |
40858 40858 | 16 16 | Эластичный пул «%ls» на сервере «%ls» уже существует. Elastic pool ‘%ls’ already exists in server: ‘%ls’. Указанный эластичный пул уже существует на указанном сервере Базы данных SQL. Specified elastic pool already exists in the specified SQL Database server. | Укажите новое имя эластичного пула. Provide new elastic pool name. |
40859 40859 | 16 16 | Эластичный пул не поддерживает уровень служб ‘%ls’. Elastic pool does not support service tier ‘%ls’. Для подготовки эластичного пула указанный уровень служб не поддерживается. Specified service tier is not supported for elastic pool provisioning. | Укажите правильный выпуск или оставьте значение уровня служб пустым, чтобы использовать значение по умолчанию. Provide the correct edition or leave service tier blank to use the default service tier. |
40860 40860 | 16 16 | Недопустимая комбинация эластичного пула ‘%ls’ и цели службы ‘%ls’. Elastic pool ‘%ls’ and service objective ‘%ls’ combination is invalid. Эластичный пул и уровень служб можно указать вместе только в том случае, если тип ресурса задан как ElasticPool. Elastic pool and service tier can be specified together only if resource type is specified as ‘ElasticPool’. | Укажите правильную комбинацию эластичного пула и уровня служб. Specify correct combination of elastic pool and service tier. |
40861 40861 | 16 16 | Выпуск «%.ls» базы данных не может отличаться от уровня служб пула эластичных БД, который равен «%. ls». The database edition ‘%.ls’ cannot be different than the elastic pool service tier which is ‘%. ls’. Выпуск базы данных отличается от уровня служб эластичного пула. The database edition is different than the elastic pool service tier. | Не указывайте выпуск базы данных, который отличается от уровня служб эластичного пула. Do not specify a database edition which is different than the elastic pool service tier. Обратите внимание, что выпуск базы данных указывать не требуется. Note that the database edition does not need to be specified. |
40862 40862 | 16 16 | Если указана цель служб эластичного пула, то необходимо указать имя этого эластичного пула. Elastic pool name must be specified if the elastic pool service objective is specified. Цель службы эластичного пула неоднозначно определяет эластичный пул. Elastic pool service objective does not uniquely identify an elastic pool. | Если используется цель служб эластичного пула, укажите имя этого эластичного пула. Specify the elastic pool name if using the elastic pool service objective. |
40864 40864 | 16 16 | Число DTU для эластичного пула должно составлять по крайней мере (%d) DTU для уровня служб «%.*ls». The DTUs for the elastic pool must be at least (%d) DTUs for service tier ‘%.*ls’. Попытка задать для эластичного пула DTU, значение которого ниже минимального ограничения. Attempting to set the DTUs for the elastic pool below the minimum limit. | Повторите попытку, установив для эластичного пула DTU, значение которого хотя бы равно минимальному ограничению. Retry setting the DTUs for the elastic pool to at least the minimum limit. |
40865 40865 | 16 16 | Число DTU для эластичного пула не должно превышать (%d) DTU для уровня служб «%.*ls». The DTUs for the elastic pool cannot exceed (%d) DTUs for service tier ‘%.*ls’. Попытка задать для эластичного пула DTU, значение которого выше максимального ограничения. Attempting to set the DTUs for the elastic pool above the maximum limit. | Повторите попытку, установив для эластичного пула DTU, значение которого не превышает максимальное ограничение. Retry setting the DTUs for the elastic pool to no greater than the maximum limit. |
40867 40867 | 16 16 | Максимальное количество DTU на каждую базу данных должно составлять как минимум (%d) для уровня служб «%.*ls». The DTU max per database must be at least (%d) for service tier ‘%.*ls’. Попытка задать максимальное количество DTU на каждую базу данных ниже поддерживаемого ограничения. Attempting to set the DTU max per database below the supported limit. | Попробуйте использовать уровень служб эластичного пула, который поддерживает желаемый параметр. Consider using the elastic pool service tier that supports the desired setting. |
40868 40868 | 16 16 | Максимальное количество DTU на каждую базу данных не должно превышать (%d) для уровня служб «%.*ls». The DTU max per database cannot exceed (%d) for service tier ‘%.*ls’. Попытка задать максимальное число DTU на каждую базу данных, которое находится за пределами поддерживаемого ограничения. Attempting to set the DTU max per database beyond the supported limit. | Попробуйте использовать уровень служб эластичного пула, который поддерживает желаемый параметр. Consider using the elastic pool service tier that supports the desired setting. |
40870 40870 | 16 16 | Минимальное количество DTU на каждую базу данных не должно превышать (%d) для уровня служб «%.*ls». The DTU min per database cannot exceed (%d) for service tier ‘%.*ls’. Попытка задать минимальное число DTU на каждую базу, которое находится за пределами поддерживаемого ограничения. Attempting to set the DTU min per database beyond the supported limit. | Попробуйте использовать уровень служб эластичного пула, который поддерживает желаемый параметр. Consider using the elastic pool service tier that supports the desired setting. |
40873 40873 | 16 16 | Количество баз данных (%d) и минимальное количество DTU на каждую базу данных (%d) не может превышать DTU эластичного пула (%d). The number of databases (%d) and DTU min per database (%d) cannot exceed the DTUs of the elastic pool (%d). Попытка задать минимальное количество DTU для баз данных в эластичном пуле, превышающее DTU эластичного пула. Attempting to specify DTU min for databases in the elastic pool that exceeds the DTUs of the elastic pool. | Попробуйте увеличить количество DTU эластичного пула, уменьшить минимальное количество DTU на каждую базу данных или уменьшить количество баз данных в эластичном пуле. Consider increasing the DTUs of the elastic pool, or decrease the DTU min per database, or decrease the number of databases in the elastic pool. |
40877 40877 | 16 16 | Эластичный пул не может быть удален до тех пор, пока он содержит какую-либо базу данных. An elastic pool cannot be deleted unless it does not contain any databases. Эластичный пул содержит одну или несколько баз данных и не может быть удален. The elastic pool contains one or more databases and therefore cannot be deleted. | Чтобы удалить эластичный пул, удалите из него базы данных. Remove databases from the elastic pool in order to delete it. |
40881 40881 | 16 16 | В эластичном пуле ‘%.*ls’ достигнуто предельное количество баз данных. The elastic pool ‘%.*ls’ has reached its database count limit. Максимальное количество баз данных для пула эластичных баз данных не может превышать (%d) для пула эластичных баз данных с (%d) DTU. The database count limit for the elastic pool cannot exceed (%d) for an elastic pool with (%d) DTUs. Попытка создания или добавления базы данных в эластичный пул, когда было достигнуто предельное количество баз данных эластичного пула. Attempting to create or add database to elastic pool when the database count limit of the elastic pool has been reached. | Если это возможно, попробуйте увеличить DTU эластичного пула, чтобы увеличить предельное количество баз данных, или удалить базы данных из эластичного пула. Consider increasing the DTUs of the elastic pool if possible in order to increase its database limit, or remove databases from the elastic pool. |
40889 40889 | 16 16 | Невозможно уменьшить количество DTU или размер хранилища для эластичного пула ‘%.*ls’, так как недостаточно места в хранилище баз данных. The DTUs or storage limit for the elastic pool ‘%.*ls’ cannot be decreased since that would not provide sufficient storage space for its databases. Попытка ограничить размер хранилища эластичного пула, при которой уменьшается размер используемого им хранилища. Attempting to decrease the storage limit of the elastic pool below its storage usage. | Попробуйте сократить использование хранилища отдельными базами данных в эластичном пуле или удалить базы данных из пула, чтобы уменьшить количество DTU или размер хранилища. Consider reducing the storage usage of individual databases in the elastic pool or remove databases from the pool in order to reduce its DTUs or storage limit. |
40891 40891 | 16 16 | Минимальное число DTU на базу данных (%d) не может превышать максимального числа DTU на базу данных (%d). The DTU min per database (%d) cannot exceed the DTU max per database (%d). Попытка задать минимальное число DTU на каждую базу данных, превышающее максимальное число DTU на каждую базу данных. Attempting to set the DTU min per database higher than the DTU max per database. | Убедитесь, что минимальное число DTU на базу данных не превышает максимального числа DTU на базу данных. Ensure the DTU min per databases does not exceed the DTU max per database. |
ПОДЛЕЖИТ УТОЧНЕНИЮ TBD | 16 16 | Размер хранилища для отдельной базы данных в эластичном пуле не может превышать максимальный размер, допустимый уровнем служб эластичного пула «%.*ls». The storage size for an individual database in an elastic pool cannot exceed the max size allowed by ‘%.*ls’ service tier elastic pool. Максимальный размер базы данных превышает максимальный размер, допустимый уровнем служб эластичного пула. The max size for the database exceeds the max size allowed by the elastic pool service tier. | Укажите максимальный размер базы данных, который находится в пределах ограничений на максимальный размер, допустимый уровнем служб эластичного пула. Set the max size of the database within the limits of the max size allowed by the elastic pool service tier. |
Связанные разделы: Related topics:
Общие ошибки General errors
Приведенные ниже ошибки не входят ни в одну из предыдущих категорий. The following errors do not fall into any previous categories.
Расширенные возможности языка хранимых процедур InterBase
Расширенные возможности языка хранимых процедур InterBase
Эта глава посвящена тем возможностям языка хранимых процед>р InteiBase, которые позволяют эффективно реализовывать бизнес-логику на уровне базы данных и разрабатывать устойчивые и высокопроизводительные приложения баз данных
Обработка исключений и ошибок
Первой из рассматриваемых особенностей языка хранимых процедур (ХП) и триггеров InterBase является возможность использовать «исктючения»
Исключения InterBase во многом похожи на исключения других языков высокого уровня, однако имеют свои особенности Фактически исключение InterBase — это сообщение об ошибке, которое имеет собственное, задаваемое программистом имя и текст сообщения об ошибке. Создается исключение следующим образом:
Например, мы можем создать исключение такого вида:
CREATE EXCEPTION test_except ‘Test exception’;
Исключение легко удалить или изменить — удаление совершается командой DROP EXCEPTION , а изменение — ALTER EXCEPTION
Чтобы использовать исключение в хранимой процедуре или триггере, необходимо воспользоваться командой следующего вида:
Давайте рассмотрим применение исключений на простом примере хранимой процедуры, выполняющей деление одного числа на другое и возвращающей результат Нам необходимо отследить случай деления на нуль и возбудить исключение, если делитель равен нулю.
Для нашего примера создадим следующее исключение:
CREATE EXCEPTION zero_divide ‘Cannot divide by zero!’;
Создадим хранимую процедуру, использующую это исключение:
CREATE PROCEDURE SP_DIVIDE (
DELIMOE DOUBLE PRECISION,
DELITEL DOUBLE PRECISION)
RETURNS (
RESULT DOUBLE PRECISION)
AS
BEGIN
if (Delitel
BEGIN
EXCEPTION zero_divide;
Result=0;
END
ELSE
BEGIN
Result=Delimoe/Delitel;
END
SUSPEND;
END
Как видите, текст ХП тривиален — на входе получаем Delitel и Delimoe, затем сравниваем Delitel с 0.0000001, т. е. фактически с нулем, в пределах выбранной погрешности в одну десятимиллионную (так как вещественные числа невозможно непосредственно сравнивать из-за погрешностей в дробной части). Если Delitel близок к нулю в пределах выбранной погрешности, то мы возбуждаем исключение zero_divide. Что же происходит в случае возникновения исключения? Если мы попробуем вызвать исключение, выполняя процедуру SP_divide с нулевым делителем в isql. то получим следующее
SQL> select * from sp_divide(300,0);
RESULT
==========
Statement failed, SQLCODE = -836
exception 1
-Cannot divide by zero!
Если мы вызовем эту ХП с нулевым делителем в каком-либо другом приложении, то скорее всего получим сообщение об ошибке следующего вида:
Рис 1.4. Сообщение о возникновении исключения
Другими словами, сообщение об ошибке — это результат обработки нашего исключения сервером InterBase. Когда InterBase обнаруживает возникшее в ХП или триггере исключение он прерывает работу этой хранимой процедуры и откатывает все изменения, сделанные в текущем блоке BEGIN END, причем если ХП является процедурой-выборкой, то отменяются действия лишь до последнего оператора SUSPEND.
Это значит, что если в процедуре-выборке есть цикл, в котором производятся какие-то действия, и в теле цикла есть SUSPEND, то при возбуждении исключения О1меня1ся все дейс1вия, выполненные в этом цикле до последнего оператора SUSPEND.
Надо сказать, что в исключениях было бы мало пользы, если бы у разработчика СУБД не было возможности обработать их на уровне базы данных. Чтобы разработчик смог обработать возникшее исключение, применяется следующая конструкция языка XП и триггеров:
WHEN EXCEPTION DO
BEGIN
/*обработка исключения*/
END
Использование этой конструкции помогает избежать возвращения стандартной ошибки с текстом исключения и произвести собственные действия по обработке исключения.
Когда возбуждается исключение, происходит следующее: выполнение хранимой процедуры (или триггера) прерывается. InterBase начинает искать конструкцию WHEN EXCEPTION. DO для обработки возникшего исключения в текущем блоке BEGIN. END. Если не находит, то поднимается на уровень выше (выше в том смысле, если имеются вложенные блоки BEGIN. END или когда одна ХП вызвана из другой) и ищет обработчик исключения там и т. д., пока либо не найдет подходящий обработчик исключения, либо не закончится вложенность уровней хранимой процедуры. Если обработчик исключения так и не был найден, то возвращается стандартное сообщение об ошибке, включающее текст исключения. Если обработчик найден, то выполняются действия в его блоке BEGIN. END и управление передается на первый оператор, следующий за END обработчика.
Давайте рассмотрим пример обработки исключения, возбуждаемого в нашей процедуре SP_DIVIDE. Предположим, что мы имеем некоторую внешнюю процедуру SP_divide_all, вызывающую SPJDFVIDE для того, чтобы поделить два числа. Конечно, пример сильно утрирован, но он позволяет пояснить способ и смысл использования исключений.
Итак, вот текст нашей хранимой процедуры:
CREATE PROCEDURE sp_test_except(Delltel DOUBLE PRECISION)
RETURNS (rslt DOUBLE PRECISION, status VARCHAR(SO))
AS
BEGIN
Status=’Everything is Ok’;
SELECT result FROM sp_divide(12,:Delitel) INTO :rslt;
SUSPEND;
WHEN EXCEPTION Zero_divide DO
BEGIN
Status=’zero value found!’;
rslt=-l;
SUSPEND;
END
END
Эта процедура вызывает процедуру SP_DIVIDE. Если параметр Delitel не равен нулю, то процедура SP_DIVIDE выполняется без проблем и в возвращаемое значение rslt помещается частное от деления, а статусная переменная status принимает значение ‘Everything is Ok’. В случае, если возникла исключительная ситуация деления на нуль, то результирующая переменная rslt будет равна -1, а в переменной status будет содержаться сообщение об ошибке — ‘zero value found!’. Разумеется, в обработчике исключения можно произвести и более сложную обработку, например записать некорректные данные в особую таблицу или попытаться изменить данные для выполнения операции и вновь попробовать ее выполнить и т. д.
Обработка ошибок SQL и InterBase
Разобравшись с обработкой исключений, определяемых пользователем, можем перейти к обработке ошибок InterBase. Ошибка — это фактически то же самое исключение, только возбуждаемое InterBase. Принцип обработки ошибок тот же самый что и исключений: если возникает какая-то ошибка, то сервер ищет ее обработчик, последовательно просматривая все уровни вложенности (если они есть) хранимой процедуры, начиная с того уровня, на котором возникла ошибка.
Если обработчик найден, то выполняется код внутри его, а затем управление передается на первый оператор за обработчиком исключений.
Конструкция, с помощью которой производится обработка ошибок, такая же, как и для обработки исключений, только вместо EXCEPTION стоит либо GDSCODE, либо SQLCODE:
WHEN GDSCODE SQLCODE DO
BEGIN
/*обрабатываем ошибку*/
END
В зависимости от того, стоит ли в конструкции обработки ошибок GDSCODE или SQLCODE, обрабатываются различные ошибки. Если стоит SQLCODE, то обрабатываются ошибки SQL, а если GDSCODE — то ошибки InterBase. Примером ошибки SQL является ошибка с SQLCODE=-802 «Arithmetic exception, numeric overflow, or string truncation» или SQLCODE=-817 «Attempted update during read-only transaction» Список ошибок SQL и соответствующих им значений SQLCODE приведен в таблице «SQLCODE codes and messages’. Примером ошибки InterBase является ошибка isc_bad_dbkey 335544322L «invalid database key».
Таким образом, внутри хранимой процедуры можно «перехватить» практически любую ошибку и корректно на нее отреагировать. Можно перечислять обработчики ошибок один за другим, чтобы определить реакцию на разные ошибки.
А что делать, если нужно прореагировать на любую ошибку? Не прописывать же обработчики всех сотен возможных ошибок? Конечно же, нет. Для того чтобы написать безусловный обработчик, реагирующий на любую ошибку — SQL, InterBase или исключение, следует воспользоваться конструкцией WHEN DO с ключевым словом ANY:
WHEN ANY DO
BEGIN
/*действия при любой нестандартной операции ошибке
или исключении */
END
С помощью использования описанных механизмов можно предусмотреть развитые механизмы обработки ошибок, которые сделают приложения баз данных значительно более устойчивыми.
Работа с массивами в хранимых процедурах
Массивы, как было сказано в главе «Типы данных», позволяют хранить в одном поле набор данных какого-нибудь одного элементарного типа. Однако «простым» SQL-запросом данные не извлечь и не изменить. Необходим особый пеиход для раосмы с массивами InteiBase в клиешских приложениях — см paздел «Поддержка array-полей в FIBPIus» в главе (ч 2) и «Разработка клиентских приложений СУБД InterBase с использованием технологии Microsoft OLE DB» (ч. 3). К тому же не все библиотеки доступа поддерживают работу с массивами.
Хранимые процедуры позволяют легко просматривать данные из массивов. Они используют простой и очевидный синтаксис для обращения к элементам массива. Например, пусть у нас будет таблица, содержащая поле типа массив целых чисел:
CREATE TABLE table_array(
ID_table INTEGER,
Arrayl INTEGER[3,2]);
Теперь можно продемонстрировать, как можно просмотреть данные из этого массива. Для этого внутри хранимой процедуры применяется конструкция вида
SELECT Arrayl[:i, :j] FROM table_array INTO :ElemValue;
Давайте оформим механизм доступа к массиву в виде следующей хранимой процедуры:
CREATE PROCEDURE SelectFromArr(ID_row INTEGER,
x INTEGER, у INTEGER, vl integer)
Returns (ElemValue INTEGER)
AS
BEGIN
SELECT arrayl[:x,:y]
FROM table_array
WHERE >
INTO :ElemValue;
SUSPEND;
END
Как видите, текст ХП очевиден — просто извлекаем нужные значения из элемента массива с заданными индексами х и у в строке таблицы table_array с идентификатором >
В этой главе был рассмотрен ряд дополнительных возможностей языка хранимых процедур (и триггеров) СУБД InterBase. Использование описанных конструкций языка позволит разрабатывать более развитые и надежные хранимые процедуры, а значит, более быстрые и надежные приложения баз данных.