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

2.16. Таблица не участвует в связях с другими таблицами БД.

Модель БД должна быть продумана таким образом, чтобы ее основные таблицы участвовали хотя бы в одной связи с другими таблицами. Исключение составляют временные и «рабочие» таблицы. Они, как правило, не описываются в модели БД и появляются в процессе эксплуатации БД пользователями.

2.17. Неправильная настройка каскадного удаления.

Пусть таблица table2 содержит внешний ключ со ссылкой на первичный ключ table1. Этот внешний ключ создавался с использованием опции ON DELETE CASCADE: при удалении строки из table1 должны автоматически удаляться все зависимые строки из table2. Но если при этом найдется дочерняя по отношению к table2 таблица table3, для которой не установлено каскадное удаление, то и каскадное удаление из table2 будет не всегда возможным. И хотя данную особенность нельзя отнести к серьезным ошибкам, она может создать неудобства во время эксплуатации БД.

3. Ошибки нормализации.

В эту категорию включаются избыточные функциональные зависимости, которые свидетельствуют о нарушениях требований первой, второй и третьей нормальных форм.

Следует отметить, что AllFusion Data Model Validator не может точно определять функциональные зависимости. Тем более что анализ модели БД производится до ее заполнения, и доказать, что в таблицах будут иметь место недопустимые функциональные зависимости, на данном этапе невозможно. Поэтому AllFusion Data Model Validator выявляет участки модели которые, возможно, содержат ошибки нормализации.

Рассмотрим следующий пример SQL-скрипта:

create table STATE(

               STATE_ID                number not null primary key,

               NAME                    varchar2 (80));

create table CUSTOMER (

               CUSTOMER_ID             number not null primary key,

               NAME            varchar2 (80),

               CUSTOMER_ADDRESS        varchar2 (80),

               STATE_ID                number,

               STATE_NAME      varchar2 (80));

По умолчанию AllFusion Data Model Validator считает, что одноименные столбцы разных таблиц представляют одну и ту же характеристику сущности или связи. С этой точки зрения столбцы NAME и STATE_ID имеют одинаковый смысл. Получается, что в таблице CUSTOMER имеется функциональная зависимость столбца NAME от неключевого столбца STATE_ID, что является нарушением требования третьей нормальной формы.

Еще раз подчеркнем, что вывод о ненормализованности таблицы основан на предположении о том, что одноименные столбцы имеют одинаковый смысл в обеих таблицах. Эксперту необходимо убедиться (с помощью разработчика БД) в истинности этого предположения, чтобы сделать окончательный вывод о присутствии либо отсутствии избыточных функциональных зависимостей в таблицах.

4. Ошибки связей.

В эту категорию входят ошибки, связанные с определением внешних ключей. Перечислим наиболее критичные из них.

4.1. Некорректно определенная рекурсивная связь.

Данная ошибка имеет место, если внешний ключ рекурсивной связи имеет ограничение NOT NULL. В этом случае вставка строк в пустую таблицу оказывается невозможной.

4.2. Отключение внешнего ключа.

В СУБД имеется возможность отключать любые ограничения целостности и триггеры. Если отключается ограничение PRIMARY KEY или UNIQUE, наложенное на некоторый столбец, то автоматически отключается и каждое связанное с ним вместе ограничение FOREIGN KEY. Это может привести к нарушению целостности БД в процессе эксплуатации.

4.3. Бесконечные циклы между таблицами. Если между таблицами существует цикл (рис. 8.4), и все внешние ключи имеют свойство NOT NULL, заполнение таблиц оказывается невозможным.

Рисунок 8.4 – Пример цикла в схеме БД

4.4. Таблица содержит слишком много внешних ключей.

Ошибка имеет место, если количество внешних ключей, заданных для некоторой таблицы, превышает определенное экспертом пороговое значение.