Sql-Server

我需要幫助使用 hierarchyid 數據類型並需要對 varchar 欄位進行唯一約束

  • December 5, 2012

我想使用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
   )

我的問題是我需要能夠要求 refname 是唯一的,但只能在它所在的容器內。因為我使用它來表示伺服器,所以我想模擬各種 DNS 樹,但添加其他層它也是。我的例子如下:

   ROOT
   | something.com
   || www
   ||| index.html
   || staging
   ||| testbed.php
   | someotherthing.com
   || test
   ||| index.html

我想確保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
);

您可以確保每個父母只有一個“www”。您可以為“index.html”創建一個類似的索引。

create unique index ux_tbl_server_group_1 on tbl_server_group(reflvl1id, refname)
where refname = 'www';

顯然,這不僅僅是第一級(www)和www(index.html)的子級,但我不明白為什麼擴展的限制不起作用。

如果您必須完全按照指定的方式實現它,那麼您將不得不求助於使用觸發器。

注意:這利用了 SQL Server 的過濾索引,因此您必須為任何接觸此表的程序正確設置 SET。

引用自:https://dba.stackexchange.com/questions/29835