Как найти и обратиться к объекту БД Домен / DOMAIN?

Очень мало информации нашел о таких объектах как "домены".

Я знаю, что это примерно (маш. перевод: What is domain type in SQL?):

Доменом является определенный пользователем, названный набор значений. Когда вы объявляете столбцы в таблице SQL или параметры для хранимой процедуры, вы можете использовать домен вместо встроенного типа данных SQL, а затем этот столбец или параметр ограничивается значениями, которые удовлетворяют домену.

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


Ответы (1 шт):

Автор решения: 0xdb

Начнём с термина Домен (domain) в контексте БД, цитирую:

Домен в реляционной модели данных — тип данных, то есть множество допустимых значений.

Этот термин относится более к этапу анализа и дизайна логической модели БД.

В стандарте SQL-92 появилась возможность создать домен предложением CREATE DOMAIN. Но это предложение реализовано только в некоторых СУБД, например, PostgreSQL.

В СУБД Oracle предложение CREATE DOMAIN отсутствует, поэтому вместо термина домен, чаще в ходу термин -- ограничение (constraint, contrained data type). Самые часто используемые ограничения (например, по длине, набору символов) реализованны во встроенных типах данных Built-in Data Types.


Как же реализуются заложеные в логической модели данных домены, например -- пол персоны, широко известный как МЖ.

Набор данных для тех, кто всё хочет попробовать сам:

insert into person values ('Маша', 'f');
insert into person values ('Паша', 'm');
insert into person values ('Саша', null);
insert into person values ('Мики', 'd');

Check Constraints

create table person (
    name varchar2 (32), gender char (1),
    constraint chk_gender check (gender in ('f','m')));

В случае вставки недопустимого значения:

ORA-02290: check constraint (DB.CHK_GENDER) violated

Referential Integrity Constraint (Foreign Key)

Несколько не в ногу со временем, но ранее широко практиковалось хранить допустимые значеия в отдельной таблице:

create table gender (val char (1) primary key);
insert into gender select trim (column_value) from xmlTable ('"f","m"');

create table person (
    name varchar2 (32), gender char (1),
    constraint fk_gender foreign key (gender) references gender (val));

В случае вставки недопустимого значения:

ORA-02291: integrity constraint (DB.FK_GENDER) violated - parent key not found

User-Defined Types

Пользовательский тип данных с ограничением можно будет использовать как в SQL, так и PL/SQL контексте. Хороший пример есть уже в этой теме. Для случая с МЖ:

create or replace type genderType as object (
    val char (1),
    constructor function genderType (val char) return self as result) final
/
create or replace type body genderType as
    constructor function genderType (val char) return self as result is
    begin 
        if val not in ('f','m') then 
            raise_application_error (-20000, 'illegal gender value >'||val||'<'); end if;  
        self.val := val;
        return;
    end;
end;    
/
declare 
    gender constant genderType := genderType ('d');
begin null; end;
/

ORA-20000: illegal gender value >d<

→ Ссылка