6

以下面的示例表为例:

CREATE TABLE [dbo].[tbl_Example](
    [PageID] [int] IDENTITY(1,1) NOT NULL,
    [RequireLogin] [bit] NOT NULL,
    [RequireAdmin] [bit] NOT NULL,
    [HideIfLoggedIn] [bit] NOT NULL
)

如何重写上述内容以包括检查约束,如下所示:

  • 如果为假,则强制为[RequireAdmin]在为时允许为,同时允许为和为[RequireLogin][RequireAdmin][RequireLogin][RequireLogin][RequireAdmin]
  • 仅当为False时才允许[HideIfLoggedIn]True[RequireLogin]
4

2 回答 2

9

您通常在检查中执行嵌套的 case 语句,以使该类型的逻辑起作用。请记住,支票中的案例必须仍然是评估,因此它将采用以下形式

CHECK (case when <exp> then 1 end = 1).

查看您的确切要求,但似乎这也可以工作并且可能更容易阅读:

 CREATE TABLE [dbo].[tbl_Example]
 (
    [PageID] [int] IDENTITY(1,1) NOT NULL,
    [RequireLogin] [bit] NOT NULL,
    [RequireAdmin] [bit] NOT NULL,
    [HideIfLoggedIn] [bit] NOT NULL
 )

 ALTER TABLE [dbo].[tbl_Example] ADD CONSTRAINT
     [RequireAdmin] CHECK 
      ((RequireAdmin = RequireLogin) OR 
      (RequireLogin=1));

 ALTER TABLE [dbo].[tbl_Example] ADD CONSTRAINT
      [HideIfLoggedIn] CHECK 
      ((RequireLogin=1 AND HideIfLoggedIn=0) OR 
       (RequireLogin=0 AND HideIfLoggedIn=1) OR 
       (RequireLogin=0 AND HideIfLoggedIn=0))
于 2013-03-11T00:08:06.493 回答
2

如果我的代数正确:

alter table dbo.Example
add constraint RequireAdmin_RequireLogin_ck
check ( not ( RequireAdmin = 'true' and RequireLogin = 'false' ) ) ;
alter table dbo.Example
add constraint HideIfLoggedIn_RequireLogin_ck
check ( not ( HideIfLoggedIn = 'true' and RequireLogin = 'true' ) ) ;

请注意,这些检查约束是在表级别而不是列级别定义的,因为它们必须引用多个列。由于这个原因,RThomas 的回答不是有效的 Transact-SQL!

于 2013-03-11T00:28:56.150 回答