Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.02 c
3-1085722879
Смертник
2004-05-28 09:41
2004.06.20
Помогите пожалуйста с DBGrid.


6-1083075208
2963
2004-04-27 18:13
2004.06.20
IP


9-1077688523
Rasp
2004-02-25 08:55
2004.06.20
Как прокрутить изображение экрана за игроком?????????


14-1086182913
XYZ
2004-06-02 17:28
2004.06.20
Работа со сканером штрих-кодов


6-1083021747
shek
2004-04-27 03:22
2004.06.20
Upload на сайт