В некоторых ситуациях, когда зависимости обращаются к весьма статичным таблицам, чьи имена являются меньшими в алфавитной последовательности (gbak восстанавливает таблицы в алфавитном порядке), такое условие CHECK может быть весьма сомнительным. Проблема остается, если домен не управляет порядком, в котором происходит сохранение данных в таблицах за пределами событий проверки данных, вводимых для столбцов.
! ! !
СОВЕТ. Другим пониманием данной техники является сложность (или невозможность) для вспомогательных программ извлекать непробиваемые бомбами скрипты SQL из системных таблиц. Может наступить такое время, когда ваша работа усложнится из-за необходимости правильного извлечения скриптов SQL из базы данных!
. ! .
Если вам совершенно необходимо использовать этот вид условий проверки, обратитесь к дополнительным условиям при объявлении столбца. Лучше оцените все альтернативы- включая ручное кодирование ссылочных триггеров в случаях, когда внешние ключи для ссылочных полей приведут к проблемам избирательности (селективности) индексов [30] Чтобы понять эти тонкости, обратитесь к разд. "Темы оптимизации" главы 18.
.
Атрибут CHARSET/CHARACTER SET
Для систем, которым нужно множество наборов символов внутри одной базы данных, объявление доменов, связанных с наборами символов для всех ваших символьных столбцов (CHAR, VARCHAR SUB_TYPE 1 и массивов символьных типов), может быть очень элегантным способом работы. Синтаксис определения набора символов можно посмотреть в предыдущей главе.
Предложение COLLATE в операторе создания домена задает явную последовательность сортировки для доменов CHAR и VARCHAR. Вы должны выбрать порядок сортировки, который поддерживается набором символов, объявленным наследуемыми и предполагаемым для домена.
Синтаксис определения COLLATE см. в главе 11. Список последовательностей сортировки, доступных для каждого набора символов, см. в приложении 8.
Использование доменов в определении столбца
В некоторой базе данных есть домен SYSUSER, размером до 31 символа, имеющий значение по умолчанию, получаемое из контекстной переменной CURRENT_USER:
CREATE DOMAIN SYSUSER AS VARCHAR(31) DEFAULT CURRENT_USER;
Объявляемая таблица содержит столбец UPDATED_BY, который использует домен
SYSUSER:
CREATE TABLE LOANS (
LOAN_DATE DATE,
UPDATED_BY SYSUSER,
LOAN_FEE DECIMAL(15,2));
Клиент содержит оператор INSERT для таблицы LOANS:
INSERT INTO LOANS (LOAN_DATE, LOAN_FEE)
VALUES (116-MAY-20041, 10.75);
Поскольку этот оператор не содержит столбец UPDATED BY в списке столбцов, Firebird автоматически задает имя текущего пользователя ALICEFBIRD:
SELECT * FROM LOANS;
вернет
16-MAY-2004 ALICEFBIRD 10.75
! ! !
ПРИМЕЧАНИЕ. Здесь уместно напомнить, что значения по умолчанию для домена и столбца применяются только при добавлении и только если столбец, имеющий значение по умолчанию, отсутствует во входном списке оператора INSERT. Триггеры имеют более надежные способы реализации значений по умолчанию. Техники обсуждаются в главе 31.
. ! .
Переопределения в доменах
Столбцы, созданные с использованием доменов, могут переопределять некоторые наследуемые от домена атрибуты, заменяя наследуемый атрибут эквивалентным предложением атрибута. Определение столбца также может добавлять другие атрибуты. В табл. 13.1 описано, какие атрибуты могут, а какие не могут быть переопределены.
Таблица 13.1. Переопределение атрибутов доменов и столбцов
Атрибут
|
Переопределяется?
|
Замечания
|
Тип данных
|
Нет
|
|
DEFAULT
|
Да
|
|
CHARACTER SET
|
Да
|
Также может использоваться, чтобы восстановить для столбца значения по умолчанию базы данных
|
COLLATE
|
Да
|
|
CHECK
|
Нет
|
Используйте предложение CHECK в операторе CREATE или ALTER TABLE для добавления в проверку новых условий
|
NOT NULL
|
Нет
|
Атрибут NOT NULL на уровне домена не может быть переопределен на уровне столбца. Во многих случаях лучше оставить для домена возможность пустого значения и добавлять ограничение NOT NULL для столбцов, где это необходимо, в операторе CREATE или ALTER TABLE
|
Следующий оператор демонстрирует, как расширяется список атрибутов столбца, основанного на домене, созданного в одном из предыдущих примеров:
CREATE DOMAIN TEL_NUMBER
AS VARCHAR(18)
CHECK(VALUE LIKE '(0%)%');
Скажем, мы хотим определить таблицу, содержащую столбец с номером телефона. Нам нужны атрибуты домена, но нам также необходимо обеспечить, чтобы нецифровые символы вводились в верхнем регистре:
Читать дальше