Текущий архив: 2004.06.20;
Скачать: CL | DM;
Вниз
Как правильно задать ограничение на столбец? Найти похожие ветки
← →
31512 © (2004-05-26 10:33) [0]Вот пишу 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 10:48) [1]Тут нужен триггер ИМХО
← →
31512 © (2004-05-26 10:57) [2]
> Sandman25+1 (26.05.04 10:48) [1]
Может быть, но нельзя ли обойтись без триггеров?
← →
Sandman25+1 (2004-05-26 11:01) [3]Можно добавить поле OBJECT_CLASS, сделать составное foreign key (object, object_class) и поставить check (object_class = 1).
← →
slgeo © (2004-05-26 11:03) [4]Такую проверку чаще всего выносят в код приложения.
Можно организовать ее в триггере, но тогда придется обрабатывать исключения
← →
Fay © (2004-05-26 11:28) [5]2slgeo © (26.05.04 11:03) [4]
А в случае с кодом приложения остаётся только бамбук покуривать?
← →
31512 © (2004-05-26 12:48) [6]
> 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)
)
← →
Sandman25+1 (2004-05-26 12:53) [7][6] 31512 © (26.05.04 12:48)
Вроде все правильно. В чем вопрос? :)
← →
31512 © (2004-05-26 12:58) [8]
> Sandman25+1 (26.05.04 12:53) [7]
Вопроса нет, нужно было подтверждение, которое ты мне и дал. Проверил. Работает. Гарантии, конечно нет, но вроде пашет.
← →
Sandman25+1 (2004-05-26 14:03) [9]Тогда вот еще одно подтверждение - на моей прошлой работе использовалось нечто подобное, причем широко и долго. Никаких глюков замечено не было. Для каждого "object_classes" вызывался свой редактор справочника.
Страницы: 1 вся ветка
Текущий архив: 2004.06.20;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.034 c