![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно задать ограничение на столбец? [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]Тут нужен триггер ИМХО