1

如果我想在表范围内获得相同的结果,基于仅标记为默认的一条记录的约束是否会应用相同的视图和唯一聚集索引方法?

我有一个名为 Accounts 的表。只能有一个系统帐户,但可以有多个合作伙伴和客户帐户。每种类型的帐户在列方面没有变化,而只是在类型列上有所不同。

ID | Type    | Name 
1    System    Contoso
2    Partner   Wingtip
3    Partner   Northwind
4    Client    Adventure Works
5    Client    Fabrikam

在上面我想阻止添加另一个系统帐户,但允许许多合作伙伴和客户帐户。感觉像是属于数据库而不是域的问题(也许我错了)?

4

1 回答 1

3

如果您知道系统帐户的 ID 号始终为 1,则可以使用 CHECK 约束来实现这一点。类似的东西。. .

create table accounts (
  id integer primary key,
  type varchar(15) not null,
  name varchar(15) not null,
  unique (type, name),
  check (
    (id = 1 and type = 'System') or
    (id <> 1 and type <> 'System')
  )
);

事实上,如果这是您的数据库,系统帐户可以有任何 ID 号。只需更改 CHECK() 约束以匹配。

如果您正在构建以部署到客户端站点,则可以在部署之前添加系统帐户。(无论您如何处理约束,您都可能应该这样做。)

想想当用户试图从这个表中删除行时该怎么做。(尤其是系统帐户行。)然后考虑当数据库管理员尝试从该表中删除行时该怎么做。

您可能可以使用外键约束(无级联)或触发器来防止数据库管理员意外删除系统帐户。管理员可能可以绕过这些限制,但如果她愿意走那么远来删除一行,你会希望她知道自己在做什么。

于 2012-04-09T14:04:39.140 回答