Я хочу иметь деталь с уникальным именем для региона, а не только для фабрики.,,[и] убедитесь, что Part.Factory.Region.Id всегда совпадает с Part.Region.Id, несмотря ни на что?
Вы делаете ключ Factory (RegionID, FactoryID) и ключ Part (RegionID, FactoryID, PartID).Таким образом, Часть относится к Фабрике с использованием внешнего ключа (RegionID, FactoryID).
Это гарантирует, что RegionID Части всегда совпадает с RegionID Фабрики детали.
Затем, чтобы сделать Part.Name уникальным в пределах региона, добавьте уникальный индекс для детали (RegionID, Name).
Работая непосредственно с SQL Server (или базой данных SQL Azure), вы можетесоздайте уникальный индекс в индексированном представлении , а также вообще не используйте столбец RegionID для детали.EG:
use tempdb
go
drop table if exists Part
drop table if exists Factory
drop table if exists Region
go
create table Region(RegionID int primary key);
create table Factory(FactoryID int primary key, RegionID int references Region);
create table Part(PartID int primary key, FactoryID int references Factory, Name varchar(200));
go
create view vRegionPartName
with schemabinding
as
select r.RegionID, p.Name PartName
from dbo.Region r
join dbo.Factory f
on r.RegionID = f.RegionID
join dbo.Part p
on p.FactoryID = f.FactoryID
go
create unique clustered index pk_vRegionPartName
on vRegionPartName(RegionID,PartName)
go
insert into Region(RegionID) values (1)
insert into Factory(FactoryID,RegionID) values (1,1)
insert into Factory(FactoryID,RegionID) values (2,1)
insert into Part(PartID,FactoryID,Name) values (1,1,'Part1')
insert into Part(PartID,FactoryID,Name) values (2,2,'Part1')
--fails with
--Msg 2601, Level 14, State 1, Line 36
--Cannot insert duplicate key row in object 'dbo.vRegionPartName' with unique index 'pk_vRegionPartName'. The duplicate key value is (1, Part1).