2015-05-26 61 views
1

我試圖創建必須包含一個密碼約束:密碼檢查約束SQL服務器

- 至少1大寫

- 至少1號

- 至少5個字符長

我尋覓了很多,我只是不能讓它工作

例如,我曾嘗試

(len([PASSWORD])>(5) AND [PASSWORD] like '%[0-9]%' AND [PASSWORD] like '%[A-Z]%') 

現在,它將如果密碼包含了一些接受它,但是當密碼不包含大寫可言,或僅首都也會接受它,這讓我困惑,我嘗試了多種組合

[password] LIKE '%[^a-zA-Z0-9]%' 

也沒有工作,我已經嘗試從計算器許多代碼片斷和人都將其標記爲回答,這使我懷疑,是不是我的一個問題還是我做錯了什麼?我很困惑,現在

(len([PASSWORD])>(5) AND [PASSWORD] like '%[A-Z]%' AND [PASSWORD] like '%[0-9]%') 

應該不允許密碼:「wefwefew123」吧?好吧,它的確如此。它不接受「wefwefew」,所以它可以在0-9上工作,A-Z有什麼問題?

這可能是一個愚蠢的錯誤,我可能會覺得後啞巴,但我解決不了我自己,千萬記住我無親;)

+3

有你,如果檢查你的桌子上整理/數據庫設置爲區分大小寫? –

+7

存儲密碼通常是一個非常糟糕的計劃 - 通常存儲(醃製)密碼散列效果更好 - 作爲獎勵意味着您不必設置最大密碼長度。那麼,密碼策略通常會在應用程序中更好地執行。 –

+1

我跟着此http://stackoverflow.com/questions/3296428/changing-sql-server-collat​​ion-to-case-insensitive-from-case-sensitive 和它原來是殼體insensative – stefan

回答

0

嘗試使用區分大小寫的排序規則幫助你與它的小寫版本進行比較的密碼就像下面使用代碼:

(len([PASSWORD])>(5) AND [PASSWORD] like '%[0-9]%' 
AND [PASSWORD] <> Lower([PASSWORD]) COLLATE Latin1_General_CS_AI) 

還是我自己的例子是這樣的:

Declare @Password varchar(20) = 'Hello' 
if @Password <> Lower(@Password) COLLATE Latin1_General_CS_AI 
    PRINT 'Upper' 
else 
    PRINT 'lower' 
+0

我試圖有一個大寫字母和數字的組合,這段代碼只接受它的唯一小寫示例: Password1 =正確 password1 =不正確 Password =不正確 – stefan

+0

我從測試中遺留在=中的歉意。它的意思是<>更新應該現在工作 –

+0

非常感謝,它現在有效。欣賞它;) – stefan