2017-05-09 35 views
-2

我有一個使用案例,其中我必須從passwordhistory表中獲取最後五個密碼,並且在檢索五個記錄之後,有兩列第一個md5加密,第二個是散列,然後我有將這些列與新密碼進行比較,將它們從md5和哈希函數中移出後,如果發現任何記錄,則返回true,否則返回false。如何使用以下用例在SQL中獲取記錄

DECLARE @UserID INT = 6 
DECLARE @Password NVARCHAR(200)='admin1952' 


SELECT * 
FROM (SELECT TOP 5 
        ChangedPassword AS ChangedPassword , 
        PasswordChangeHistory.Password_Hash AS Password_Hash 
      FROM  PasswordChangeHistory WITH (NOLOCK) 
        INNER JOIN [User] U WITH (NOLOCK) ON PasswordChangeHistory.UserID = U.Id 
      WHERE  PasswordChangeHistory.UserID = @UserID 
     ) AS result  
WHERE PasswordChangeHistory.ChangedPassword = dbo.Encrypt_MD5(@Password) 
+0

什麼與選擇頂部(5)?你知道如果返回任何行,返回的最後一行將被分配給changedpassword? @密碼永遠不會分配一個值,它會傳遞給encrypt_md5?我們是否缺少一些代碼? –

+0

你目前的嘗試有什麼問題? –

+0

它不返回真/假。 – xQbert

回答

1

要回答在主題行的問題,這裏是你能做到這一點(在僞代碼)的一種方法:

IF EXISTS({your query to return a match from the last 5 passwords}) 
    SELECT 1; 
ELSE 
    SELECT 0; 

或者你當然可以代替1和0與「真」和'假如這就是你真正想要的。

+0

但我的查詢還沒有返回任何東西,我需要滿足我需要的那個查詢 – SajidBp

0

您也可以查詢後嘗試:

if @@rowcount >0 
    select 'user found' 
else 
    select 'user not found' 
0

這裏是問題的解決方案。正如我之前解釋過的,我需要從表中獲取五條記錄,然後使用現有的五條記錄檢查新密碼,如果此新密碼與前一條記錄匹配,則返回false,否則返回true。

DECLARE @UserID INT = 6 
DECLARE @Password NVARCHAR(200)= 'admin1958' 
SELECT * FROM 
(SELECT TOP(5) ChangedPassword AS Changed ,PasswordChangeHistory.Password_Hash AS Password_Hash 

      FROM  PasswordChangeHistory WITH (NOLOCK) 
        INNER JOIN [User] U WITH (NOLOCK) ON PasswordChangeHistory.UserID = U.Id 
      WHERE  PasswordChangeHistory.UserID = @UserID 
      ORDER BY PasswordChangeHistory.ID DESC 

) AS result 

WHERE result.Changed= dbo.Encrypt_MD5(@Password) or result.Password_Hash = dbo.Encrypt_SHA2(@Password) 
+0

如果這是答案,請將其標記爲這樣來結束問題。 –

+0

我今天沒有權限,明天就做這個。 – SajidBp

相關問題