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