MS SQL Server contrainte de table croisée

J'ai trois tables:

1) Applications (AppId, Nom)
2) Écran (ScreenId, Nom)
3) Relation (AppId, ScreenId)

Maintenant, je veux appliquer certaines ressortingctions sur la table connexe: Le même écran peut être assigné à plusieurs applications, mais il ne peut pas y avoir deux écrans avec le même nom qui sont assignés à la même application.

Je sais que je peux append Screen.Name à la table de relation, puis créer PK sur AppId et Screen.Name, mais je ne veux pas une telle solution, puisque Screen.Name est sujet à changement.

Quelles options supplémentaires ai-je pour réaliser une telle ressortingction?

Vous pouvez créer une vue indexée basée sur les tables Relation et Screen et y appliquer une contrainte unique.

 create view DRI_UniqueScreens with SCHEMABINDING as select r.AppId,s.Name from [Schema].Relation r inner join [Schema].Screen s on r.ScreenId = s.ScreenId GO CREATE UNIQUE CLUSTERED INDEX IX_DRI_UniqueScreens on DRI_UniqueScreens (AppId,Name) 

Ce n'est pas une excellente solution, mais vous pouvez append des triggersurs à des tables d'écran et de relations qui vérifient simplement ce que vous avez modifié et qui répondent à vos critères, et inversement si ce n'est pas le cas.

 CREATE TRIGGER trgScreen ON Screen FOR INSERT, UPDATE AS BEGIN IF EXISTS (SELECT r.AppID, s.Name FROM Screen s INNER JOIN Relation r ON s.ScreenID = r.ScreenID GROUP BY r.AppID, s.Name HAVING count(*) > 1) ROLLBACK TRANSACTION END CREATE TRIGGER trgRelation ON Relation FOR INSERT, UPDATE AS BEGIN IF EXISTS (SELECT r.AppID, s.Name FROM Screen s INNER JOIN Relation r ON s.ScreenID = r.ScreenID GROUP BY r.AppID, s.Name HAVING count(*) > 1) ROLLBACK TRANSACTION END