我想使用 hierarchyid 标识符将一堆具有 parent->child->grandchild 关系的表解析为一个表。这是我根据自己的想法得出的结论。
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
)
我的问题是我需要能够要求 refname 是唯一的,但只能在它所在的容器内。因为我用它来表示服务器,所以我想模拟某种 DNS 树,但将其他层添加到它也是。我的例子如下:
ROOT
| something.com
|| www
||| index.html
|| staging
||| testbed.php
| someotherthing.com
|| test
||| index.html
我想确保 something.com 只有一个“www”,而 www 只有一个“index.html”。
反正有约束来做到这一点吗?如果不是,是否有一种有效的方法来强制唯一性?
谢谢
如果您为祖先添加另一列,例如
您可以确保每个父母只有一个“www”。您可以为“index.html”创建一个类似的索引。
显然,这比第一级 (www) 和
www
(index.html) 的子级更进一步,但我不明白为什么扩展限制不起作用。如果您必须完全按照指定的方式实施它,那么您将不得不求助于使用触发器。
注意:这利用了 SQL Server 的过滤索引,因此您必须为接触此表的任何进程获取正确的 SET 设置。