Связь таблиц по первичному ключу

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

Что значит родительских? Одну из таблиц называют родительской, и онадолжна иметь индекс типа Primary, а другую таблицу, с которой она будет связана, называют дочерней, и ее индекс не обязательно должен содержать уникальные значения. Конечно, индексные выражения обеих таблиц должны бытьаналогичными. Например, окно Дизайнера баз данных (Database Designer) приэтом может выглядеть так, как это показано на рис. 2.34.

На этом рисунке в состав базы данных Myvfpbase входят две таблицы - perslи staff 1. Таблица persl проиндексирована по полю Id (индекс sids). Таблицаstaff 1 проиндексирована по полю Id (индекс ids), и этот индекс является первичным ключом.

Чтобы связать таблицы, надо навести указатель мыши на первичный ключ (слева от названия которого показан значок ключа), нажать левую клавишу мыши и, неотпуская ее, переместить указатель мыши на имя индекса в дочерней таблице. Затем нужно отпустить кнопку' мыши. В результате установится связь, которая графически будет отображаться в виде линии, соединяющей две таблицы (рис. 2.35).

Поскольку у родительской таблицы индекс уникален (первичный ключ), а удочерней не уникален (есть повторяющиеся значения), установится связь типа«один ко многим».

После установления связи наведите на линию указатель мыши и щелкнитеправой кнопкой мыши. В появившемся окне выберите команду Edit ReferentialIntegrity. Появится окно, представленное на рис. 2.36. Вызвать появление этого окна можно также с помощью команды Edit Referential Integrity (Редактировать целостность связей) из меню Database (База данных).



В этом окне присутствуют три вкладки. Рассмотрим каждую из них.

> Rules for Updating (Правила обновления) - действия, выполняемые в

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

-    Cascade (Каскад) - обновляет все связанные записи в дочерних таблицах при изменении поля записи с первичным ключом;

-    Restrict (Ограничить) - запрещает обновление полей, по которымформируется ключевой индекс, в записях родительской таблицы, еслиесть связанные с ними дочерние таблицы;

-    Ignore (Игнорировать) - позволяет свободно обновлять записи с ключевыми полями. При этом связанные записи в дочерних таблицах остаются в прежнем состоянии.

Если выбрать пункт Restrict (Ограничить), согласиться с запросом на создание хранимой процедуры и попытаться отредактировать ключевые поля родительской таблицы, появится сообщение, подобное представленному на рис. 2.37.

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

> Rules for Deleting (Правила удаления) - действия, выполняемые в момент попытки удаления записей, по полям которых формируется ключевой индекс, в родительской таблице. Возможны три варианта (рис. 2.38):

-    Cascade (Каскад) - удаляет все связанные записи в дочерних таблицахпри удалении записи с первичным ключом в родительской таблице;

-    Restrict (Ограничить) - запрещает удаление записей родительскойтаблицы, по полям которых формируется ключевой индекс, если естьсвязанные с ними записи дочерних таблиц;

-    Ignore (Игнорировать) - позволяет свободно удалять записи с ключевыми полями. При этом связанные записи в дочерних таблицах остаются в прежнем состоянии.

> Rules for Inserting (Правила вставки) - действия, выполняемые в момент попытки вставки новых записей в дочернюю таблицу. Возможныдва варианта (рис. 2.39):

-    Restrict (Ограничить) - запрещает вставку новых значений полей, покоторым формируется индекс, в записях дочерней таблицы, если таких значений нет в связанной с ней родительской таблице;

-    Ignore (Игнорировать) - позволяет свободную вставку новых значенийполей, по которым формируется индекс, в записях дочерней таблицы.

После выбора правил обновления, удаления и вставки данных в связанныетаблицы, при щелчке по кнопке ОК создаются хранимые процедуры, которыесрабатывают в момент соответствующих действий с таблицами (обновления,удаления или вставки данных). Просмотреть текст хранимых процедур можно,выбрав в меню Database (База данных) команду Edit Stored Procedures (Редактировать хранимые процедуры). Вызываются хранимые процедуры при срабатывании триггеров.

Триггеры

Еще один механизм защиты целостности базы данных, непосредственно связанный с хранимыми процедурами, - триггеры. Триггер - это способ запуска на выполнение хранимой процедуры при возникновении определенного события вбазе данных. Просмотреть и откорректировать триггеры, а также создать новые триггеры можно, используя Дизайнер таблиц (Table Designer). Для этого

предназначена вкладка Table (Таблица). Она представлена на рис. 2.40. Увидетьокно Дизайнера таблиц (Table Designer) вновь после процесса создания таблицы можно, выполнив следующие действия:

1.    Открыть таблицу.

2.    Выполнить команды Window > Data Session (Окно > Сессия работы с данными) или щелкнуть по кнопкена стандартной панели инструментов.

3.    В появившемся окне Data Session (Сессия работы с данными) щелкнитемышью по кнопке Properties (Свойства).

4.    В открывшемся окне WTork Area Properties (Свойства рабочей области)щелкните по кнопке Modify (Изменить).

Либо, если вы находитесь в окне Дизайнера базы данных (Database* Designer),можно щелкнуть по кнопке

Триггеры настраиваются в группе Triggers (Триггеры). В этой группе представлены три поля: для ввода имени процедуры, запускаемой при вставке записи (Insert trigger), для ввода имени процедуры, запускаемой при обновлениизаписи (Update trigger), и для ввода имени процедуры, запускаемой при удалении записи (Delete trigger).