Проверка связи FK с помощью ограничений, триггера или дизайна - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь смоделировать несколько отношений и неоднократно сталкиваюсь с одной и той же проблемой для нескольких.

Что я пытаюсь сделать, либо с помощью проверочных ограничений, триггеров, либо перепроектированияТаблицы должны обеспечить «правильные» ссылки FK.

Рассмотрим следующую схему:

CREATE TABLE [dbo].[Customer]
    [CustomerID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED

CREATE TABLE [dbo].[Location]
    [LocationID] [int] IDENTITY(1,1) NOT NULL,
    [CustomerID] [int] NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Location] PRIMARY KEY CLUSTERED 
ALTER TABLE [dbo].[Location] ADD  CONSTRAINT [FK_Location_CustomerID_Customer] FOREIGN KEY([CustomerID]) REFERENCES [dbo].[Customer] ([CustomerID])

CREATE TABLE [dbo].[CustomerDivision]
    [CustomerDivisionID] [int] IDENTITY(1,1) NOT NULL,
    [CustomerID] [int] NOT NULL,
    [Name] [nvarchar](20) NOT NULL,
 CONSTRAINT [PK_CustomerDivision] PRIMARY KEY CLUSTERED
ALTER TABLE [dbo].[CustomerDivision] ADD  CONSTRAINT [FK_CustomerDivision_CustomerID_Customer] FOREIGN KEY([CustomerID]) REFERENCES [dbo].[Customer] ([CustomerID])

CREATE TABLE [dbo].[LocationDivision]
    [LocationDivisionID] [int] IDENTITY(1,1) NOT NULL,
    [LocationID] [int] NOT NULL,
    [CustomerDivisionID] [int] NOT NULL,
 CONSTRAINT [PK_LocationDivision_1] PRIMARY KEY CLUSTERED
ALTER TABLE [dbo].[LocationDivision] ADD  CONSTRAINT [FK_LocationDivision_LocationID_Location] FOREIGN KEY([LocationID]) REFERENCES [dbo].[Location] ([LocationID])


Divisions и Locations оба принадлежат Customers, но только выберите Divisions применить к конкретному Location.

Я изо всех сил пытаюсь найти простой способ гарантировать, что только LocationDivisons получит "действительную" CustomerDivisionID ссылку на внешний ключ, если CustomerDivision.CustomerID = Location.CustomerID

Добавление дополнительных пояснений

dbo.Customer(CustomerID,Name)
VALUES (1,Customer 1),
       (2,Customer 2)

dbo.Location(LocationID, CustomerID, Name)
VALUES (1,1,Location 1),
       (2,2,Location 2)

dbo.CustomerDivision(CustomerDivisionID, CustomerID, Name)
VALUES (1,1,Customer 1 Division 1),
       (2,1,Customer 1 Division 2)

dbo.LocationDivisionID(LocationDivisionID, LocationID, CustomerDivisionID)
VALUES (1,1,1),
       (2,2,1)   <---- This should fail as the this CustomerDivision.CustomerID <> Location.CustomerID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...