5

Aşağıdaki örnek tablo atın:Kontrol Kısıtlama - başka bir sütun doğruysa yalnızca bir sütun gerçek olmasına izin

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

şöyle bir onay kısıtlamalar dahil etmek yukarıdaki yeniden çizeceğini nasıl

  • [RequireLogin]Yanlış (yani sadece [RequireAdmin]Gerçek 0 eğer olmasına izin ise Kuvvet [RequireAdmin]Yanlış olmakGerçekGerçek ve [RequireAdmin] Sadece [HideIfLoggedIn][RequireLogin] yılında Yanlış
+0

(1) [RequireAdmin] <= [RequireLogin]? (2) [RequireLogin] = 0 VEYA [HideIfLoggedIn] = 1? – wqw

cevap

6

Genellikle yapmak iç içe durum açıklamaları olduğunu Gerçek eğer olmasına izin Yanlış

  • olmak olmak [RequireLogin] imkan verirken olduğunu Bu tür bir mantığı çalışmak için kontrol edin. çek bir dava halen bir değerlendirme olması gerektiğini unutmayın, nedenle bu da çalışmaya devam eder görünüyor ve okunması muhtemelen daha kolay olduğunu ancak tam gereksinimleri göz önüne alındığı takdirde formu

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

    alacaktı:

    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)) 
    
  • +1

    Sonuncusu değiştirmek zorunda kaldı ((RequireLogin = 1 VE HideIfLoggedIn = 0) VEYA (RequireLogin = 0 VE HideIfLoggedIn = 1) VEYA (RequireLogin = 0 VE HideIfLoggedIn = 0)) - - evet, harika çalışıyor - şerefe – HeavenCore

    +0

    İyi, bu birleşik mantık mantığının geriye doğru olması her zaman kolaydır. – RThomas

    2

    doğru cebir varsa: bu kontrol kısıtlamaları tablo düzeyi olmayan kolon seviyesi tanımlanmış olduğu

    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')) ; 
    

    not, bunlar birden çok colum referans için gerektiği gibi ns. RThomas'ın cevabı bu nedenle Transact-SQL geçerli değil!

    +0

    İki şeyi öneriyorum: (1) 'NOT' kullanarak kısıtlamaları zorlamamaya çalıştığınız - yalnızca BIT karşılaştırmaları için boolean stili dize değişmezleri yerine 0 ve 1 kullanarak zihinsel olarak işleyiş şeklini tersine çevirir (2). –

    +0

    İkinize de katılmıyorum Aaron. Birincisi, örgütsel politikalar genellikle negatif olarak ifade edilir (ör. "Çalışanların çalışma saatleri içerisinde ebay'a girmesine izin verilmez"), aynı ifadeleri kullanarak kısıtlamaları yaratmak daha iyi bir okuduğunu anlama sağlar. İkincisi, bunlar booleanlardır - MSSQL'in bir boole veri türü olmadığı için bunlar sadece küçük bir alandır. Okuyucuyu "doğru" kullanmak, okuduğunu anlamak için daha iyidir, çünkü okuyucuya açıkça "doğruyu" aktarır. Buna karşılık, 0 ve 1 okuyucunun, 0'ın bu dilde yanlış mı yoksa doğru mu olduğunu hatırlamasını gerektirir. –

    +3

    Eh, istediğini yap, elbette. SQL Server'daki 16 yıllık deneyimden, bahsettiğim iki şeyin, sizin için ne kadar mantıklı olabileceğine bakılmaksızın, çoğu kullanıcı için kafa karıştırıcı olabileceğini söyleyebilirim. –

    İlgili konular