Ale*_*win 6 sql-server-2008 sql-server constraint hierarchy
我想使用hierarchyid标识符将一堆具有父->子->孙关系的表解析为单个表。这是我根据我所拥有的得出的。
CREATE TABLE [dbo].[tbl_server_group]
(
[refid] [int] IDENTITY(1,1) NOT NULL,
[refhid] [hierarchyid] NOT NULL,
[reflvl] AS refhid.GetLevel() PERSISTED,
[refdate] [datetime] NOT NULL DEFAULT GETDATE(),
[refname] [varchar](50) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
我的问题是我需要能够要求 refname 是唯一的,但只能在它所在的容器内。由于我使用它来表示服务器,我想模拟各种 DNS 树,但添加其他层它也是。我的例子如下:
ROOT
| something.com
|| www
||| index.html
|| staging
||| testbed.php
| someotherthing.com
|| test
||| index.html
Run Code Online (Sandbox Code Playgroud)
我想确保something.com 只有一个“www”,而www 只有一个“index.html”。
有没有办法用约束来做到这一点?如果没有,是否有一种有效的方法来强制唯一性?
谢谢
如果您为祖先添加另一列,例如
CREATE TABLE [dbo].[tbl_server_group]
(
[refid] [int] IDENTITY(1,1) NOT NULL,
[refhid] [hierarchyid] NOT NULL,
[reflvl] AS refhid.GetLevel() PERSISTED,
[refdate] [datetime] NOT NULL DEFAULT GETDATE(),
[refname] [varchar](50) NOT NULL,
[reflvl1id] AS refhid.GetAncestor(1) PERSISTED
);
Run Code Online (Sandbox Code Playgroud)
您可以确保每个父级只有一个“www”。您可以为“index.html”创建一个类似的索引。
create unique index ux_tbl_server_group_1 on tbl_server_group(reflvl1id, refname)
where refname = 'www';
Run Code Online (Sandbox Code Playgroud)
显然,这不仅仅是第一级 (www) 和www
(index.html) 的子级,但我不明白为什么扩展的限制不起作用。
如果您必须完全按照指定的方式实现它,那么您将不得不求助于使用触发器。
注意:这利用了 SQL Server 的筛选索引,因此您必须为接触此表的任何进程获取正确的 SET 设置。