Всем доброго времени суток!
Нужен совет по следующему вопросу:
В базе данных есть три таблицы:
CREATE TABLE Personalities_T (
Person_id SmallInt NOT NULL,
Fullname NVarChar(66) NOT NULL,
PRIMARY KEY (Person_id)
);
CREATE TABLE Workshops_T (
Workshop_id tinyint NOT NULL,
Workshop_name NVarChar(100) NOT NULL,
Foreman_id SmallInt,
PRIMARY KEY (Workshop_id),
CHECK (Workshop_id BETWEEN 1 AND 99),
CONSTRAINT UK_Workshop_name UNIQUE (Workshop_name),
CONSTRAINT UK_Foreman_id UNIQUE (Foreman_id),
CONSTRAINT FK_Foreman_id FOREIGN KEY (Foreman_id)
REFERENCES Personalities_T (Person_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
CREATE TABLE Sectors_T (
Sector_id TinyInt NOT NULL,
Sector_Name NVarChar(100) NOT NULL,
Sector_chief_id SmallInt,
Workshop_id TinyInt NOT NULL, --NOT NULL?
PRIMARY KEY(Sector_id),
CHECK (Sector_id BETWEEN 101 AND 255),
CONSTRAINT UK_Sector_chief_id UNIQUE (Sector_chief_id),
CONSTRAINT FK_Sector_chief_id FOREIGN KEY (Sector_chief_id)
REFERENCES Personalities_T (Person_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT FK_Workshop_id FOREIGN KEY (Workshop_id)
REFERENCES Workshops_T (Workshop_id)
ON DELETE CASCADE
ON UPDATE CASCADE
);
При компиляции выдало сообщении
Сообщение 1785, уровень 16, состояние 0, строка 48
Introducing FOREIGN KEY constraint 'FK_Workshop_id' on table 'Sectors_T' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Сообщение 1750, уровень 16, состояние 1, строка 48
Could not create constraint or index. See previous errors.
При просмотре зависимостей нашел, что связь таблицы Personalities_T по первичному ключу person_id с таблицами workshops_T и Sectors_T с внешними ключами foreman_id и sector_chef_id соответственно (они же здесь и уникальные) скорее всего и вызывает данную ошибку. Если убрать каскадное delete и update для одного из внешних ключей в таблицах workshops_T или Sectors_T - запрос на создание всех таблиц в базе данных выполняется без ошибок.
Первый вопрос: можно ли что-нибудь сделать в данной ситуации, оставив каскадное удаление?
Суть связи в том, что есть условное производственное предприятие, где у каждого сотрудника есть индивидуальный табельный номер и полное имя (Personalities_T), причем он может быть либо начальником цеха (Workshops_T) либо мастером участка (Sectors_T), но никак не может занимать одновременно две данные должности. У участка или цеха временно может не быть руководителя (NULL), допустим в случае если сотрудниу уволился, но еще не успели назначить нового руководителя.
Отсюда второй вопрос: как можно запретить присутствие одного и того же табельного номера person_id (from Personalities_T) одновременно в таблицах с начальниками цеха (Workshops_T) и мастерами (Sectors_T)?
Спасибо за внимание.
UPD: подозреваю, что нужна какая-то промежуточная таблица