Введение в дисциплину «Безопасность систем баз данных». Теоретические основы построения реляционных баз данных. Верификация баз данных и проведение аудита в СБД. Распределенные базы данных, страница 7

Требование ссылочной целостности состоит в том, что для каждого значения внешнего ключа в зависимом отношении должен найтись кортеж с таким же значением первичного ключа в независимом отношении, либо значение внешнего ключа должно быть неопределенным (т.е. ни на что не ссылаться). На рис. 2.3 каждая строка таблицы ГРУППЫ содержит ссылку на одну из строк таблицы СПЕЦИАЛЬНОСТИ. Ни одна из строк таблицы ГРУППЫ не ссылается на несуществующую строку таблицы СПЕЦИАЛЬНОСТИ.

Следует обратить внимание на то, что в качестве первичных и внешних ключей в рассмотренном примере использовались идентификационные номера. Опытные разработчики БД рекомендуют всегда использовать именно числовые идентификаторы в качестве первичных и внешних ключей. Почему? Предположим, в качестве первичного ключа выбирается номер паспорта сотрудника. Но номер паспорта в БД должен совпадать с реальным номером паспорта человека. Если обнаруживается, что один из номеров паспорта введен ошибочно, возникает необходимость исправить ошибку. Но исправлять придется не только в независимой таблице. Необходимо исправить также и все ссылки в зависимых таблицах. Если таких ссылок в БД много, исправление одной-единственной ошибки может отрицательно сказаться на производительности сервера. Обычный же числовой идентификатор используется только для нумерации строк в независимой таблице и не несет на себе никакой иной смысловой нагрузки. Поэтому на практике не возникает ситуаций, когда его значение требуется исправлять. Таким образом решается не только проблема повышения производительности сервера, но и – вместе с нею – проблема повышения доступности информации в БД. А доступность – одна из составляющих защищенности информации. Кроме того, использование числовых идентификаторов в качестве ключей в ряде случаев способствует экономии внешней памяти. Идентификаторы – это числа, их объем фиксирован и является сравнительно небольшим. В отличие от строковых типов: одна строка может занимать килобайты памяти, и если она будет многократно повторяться, как ссылка, это приведет к значительному расходу памяти.

Ключевые столбцы назначаются разработчиком БД при создании таблицы. Для определения первичного и внешних ключей используются ограничения целостности. Первичному ключу соответствует ограничение целостности PRIMARY KEY, а внешнему – FOREIGN KEY. Чтобы определить в таблице первичный и внешний ключи, пользователь накладывает на выбранные столбцы соответствующие ограничения. СУБД автоматически осуществляет контроль всех изменений в таблице, не давая пользователю нарушить целостность:

·  если на столбец наложено ограничение PRIMARY KEY, система запрещает хранение в нем неопределенных и повторяющихся значений;

·  если на столбец наложено ограничение FOREIGN KEY, система не допускает, чтобы хранимые в нем значения ссылались «в никуда».

Существенно, что ограничение FOREIGN KEY определяет поведение системы при внесении изменений не только в зависимое, но и в независимое отношение.

Во-первых, система может запрещать изменение первичного (потенциального) ключа в независимой таблице, если на него ведет хотя бы одна ссылка из зависимой таблицы. То же самое касается и удаления строк: нельзя удалить строку из независимой таблицы, если на нее ссылается хотя бы одна строка в таблице зависимой.

Альтернативой запрещению является стратегия каскадной модификации, которая включает в себя:

·  каскадное обновление – при изменении значения первичного ключа в независимой таблице соответствующим образом изменяются значения внешнего ключа в зависимой таблице;

·  каскадное удаление – при удалении строки из независимой таблицы из зависимых таблиц удаляются все строки, которые на нее ссылаются.

Помимо базовых ограничений, многими СУБД поддерживаются дополнительные ограничения целостности, из которых наиболее широко распространены следующие:

·  UNIQUE – контролирует уникальность значений атрибута, но разрешает хранение в нем неопределенных значений;

·  NOT NULL – запрещает неопределенные значения атрибута;