Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно задать ограничение на столбец? [D7, MSSQL]


31512 ©   (2004-05-26 10:33:00) 

Вот пишу SQL script на создание таблиц в БД.

create table [OBJECT_CLASSES](
ID_CLASS int not null primary key,
CLASS_NAME nvarchar (4000) collate Cyrillic_General_CI_AS not null default 'Default class',
CLASS_DESCRIPTION nvarchar (4000) collate Cyrillic_General_CI_AS not null default 'No description'
)

insert into [OBJECT_CLASSES] values (1, 'Организация', 'Обьект, который может быть организацией')
insert into [OBJECT_CLASSES] values (2, 'Население', 'Обьект, который не может быть организацией')

create table [OBJECTS](
ID_OBJECT int not null primary key,
AOBJECT_NAME nvarchar (4000) collate Cyrillic_General_CI_AS not null default 'Нет данных',
OBJECT_CLASS int not null foreign key references [OBJECT_CLASSES](ID_CLASS) on delete cascade,
DBDATE datetime not null default CURRENT_TIMESTAMP,
DELETED bit not null default 0
)

create table [ORGANISATION](
ID_ORGANISATION int not null primary key,
AOBJECT int not null foreign key references [OBJECTS](ID_OBJECT) on delete cascade,
ORGANISATION_ADRESS nvarchar (4000) collate Cyrillic_General_CI_AS not null default 'Нет данных',
ORGANISATION_CODE nvarchar (4000) collate Cyrillic_General_CI_AS not null default 'Нет данных',
PHONE_NUMBER nvarchar (4000) collate Cyrillic_General_CI_AS not null default 'Нет данных',
DIRECTOR_NAME nvarchar (4000) collate Cyrillic_General_CI_AS not null default 'Нет данных',
.
.
.
DBDATE datetime not null default CURRENT_TIMESTAMP,
DELETED bit not null default 0
constraint AOBJECT_CONSTRAINT check AOBJECT = ???
)

Как правильно написать ограничение там, где "???" ?
Суть его такова, что бы не позволять пользователю подставлять в поле AOBJECT таблицы ORGANISATION такие значения ID_OBJECT таблицы OBJECTS, у которых OBJECT_CLASS не равен 1 (т.е.  значения ID_CLASS таблицы OBJECT_CLASSES, у которых CLASS_NAME не равен "Организация").
Вот обложился книжками, Help открыл. Запутался изрядно...


Sandman25+1   (2004-05-26 14:03:00) [1]

Тогда вот еще одно подтверждение - на моей прошлой работе использовалось нечто подобное, причем широко и долго. Никаких глюков замечено не было. Для каждого "object_classes" вызывался свой редактор справочника.


31512   (2004-05-26 12:58:00) [2]


> Sandman25+1   (26.05.04 12:53) [7]

Вопроса нет, нужно было подтверждение, которое ты мне и дал. Проверил. Работает. Гарантии, конечно нет, но вроде пашет.


Sandman25+1   (2004-05-26 12:53:00) [3]

[6] 31512 ©   (26.05.04 12:48)

Вроде все правильно. В чем вопрос? :)


31512   (2004-05-26 12:48:00) [4]


> Sandman25+1   (26.05.04 11:01) [3]

Анализировал твоё предложение и во что получилось

create table [OBJECT_CLASSES](
ID_CLASS int not null primary key,
CLASS_NAME nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Default class',
CLASS_DESCRIPTION nvarchar (500) collate Cyrillic_General_CI_AS not null default 'No description'
)

insert into [OBJECT_CLASSES] values (1, 'Организация', 'Обьект, который может вступать во все отношения')
insert into [OBJECT_CLASSES] values (2, 'Население', 'Обьект, который может быть только потребителем')

create table [OBJECTS](
ID_OBJECT int not null,
OBJECT_CLASS int not null references OBJECT_CLASSES (ID_CLASS),
AOBJECT_NAME nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Нет данных',
DBDATE datetime not null default CURRENT_TIMESTAMP,
DELETED bit not null default 0,
CONSTRAINT UPKCL_OBJECTS PRIMARY KEY CLUSTERED (ID_OBJECT, OBJECT_CLASS)
)

create table [ORGANISATION](
ID_ORGANISATION int not null primary key,
AOBJECT int not null,
AOBJECT_CLASS int not null,
ORGANISATION_ADRESS nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Нет данных',
ORGANISATION_CODE nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Нет данных',
PHONE_NUMBER nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Нет данных',
DIRECTOR_NAME nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Нет данных',
LICENCE_NUMBER nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Нет данных',
LICENCE_DATA_CREATE datetime null,
LICENCE_DATA_CLOSE datetime null,
LICENCE_CREATOR nvarchar (500) collate Cyrillic_General_CI_AS not null default 'Нет данных',
DBDATE datetime not null default CURRENT_TIMESTAMP,
DELETED bit not null default 0,
CONSTRAINT FK_OBJECT_ FOREIGN KEY (AOBJECT, AOBJECT_CLASS)
  REFERENCES OBJECTS (ID_OBJECT, OBJECT_CLASS),
CHECK (AOBJECT_CLASS = 1)
)


Fay   (2004-05-26 11:28:00) [5]

2slgeo ©   (26.05.04 11:03) [4]
А в случае с кодом приложения остаётся только бамбук покуривать?


slgeo   (2004-05-26 11:03:00) [6]

Такую проверку чаще всего выносят в код приложения.
Можно организовать ее в триггере, но тогда придется обрабатывать исключения


Sandman25+1   (2004-05-26 11:01:00) [7]

Можно добавить поле OBJECT_CLASS, сделать составное foreign key (object, object_class) и поставить check (object_class = 1).


31512   (2004-05-26 10:57:00) [8]


> Sandman25+1   (26.05.04 10:48) [1]

Может быть, но нельзя ли обойтись без триггеров?


Sandman25+1   (2004-05-26 10:48:00) [9]

Тут нужен триггер ИМХО


Наверх

Титульная страница Поиск, карта сайта Написать письмо