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
)

次のように、チェック制約を含めるために上記をどのように書き換えますか。

  • がFalseの場合は強制的[RequireAdmin]Falseになります(つまり、が True の場合にのみTrueなること許可し、TrueFalseの両方を許可します)[RequireLogin][RequireAdmin][RequireLogin][RequireLogin][RequireAdmin]
  • Falseの場合のみTrueであることを許可[HideIfLoggedIn]する[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 に答える