|
| ||||||||||||
| ||||||||||||
|
2008 г.
Базы данных. Вводный курсСергей КузнецовОтмена определения (уничтожение) базовой таблицыДля отмены определения (уничтожения) базовой таблицы служит оператор
DROP TABLE base_table_name { RESTRICT | CADCADE }
Успешное выполнение оператора приводит к тому, что указанная базовая таблица перестает существовать. Уничтожаются все ее строки, определения столбцов и табличные определения целостности. При наличии спецификации 16.3. Средства определения и отмены общих ограничений целостностиВиды ограничений целостности, с которыми мы имели дело в предыдущих разделах этой лекции, образуют иерархию (рис. 16.2).
Ограничения целостности, входящие в определение домена, наследуются всеми столбцами, определенными на этих доменах, и являются ограничениями этих столбцов. Кроме того, в определение столбца могут входить определения дополнительных ограничений. Ограничения целостности, входящие в определение столбца (включая ограничения, унаследованные из определения домена), являются ограничениями таблицы, в состав определения которой входит определение данного столбца. Кроме того, в определение таблицы могут входить определения дополнительных ограничений. Но иерархия видов ограничений целостности этим не исчерпывается. Ограничения целостности, входящие в определение таблицы (включая явные и унаследованные от определения доменов ограничения столбцов), представляют собой ограничения базы данных, частью которой является данная таблица. Кроме того, могут определяться дополнительные ограничения базы данных. В стандарте SQL такие дополнительные ограничения базы данных называются 16.3.1. Определение общих ограничений целостностиДля определения общего ограничения целостности служит оператор
CREATE ASSERTION constraint_name
CHECK (conditional_expression)
Заметим, что при создании общего ограничения целостности его имя всегда должно указываться явно. Хотя синтаксис определения общего ограничения совпадает с синтаксисом определений ограничений столбца и таблицы, в данном случае допускаются только специальные виды условных выражений. Мы не можем сейчас точно сформулировать свойства этих видов условий, поскольку отложили подробное рассмотрение разновидностей условных выражений до следующих лекций. Если говорить неформально, то особые свойства условий связаны с тем, что при определении общих ограничений целостности контекстом, в котором вычисляется условное выражение, является весь набор таблиц базы данных, а не набор строк таблицы, как это было при определении табличных ограничений. Продемонстрируем и прокомментируем несколько примеров определений общих ограничений целостности. В определении таблицы CHECK (EMP_BDATE >= '1917-10-24') (к работе на предприятии допускаются только те лица, которые родились после Октябрьского переворота). Вот каким образом можно определить такое же ограничение на уровне общих ограничений целостности:
CREATE ASSERTION MIN_EMP_BDATE CHECK
((SELECT MIN(EMP_BDATE)) FROM EMP) >= '1917-10-24')
В логическом условии этого общего ограничения выбирается минимальное значение столбца Теперь переформулируем в виде общего ограничения целостности ограничение таблицы
CONSTRAINT PRO_EMP_NO CHECK
((SELECT COUNT (*) FROM EMP E
WHERE E.PRO_NO = PRO_NO) <= 50)
(над одним проектом не может работать более 50 служащих). Вот формулировка эквивалентного общего ограничения целостности:
CREATE ASSERTION NEW_PRO_EMP_NO CHECK
( NOT EXISTS (SELECT PRO_NO FROM EMP GROUP BY PRO_NO
HAVING COUNT* > 50)).
Логическое выражение этого ограничения может принимать только значения Покажем, как можно сформулировать в виде общего ограничения целостности ограничение внешнего ключа. Например, приведем такую эквивалентную формулировку для определения внешнего ключа FOREIGN KEY PRO_NO REFERENCES PRO (PRO_NO) В виде общего ограничения целостности это может выглядеть следующим образом:
(1) CREATE ASSERTION FK_PRO_NO CHECK
(2) ( NOT EXISTS (SELECT * FROM EMP
WHERE PRO_NO IS NOT NULL AND
(3) NOT EXISTS (SELECT * FROM PRO
(4) WHERE PRO.PRO_NO = EMP.PRO_NO))).
Логическое выражение этого ограничения выглядит достаточно сложным и нуждается в пояснении. Условие выборки оператора Теперь предположим, что в таблице Если же найдется хотя бы одна строка таблицы Мы сознательно привели такое подробное пояснение не только для того, чтобы прояснить смысл условного выражения общего ограничения целостности Наконец, сформулируем общее ограничение целостности, состоящее в том, что никакой менеджер проекта не должен иметь суммарный общий доход, больший суммарного дохода руководителя отдела, в котором работает этот менеджер.
(1) CREATE ASSERTION PRO_MNG_CONSTR CHECK
(2) NOT EXISTS (SELECT * FROM EMP EMP1, EMP EMP2,
DEPT, PRO WHERE
(3) EMP1.EMP_NO = PRO.PRO_MNG AND
(4) EMP1.DEPT_NO = DEPT.DEPT_NO AND
(5) DEPT.DEPT_MNG = EMP2.EMP_NO AND
(6) EMP1.EMP_SAL + COALESCE (EMP1.EMP_BONUS,0) >
(7) EMP2.EMP_SAL + COALESCE (EMP2.EMP_BONUS,0);
В логическом выражении этого ограничения используется оператор выборки Итак, в разделе Вычисление оператора выборки начинается с того, что формируется расширенное декартово произведение всех таблиц, указанных в разделе Условие раздела 16.3.2. Отмена определения общего ограничения целостностиДля того чтобы отменить ранее определенное общее ограничение целостности, нужно воспользоваться оператором DROP ASSERTION constraint_name Вот пример оператора, отменяющего определение дискриминационного общего ограничения целостности DROP ASSERTION PRO_MNG_CONSTR; 16.3.3. Немедленная и откладываемая проверка ограниченийНа первый взгляд кажется, что ограничения целостности (всех видов) должны немедленно проверяться в случае выполнения любого действия, изменяющего содержимое базы данных (вставка в любую таблицу новой строки, изменение или удаление существующих строк). Однако можно определить такие ограничения целостности, логическое выражение которых будет принимать значение
CHECK (DEPT_EMP_NO =
(SELECT COUNT(*) FROM EMP
WHERE DEPT_NO = EMP.DEPT_NO))
из определения таблицы Поскольку ограничения целостности, немедленная проверка которых бессмысленна, являются нужными и полезными, в язык SQL включены средства, позволяющие регулировать время проверки ограничений. Если говорить более точно, в контексте каждой выполняемой транзакции каждое ограничение целостности должно находиться в одном из двух режимов: режиме немедленной проверки (immediate) или режиме отложенной проверки (deferred). Все ограничения целостности, находящиеся в режиме немедленной проверки, проверяются при выполнении в транзакции любой операции, изменяющей состояние базы данных. Если действие операции нарушает какое-либо немедленно проверяемое ограничение целостности, то это действие отвергается.111) Ограничения целостности, находящиеся в режиме отложенной проверки, проверяются при завершении транзакции (выполнении операции Для этого в качестве заключительной синтаксической конструкции к любому определению ограничения целостности (любого вида) может быть добавлена спецификация
INITIALLY { DEFERRED | IMMEDIATE }
[ [ NOT ] DEFERRABLE ]
Эта спецификация указывает, в каком режиме должно находиться данное ограничение целостности в начале выполнения любой транзакции ( Комбинация При выполнении транзакции можно изменить режим проверки некоторых или всех ограничений целостности для данной транзакции. Для этого используется оператор
SET CONSTRAINTS { constraint_name_commalist | ALL }
{ DEFERRED | IMMEDIATE }
Если в операторе указывается список имен ограничений целостности, то все они должны быть При выполнении операции 16.4. ЗаключениеВ этой и предыдущей лекциях мы обсудили наиболее важные аспекты языка SQL, связанные с определением схемы базы данных, – типы данных SQL, средства определения доменов, базовых таблиц и ограничений целостности. Кроме того, были рассмотрены средства SQL, позволяющие динамически изменять и удалять определения этих объектов. Язык SQL устроен таким образом, что практически невозможно изложить какую-либо его часть независимо от других частей. И хотя эти две лекции по смыслу должны быть первыми среди лекций, посвященных SQL (было бы странно обсуждать операторы выборки строк из таблиц, вставки, изменения и удаления строк до обсуждения средств создания таблиц и ограничений целостности), нам пришлось забежать вперед и воспользоваться материалом следующих лекций для объяснения средств определения ограничений целостности. Надеюсь, что это не создало слишком больших неудобств для читателей, и отсутствие формальных определений удалось компенсировать наличием простых примеров. 108 Не считая те ограничения целостности, которые (a) определены в составе определения данной базовой таблицы и (b) не ссылаются на какие-либо другие базовые таблицы. 109 Это означает, что 110 Не следует воспринимать этот и следующие абзацы как описание того, как на самом деле выполняются подобные запросы в SQL-серверах. Это наиболее прямолинейный и малоэффективный способ выполнения запроса (хотя, в принципе, его можно применять и на практике). Мы выбрали этот способ описания, поскольку он максимально соответствует подходу к описанию семантики языка SQL, применяемому в стандарте языка. Кстати, основным отличием более практичных способов выполнения запросов с соединением является стремление к тому, чтобы избежать явного декартова произведения. 111 Конечно, в грамотных реализациях SQL при выполнении операции проверяются не все немедленно проверяемые ограничения целостности, а только те, которые в принципе могут быть нарушены данной операцией. 112 Мы снова вынуждены забегать вперед. Средства SQL для управления транзакциями более подробно обсуждаются в следующих лекциях. 113 Конечно, в грамотных реализациях SQL при завершении транзакции проверяются не все отложенно проверяемые ограничения целостности, а только те, которые в принципе могут быть нарушены данной транзакцией. 114 Для некоторых ограничений целостности режим отложенной проверки не имеет смысла. К таким ограничениям относятся, например, ограничения домена, ограничения
|
|
CITForum © 1997–2025