我有三个表:
1)应用(的AppId,名称)
2)屏幕(ScreenId,名称)
3)关系式(的AppId,ScreenId)
现在,我想申请对相关表中的一些限制:同一个屏幕可以被分配到多个应用程序,但不能有两个屏幕具有相同名称分配给同一个应用程序。
我知道我可以添加到Screen.Name关系表,然后在的AppId和Screen.Name创建PK,但我不希望这样的解决方案,因为Screen.Name是随时可能更改。
我有什么额外的选项来实现这样的限制?
我有三个表:
1)应用(的AppId,名称)
2)屏幕(ScreenId,名称)
3)关系式(的AppId,ScreenId)
现在,我想申请对相关表中的一些限制:同一个屏幕可以被分配到多个应用程序,但不能有两个屏幕具有相同名称分配给同一个应用程序。
我知道我可以添加到Screen.Name关系表,然后在的AppId和Screen.Name创建PK,但我不希望这样的解决方案,因为Screen.Name是随时可能更改。
我有什么额外的选项来实现这样的限制?
您可以创建一个索引视图基础上的Relation
和Screen
表和申请的唯一约束存在。
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)
这不是一个很好的解决方案,但你可以添加触发器筛选和关系表刚刚检查你修改了哪些符合你的标准,如果没有回滚。
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