У меня есть 2 таблицы:
1. Сотрудники
2. Ваучеры
Таблица сотрудников имеет один первичный ключ.
Таблица ваучеров имеет 3 ограничения внешнего ключа, ссылающиеся на таблицу Employees.
Ниже приведен пример сценария T-SQL (не фактического сценария таблицы) для создания обеих таблиц и их взаимосвязей в SQL Server:
IF OBJECT_ID('dbo.Vouchers') IS NOT NULL
DROP TABLE dbo.Vouchers
IF OBJECT_ID('dbo.Employees') IS NOT NULL
DROP TABLE dbo.Employees
GO
CREATE TABLE Employees
(
ObjectID INT NOT NULL PRIMARY KEY IDENTITY
)
CREATE TABLE Vouchers
(
ObjectID INT NOT NULL PRIMARY KEY IDENTITY,
IssuedBy INT,
ReceivedBy INT,
ApprovedBy INT,
CONSTRAINT fk_Vouchers_Employees_IssuedBy FOREIGN KEY (IssuedBy)
REFERENCES Employees (ObjectID)
ON UPDATE CASCADE
ON DELETE NO ACTION,
CONSTRAINT fk_Vouchers_Employees_ReceivedBy FOREIGN KEY (ReceivedBy)
REFERENCES Employees (ObjectID)
ON UPDATE CASCADE
ON DELETE NO ACTION,
CONSTRAINT fk_Vouchers_Employees_ApprovedBy FOREIGN KEY (ApprovedBy)
REFERENCES Employees (ObjectID)
ON UPDATE CASCADE
ON DELETE NO ACTION
)
Но выдается ошибка:
Msg 1785, Level 16, State 0, Line 7
Introducing FOREIGN KEY constraint 'fk_Vouchers_Employees_ReceivedBy' on table 'Vouchers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Я не представляю, какое эффективное решение доступно здесь. Требования к отношениям таковы: при каждом удалении сотрудника ваучер, который ссылается на некоторых его столбцов для сотрудника, не удаляется (ON DELETE CASCADE не вариант). Вместо этого значения столбцов (IssuedBy, ReceivedBy и / или ApprovedBy), на которые ссылается удаленный сотрудник, должны быть установлены в NULL (поскольку столбцы имеют значение NULLABLE).
Большое спасибо!