В общем, обработка ошибок базы данных аналогична обработке других ошибок времени выполнения. Необходимо написать код, готовый к возникновению ошибок, и реагировать на ошибки, а не предоставлять это дело среде выполнения. В общем, возможные ошибки базы данных можно разделить на три категории: ошибки подключения, ошибки синтаксиса SQL и ошибки ограничений.
Ошибки подключения
Большинство ошибок базы данных — это ошибки подключения, которые могут возникнуть во время любой операции. Хотя существуют стратегии для предотвращения возникновения ошибок подключения, вряд ли существует простой способ без последствий восстановить работу после ошибки подключения, если база данных является важной частью приложения.
Большинство ошибок подключения относятся к взаимодействию среды выполнения с операционной системой, файловой системой и файлом базы данных. Например, ошибка подключения возникает, если у пользователя отсутствуют полномочия для создания файла базы данных в определенном местоположении файловой системы. Следующие стратегии помогают избежать ошибок подключения:
-
Используйте файлы баз данных для конкретных пользователей.
-
Вместо использования одного файла базы данных для всех пользователей приложения на одном компьютере предоставьте каждому пользователю свой файл базы данных. Файл должен находиться в каталоге, связанном с учетной записью пользователя. Например, это может быть каталог хранилища приложения, папка документов пользователя, рабочий стол пользователя и т. д.
-
Учитывайте различные типы пользователей.
-
Проверьте работу приложения с различными типами учетных записей пользователя и в различных операционных системах. Не предполагайте, что пользователь имеет права администратора для доступа к компьютеру. Также не предполагайте, что тот, кто установил приложение, является пользователем, выполняющим приложение.
-
Учитывайте различные местоположения файлов.
-
Если разрешить пользователю указывать место сохранения файла базы данных или открывать файл по выбору, продумайте возможные местоположения файлов. Кроме того, продумайте ограничения для мест, куда пользователи могут сохранять файлы баз данных (или откуда они могут их открывать). Например, можно разрешить пользователям открывать только те файлы, которые находятся в пределах хранилищ их учетных записей.
Если возникает ошибка подключения, скорее всего это связано с первой попыткой создать или открыть базу данных. Это значит, что пользователь не может выполнять в приложении никакие операции, связанные с базой данных. Единственным методом устранения ошибок, связанных с режимом «только для чтения» или с недостаточными полномочиями, является копирование файла базы данных в другое местоположение. Приложение может копировать файл базы данных в другое местоположение, которое позволяет пользователю создавать файлы и выполнять запись в них.
Синтаксические ошибки
Синтаксическая ошибка возникает при неправильном построении инструкции SQL и попытке приложения выполнить эту инструкцию. Поскольку инструкции SQL локальной базы данных представляют собой строки, проверка синтаксиса SQL во время компиляции невозможна. Синтаксис инструкций SQL можно проверить, только выполнив их. Используйте следующие стратегии для предотвращения возникновения ошибок синтаксиса SQL:
-
Тщательно тестируйте все инструкции SQL
-
По возможности во время разработки приложения тестируйте каждую инструкцию SQL отдельно перед их вставкой в качестве текста инструкции в код приложения. Кроме того, создайте набор тестов для проверки любых возможных вариаций кода.
-
Используйте параметры инструкций и избегайте вставки (динамической генерации) SQL
-
Использование параметров вместо динамически создаваемых инструкций SQL означает, что при каждом выполнении инструкции SQL используется один и тот же текст инструкции. Это значительно облегчает тестирование инструкций и ограничивает возможные вариации. Если необходимо динамическое создание инструкций SQL, сократите до минимума динамические части инструкции. Кроме того, тщательно проверяйте введенные пользователем данные во избежание синтаксических ошибок.
Для устранения синтаксической ошибки приложение должно иметь сложную логику для проверки инструкции SQL и исправления ее синтаксиса. Следуя вышеназванным рекомендациям по предотвращению синтаксических ошибок, код может обнаружить любой потенциальный источник ошибок синтаксиса SQL (например, ввод данных пользователем в инструкцию). Предоставьте пользователям рекомендации по устранению синтаксических ошибок. Укажите на места, которые нужно исправить, для правильного выполнения инструкции.
Ошибки ограничений
Ошибки ограничений возникают при попытке инструкции
INSERT
или
UPDATE
добавить данные в столбец. Ошибка возникает, если новые данные нарушают одно из установленных для таблицы или столбца ограничений. К возможным ограничениям относятся следующие:
-
Ограничение unique
-
Указывает на запрет использования одинаковых значений в одном столбце для всех строк таблицы. Если для нескольких столбцов установлено ограничение уникальности, то в этих столбцах не должно встречаться повторяющееся сочетание значений. Другими словами, в рамках указанного уникального столбца или нескольких уникальных столбцов каждая строка должна отличаться от другой.
-
Ограничение primary key
-
В отношении данных, которые разрешены или запрещены ограничением, ограничение primary key аналогично ограничению unique.
-
Ограничение not null
-
Указывает на то, что отдельный столбец не может содержать значение
NULL
и, следовательно, в каждой строке этого столбца должно быть значение.
-
Ограничение check
-
Позволяет задать произвольное ограничение для одной или нескольких таблиц. Типичным ограничением check является правило, согласно которому значение столбца должно находиться в определенных пределах (например, числовое значение столбца должно быть больше 0). Другим часто использующимся типом ограничения check является указание отношений между значениями столбцов (например, значение столбца должно отличаться от значения другого столбца той же строки).
-
Ограничение data type (родственности столбцов)
-
Среда выполнения определяет тип данных для значений столбцов, и при попытке сохранить в столбце значение неверного типа возникает ошибка. Однако во многих случаях значения преобразуются в соответствии с объявленным для столбца типом данных. См. раздел
Работа с типами данных базы данных
для получения дополнительной информации.
Среда выполнения не налагает ограничения на значения внешнего ключа. Другими словами, значения внешнего ключа не обязательно должны соответствовать существующему значению первичного ключа.
Помимо предустановленных типов ограничений механизм SQL среды выполнения поддерживает использование триггеров. Триггер подобен обработчику событий. Он представляет собой предустановленный набор инструкций, которые выполняются при наступлении какого-либо события. Например, можно определить триггер, который запускается при вставке данных в определенную таблицу или при удалении данных из нее. Одним из возможных применений триггера является проверка изменений данных. Если заданные условия не выполняются, возникает ошибка. Следовательно, триггер используется в тех же целях, что и ограничение, а стратегии по предотвращению и устранению ошибок ограничений также применимы к ошибкам, сгенерированным триггерами. Однако идентификаторы ошибок триггеров отличаются от идентификаторов ошибок ограничений.
Набор ограничений, применимых к определенной таблице, определяется при разработке приложения. Тщательное проектирование ограничений при разработке приложения облегчает предотвращение и устранение ошибок ограничений. Однако ошибки ограничений сложно предвидеть и устранять систематически. Ошибки ограничений трудно предвидеть, так как они не проявляются до добавления данных приложения. Ошибки ограничений возникают в связи с добавлением данных в базу данных после ее создания. Они часто являются следствием взаимосвязи между новыми и уже существующими данными базы данных. Следующие стратегии помогут избежать многих ошибок ограничений:
-
Тщательно продумывайте структуру базы данных и ограничения
-
Целью ограничений является выполнение правил приложения и защита целостности данных в базе данных. При проектировании приложения продумайте структуру базы данных для поддержки приложения. В частности, определите правила для данных, например, когда требуются определенные значения, возможны ли значения по умолчанию, допускаются ли повторяющиеся значения и т. д. Эти правила помогут определить ограничения для базы данных.
-
Указывайте имена столбцов явным образом
-
Инструкцию
INSERT
можно написать без явного указания столбцов, в которые нужно вставить значения, но такой подход представляет собой неоправданный риск. Явное именование столбцов для вставки данных разрешает автоматическое создание значений, наличие в столбцах значений по умолчанию и значений типа
NULL
. Кроме того, таким образом вы обеспечиваете вставку явных значений в столбцы
NOT NULL
.
-
Используйте значения по умолчанию
-
При установке ограничения
NOT NULL
для столбца по возможности указывайте значение по умолчанию в определении этого столбца. Код приложения также может предоставить значения по умолчанию. Например, код может проверить, имеет ли переменная String значение
null
, и присвоить этой переменной значение перед ее использованием для задания значения параметра инструкции.
-
Проверяйте введенные пользователем данные
-
Своевременно проверяйте введенные пользователем данные, чтобы убедиться, что они входят в пределы, заданные ограничением, особенно в случае с ограничениями
NOT NULL
и
CHECK
. Конечно, ограничение
UNIQUE
труднее всех поддается проверке, так как для этого потребуется выполнить инструкцию
SELECT
, чтобы определить уникальность данных.
-
Используйте триггеры
-
Можно написать триггер, который будет проверять (и, возможно, заменять) вставленные данные и совершать другие действия для исправления недопустимых данных. Такая проверка и коррекция позволяет избежать возникновения ошибок ограничений.
Во многих случаях ошибки ограничений наиболее сложно предотвратить, чем другие типы ошибок. К счастью, существует несколько стратегий по устранению ошибок ограничений, которые не влияют на работу приложения:
-
Используйте алгоритмы разрешения конфликтов
-
При установке ограничения для столбца и создании инструкции
INSERT
или
UPDATE
можно задать алгоритм разрешения конфликта. Алгоритм разрешения конфликта задает действие, которое выполняет база данных при нарушении ограничения. Механизм базы данных может выполнять несколько действий. Механизм базы данных может прервать выполнение отдельной инструкции или целой транзакции. Он может игнорировать ошибку. Он даже может удалить устаревшие данные и заменить их данными, которые пытается сохранить код.
Дополнительные сведения см. в разделе «ON CONFLICT (алгоритмы конфликтов)» приложения «
Поддержка SQL в локальных базах данных
».
-
Обеспечивайте обратную связь в целях коррекции
-
Набор ограничений, которые могут повлиять на конкретную команду SQL, можно определить заранее. Следовательно, можно предугадать ошибки ограничений, которые могут возникнуть при выполнении инструкции. Учитывая рекомендации, можно создать приложение, способное реагировать на ошибки ограничений. Предположим, в приложение входит форма для ввода данных о новых продуктах. Если в базе данных для столбца с наименованиями продуктов установлено ограничение
UNIQUE
, вставка в базу данных строки с новым продуктом может привести к ошибке ограничения. Следовательно, приложение должно предугадывать ошибки ограничения. При возникновении ошибки приложение уведомляет пользователя о том, что продукт с таким наименованием уже существует и что необходимо выбрать другое наименование. Другой возможной реакцией является предоставление пользователю возможности просмотреть информацию о другом продукте с тем же наименованием.
|
|
|