我需要帮助使用hierarchyid 数据类型并需要对 varchar 字段的唯一约束

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”。

有没有办法用约束来做到这一点?如果没有,是否有一种有效的方法来强制唯一性?

谢谢

孔夫子*_*孔夫子 5

如果您为祖先添加另一列,例如

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 设置。