|
Программирование >> Sql: полное руководство
автоматически обновить идентификатор офиса этих двух служащих в таблице salesreps ДЛЯ ТОГО, чтобы ИХ строки были по-прежнему связаны с лос-анджелесской строкой в таблице offices через ее новый идентификатор офиса; в столбце rep 0FFICE установить для этих двух служащих значение null, показывая тем самым, что идентификатор их офиса неизвестен; в столбце rep 0FFICE установить по умолчанию для этих двух служащих некоторое значение, например идентификатор главного офиса в Нью-Йорке, указывая тем самым, что служащие автоматически переводятся в этот офис. В данном конкретном примере некоторые способы решения могут показаться более логичными, чем другие, но относительно легко можно придумать примеры, в которых любая из четырех возможностей окажется наиболее правильным вариантом (если необходимо, чтобы база данных служила точной моделью реальных ситуаций). В стандарте SQL1 для примеров, приведенных выше, предусмотрена только первая возможность - запрет на изменение значения используемого первичного ключа и запрет на удаление строки с используемым первичным ключом. Однако в DB2 существуют правила удаления, благодаря которым становятся возможными и остальные варианты. В стандарте SQL2 эти правила были преобразованы в правила удаления и обновления, охватывающие как удаление строк-предков, так и обновление первичных ключей. Правила удаления и обновления * Для каждого отношения предок/потомок в базе данных, создаваемого внешним ключом, стандарт SQL2 позволяет задать соответствующее правило удатения и соответствующее правило обновления. Правило удаления определяет те действия, которые СУБД выполняет, когда пользователь пытается удалить строку из таблицы-предка. Можно задать одно из четырех возможных правил удаления: restrict - запрещает удаление строки из таблицы-предка, если строка имеет потомков. Инструкция delete, пытающаяся удалить такую строку, отбрасывается, и вьщается сообщение об ошибке. Таким образом, из таблицы-предка можно удалять только строки, не имеющие потомков. Для таблиц, представленных на рис. 11.1, это правило можно сформулировать так: Нельзя удалить данные об офисе, если за ним закреплен какой-нибудь служащий . cascade - определяет, что при удалении строки-предка все строки-потомки также автоматически удаляются из таблицы-потомка. Для таблиц на рис. 11.1 это правило можно сформулировать так: При удалении данных об офисе автоматически удаляются данные обо всех закрепленных за ним служащих . set null - определяет, что при удалении строки-предка внешним ключам во всех ее строках-потомках автоматически присваивается значение null. Таким образом, удаление строки из таблицы-предка вызывает установку значений null в некоторых столбцах таблицы-потомка. Для таблиц, представленных на рис. II.I, это правило можно сформулировать так: При удалении данных об офисе необходимо указать, что пока неизвестно, в какой офис переводятся его служащие . * set default - определяет, что при удалении строки-предка внешним ключам во всех ее строках-потомках присваивается определенное значение, по умолчанию установленное для данного столбца. Таким образом, удаление строки из таблицы-предка вызывает установку по умолчанию в некоторых столбцах таблицы-потомка. Для таблиц, приведенных на рис. 11.1, то правило можно сформулировать так: При удалении офиса необходимо указать, что его служащие по умолчанию переводятся в офис, заданный в определении таблицы salesreps . Имеются небольшие различия между реализациями правил удаления в SQL2 и DB2. В существующей на сегодняшний день версии DB2 не поддерживается правило set default; oho описано только в стандарте SQL2. Кроме того, в SQL2 правило restrict называется n0 action. Подобное название не совсем точно, так как подразумевает, что СУБД не будет выполнять никаких действий, хотя в действительности СУБД генерирует сообщение об ошибке. В последней версии DB2 добавлена поддержка обоих правил: и restrict, и n0 action. Разница лишь во времени их применения, первое применяется перед проверкой всех прочих офаничений, а второе - после. Во всем остальном оба правила идентичны. Аналогично тому, как правила удаления определяют действия СУБД при попытке удаяить строку из таблицы-предка, так правила обновления определяют действия СУБД, когда пользователь пытается обновить значение первичного ключа в таблице-предке. Применяются четыре правила обноа/1ения, аналогичные правилам удаления: restrict - запрещает обновление первичного ключа в строке таблицы-предка, если у строки есть потомки. Инструкция update, пытающаяся изменить значение первичного ключа в такой строке, отбрасывается, и выдается сообщение об ошибке Таким образом, в таблице-предке можно обновлять первичные ключи только в строках, не имеющих потомков. Для таблиц на рис. 11.1 это правило можно сформулировать так: Нельзя изменить идентификатор офиса, если имеются закрепленные за ним служащие . cascade - определяет, что при изменении значения первичного ключа в строке-предке соответствующее значение внешнего ключа в таблице-потомке также автоматически изменяется во всех сфоках-потомках таким образом, чтобы соответствовать новому значению первичного ключа. Для таблиц, представленных на рис 11.1 это правило можно сформулировать так: Изменение идентификатора офиса вызывает автоматическое изменение этого идентификатора для всех служащих, закрепленных за данным офисом . set null - определяет, что при обновлении значения первичного ключа в строке-предке внешним ключам во всех ее строках-потомках автоматически присваивается значение null. Таким образом, изменение первичного ключа в таблице-предке вызывает установку значений null в некоторых столбцах таблицы-потомка. Для таблиц на рис. 11.1 это правило можно сформулировать так: При изменении идентификатора офиса необходимо указать, что пока неизвестно, в какой офис переводятся его служащие . set default - определяет, что при обновлении значения первичного ключа в строке-предке внешним ключам во всех ее строках-потомках по умолчанию присваивается определенное значение, установленное для данного столбца. Таким образом, изменение первичного ключа в таблице-предке вызывает выполнение установки по умолчанию в некоторых столбцах таблицы-потомка. Для таблиц на рис. 11.1 это правило можно сформулировать так При изменении идентификатора офиса все его служащие по умолчанию переводятся в офис, который указан в определении таблицы salesreps. Те же самые различия между правилами удаления в DB2 и SQL2 существуют и в отношении правил обновления Правило set default присутствует только в SQL2, но отсутствует в DB2. Правило restrict называется так только в DB2; в SQL2 оно называется n0 action. Для одного и того же отношения предок/потомок правило удаления и правило обновления могут быть различными, хотя в большинстве случаев они совпадают Если пользователь не задал ни одного правила, то по умолчанию применяется правило [restrict, поскольку оно оставляет меньше возможностей для случайного разрушения или изменения данных. Каждое из перечисленных правил применяется в различных ситуациях. То, какое именно правило следует применить, обычно определяется реальными ситуациями внешнего мира, которые моделируются базой данных. В учебной базе данных таблица orders содержит три отношения внешний 104 - первичный ключ (рис. 11.2). Они связывают каждый заказ- (а) с заказанны.м товаром; (б) с клиентом, сделавшим заказ; (в) со служащим, принявшим заказ Для каждого из этих отношений подходит свое правило. Для отношения между заказом и заказанным товаром следует, по-видимому, применять правило restrict (как для удаления, так и для обновления) Нельзя удалить информацию о товаре или изменить его идентификатор, если в настоящий момент на этот товар имеются заказы Для отношения между заказом и клиентом, сделавшим его, следует, по-видимому, использовать правило cascade (как при удалении, так и при обновлении). Если клиент прекращает сотрудничество с компанией, то из базы данных необходимо удалить его строку. В этом случае вместе с данными о клиенте следует также удалить и все его текущие заказы. Аналогично, изменение идентификатора клиента следует автоматически распространить на все его заказы Для отношения между заказом и служащим, принявшим его, следует, по-видимому, применять правило set null. Если служащий покидает компанию, го все заказы, принятые им, останутся без служащего (будут заказами неизвестного служащего ) до тех пор, пока их не закрепят за другим служащим. Для этого отношения можно также использовать правило SET default, чтобы автоматически закреплять такие заказы за вице-президентом по сбыту. Что касается правила обновления, то для этого отношения необходимо, вероятно, применять правило cascade, чтобы автоматически распространять изменение идентификатора служащего на таблицу orders. Таблица CUSTOMERS Таблица SALESREPS Таблица PRODUCTS
cascade (при удалении предка удалить потомка) set NULL (при удалении предка присвоить потомку значение NULL) f restrict у (запретить удаление предка) Таблица ORDERS
Phc. 7 ? 2 Три правила удаления
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |