Заставьте SQL Server понять, что циклов нет - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть 2 таблицы, простой тест, который представляет собой реальный вариант использования, который мне нужен для моего реального приложения.Я сделал как можно проще выяснить, каким будет подходящее решение.

Эти 2 таблицы связаны через внешние ключи, в которых вторая таблица связывает 2 экземпляра объектов, объявленных в первой таблице.

Вот команды SQL Server для их создания

DROP TABLE IF EXISTS [dbo].[test_cycles2]
DROP TABLE IF EXISTS [dbo].[test_cycles1]

CREATE TABLE [dbo].[test_cycles1](
  [id_cycle] [int] IDENTITY(1,1) NOT NULL,
  [name] [varchar](100) NULL
  PRIMARY KEY([id_cycle])
)

INSERT INTO [dbo].[test_cycles1] (name) VALUES ('A'), ('B'), ('C'), ('D');


CREATE TABLE [dbo].[test_cycles2](
  [id_cycle1] [int] NOT NULL,
  [id_cycle2] [int] NOT NULL
PRIMARY KEY ([id_cycle1],[id_cycle2]),
CONSTRAINT c_unique CHECK ([id_cycle1] <> [id_cycle2]),
CONSTRAINT fk_cycles2_1 FOREIGN KEY (id_cycle1) REFERENCES [dbo].[test_cycles1] (id_cycle) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT fk_cycles2_2 FOREIGN KEY (id_cycle2) REFERENCES [dbo].[test_cycles1] (id_cycle) ON DELETE CASCADE ON UPDATE CASCADE
)

INSERT INTO [dbo].[test_cycles2] VALUES (1,2), (1,3), (2,4);

SELECT * FROM test_cycles1;
SELECT * FROM test_cycles2;

DELETE FROM test_cycles1 WHERE name = 'A';

SELECT * FROM test_cycles1;
SELECT * FROM test_cycles2;

Как видите, с вставками, которые я сделал, например:

Таблица [test_cycles2], этосвязывание объекта «A» с объектом «B» -> (INSERT VALUES 1,2).

Очевидно, не имеет значения, удаляю ли я «A» или «B» из [test_cycles1], вв обоих случаях [test_cycles2] необходимо удалить на каскаде, поскольку «A» больше не будет связан с «B».

Я понимаю, что SQL Server сообщает, что существует цикл возможный (который я попытался предотвратить , проверив ограничение, что «A» не может быть связано с «A»)

CONSTRAINT c_unique CHECK ([id_cycle1] <> [id_cycle2])

Единственное решение, которое я считаю возможным, - это создавать триггеры и выполнять эту работу для меня.Тем не менее, мне интересно, если это на самом деле является правильным решением ?Нет ли способа сообщить SQL Server , что циклов не будет , поскольку они никогда не будут совместно использовать один и тот же объект в обоих столбцах?

...