表范围中具有特定值的约束列

时间:2012-04-09 13:46:15

标签: sql-server database-design domain-driven-design

基于Constraint for only one record marked as default,如果我想在表范围内获得相同的结果,那么视图和唯一聚簇索引的相同方法是否适用?

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

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

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

1 个答案:

答案 0 :(得分: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()约束即可。

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

考虑当用户尝试从此表中删除行时要执行的操作。 (尤其是系统帐户行。)然后考虑当数据库管理员尝试从该表中删除行时要执行的操作。

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