Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
160
Добавлен:
16.03.2016
Размер:
6 Мб
Скачать
☆

Примеры изменения определения столбца

Предположим, что на предприятии ввели систему премирования служащих. Каждый служащий может дополнительно к зарплате получать ежемесячную премию, не превышающую размер его зарплаты. Тогда разумно добавить к таблице EMPновый столбецEMP_BONUS, используя операторALTER TABLE:

ALTER TABLE EMP

ADD EMP_BONUS SALARY DEFAULT NULL

CONSTRAINT BONSAL CHECK (VALUE < EMP_SAL);

Обратите внимание, что мы присвоили проверочному ограничению столбца явное имя, чтобы в случае, если ограничения на размер премии изменятся (что вполне возможно), можно было бы легко отменить это ограничение, воспринимая его как табличное.

При определении столбца EMP_SALтаблицыEMPдля этого столбца явно не определялось значение по умолчанию (оно наследовалось из определения домена). Если в какой-то момент это стало неправильным (например, повысился размер минимальной зарплаты), можно установить новое значение по умолчанию:

ALTER TABLE EMP ALTER EMP_SAL SET DEFAULT 15000.00.

105 Не считая те табличные ограничения целостности, которые (a) определены в составе определения базовой таблицы, содержащей данный столбец и (b) не содержат ссылок на какие-либо другие столбцы.

При определении столбца  DEPT_TOTAL_SALтаблицыDEPTдля него было установлено значение по умолчанию 1000000. Главный бухгалтер предприятия может быть недоволен тем, что такие важные данные, как объем фонда зарплаты отделов, могут устанавливаться по умолчанию. Тогда можно отменить это значение по умолчанию:

ALTER TABLE DEPT ALTER DEPT_TOTAL_SAL DROP DEFAULT.

Обратите внимание, что после выполнения этого оператора при вставке новой строки в таблицу DEPTвсегда потребуется явно указывать значение столбцаDEPT_TOTAL_SAL. Хотя формально у столбца будет существовать значение по умолчанию, наследуемое от доменаSALARY(10000.00), оно не может быть занесено в таблицуDEPT, поскольку противоречит ограничению столбцаDEPT_TOTAL_SAL CHECK (VALUE >= 100000.00).

Можно задуматься, действительно ли требуется поддерживать в таблице DEPTстолбецDEPT_EMP_NO. Как мы видели, для его поддержки требуется проверять громоздкое ограничение целостности, а число служащих в любом отделе можно получить динамически с помощью простого запроса к таблицеEMP(собственно, этот запрос входит в ограничение целостности). Поэтому может оказаться разумным отменить определение столбцаDEPT_EMP_NO, выполнив следующий операторALTER TABLE:

ALTER TABLE DEPT DROP DEPT_EMP_NO CASCADE.

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

Изменение набора табличных ограничений

Действие по изменению набора табличных ограничений специфицируется в следующем синтаксисе:

base_table_constraint_alternation_action ::=

ADD [ CONSTRAINT ] base_table_constraint_definition

| DROP CONSTRAINT constraint_name

{ RESTRICT | CASCADE }

Действие ADD [ CONSTRAINT ]позволяет добавить к набору существующих ограничений таблицы новое ограничение целостности. Можно считать, что новое ограничение добавляется черезANDк конъюнкции существующих ограничений, как если бы оно определялось в составе оператораCREATE TABLE. Но здесь имеется одно существенное отличие. Если внимательно посмотреть на все возможные виды табличных ограничений, можно убедиться, что любое из них удовлетворяется на пустой таблице. Поэтому, какой бы набор табличных ограничений ни был определен при создании таблицы, это определение является допустимым и не препятствует выполнению оператораCREATE TABLE. При добавлении нового табличного ограничения с использованием действияADD [ CONSTRAINT ]мы имеем другую ситуацию, поскольку таблица, скорее всего, уже содержит некоторый набор строк, для которого условное выражение нового ограничения может принять значениеfalse. В этом случае выполнение оператораALTER TABLE, включающего действиеADD [ CONSTRAINT ], отвергается.

Выполнение действияDROP CONSTRAINTприводит к отмене определения существующего табличного ограничения. Можно отменить определение только именованных табличных ограничений. СпецификацииRESTRICTиCASCADEосмыслены только в том случае, если отменяемое ограничение является ограничением возможного ключа (UNIQUEилиPRIMARY KEY)106). При указанииRESTRICTдействие отвергается, если на данный возможный ключ ссылается хотя бы один внешний ключ. При указанииCASCADEдействиеDROP CONSTRAINTвыполняется в любом случае, и все определения таких внешних ключей также отменяются.