2011-05-19 55 views
0

通過編寫客戶端服務器應用程序,通常會在他需要執行查詢時根據哪個登錄用戶返回不同的記錄。Sql Server:條件表達式的替代條件

我使用這種方法,但我不知道是否有替代品,你可以建議嗎?

(我問的原因是,對於更多的complx查詢,這變得相當難以理解,而有些CASE聲明會更好)。

declare @UserIsAdministrator bit; 
declare @UserID integer; 
set @UserIsAdministrator = 0 -- test value 
set @UserID = 41;   -- test value 

SELECT * FROM employees 
WHERE 
    (@UserIsAdministrator = 1) -- if user is admin return all records 
    OR 
    (
     (@UserIsAdministrator = 0) 
    AND 
     (manager_ID = @UserID) 
    )       -- if user is not admin return only "his" records 
+0

好了,你可以專門簡化一個像:WHERE(@manager_ID = @userID或@UserIsAdministrator = 1)'...但如果它變得太c複雜的,我會與西門子的單獨查詢建議。您經常會發現,像這樣的查詢會逐漸從表中選擇不同的值,具體取決於角色,並且很快您會發現,您確實試圖編寫兩個查詢,就好像它們是一個查詢一樣,這很難維護。 – 2011-05-19 08:48:54

回答

1

選項:

IF和ELSE

IF @UserIsAdministrator = 1 
    SELECT * FROM employees 
ELSE 
    SELECT * FROM employees WHERE manager_ID = @UserID 

更改參數基於其他參數

IF @UserIsAdministrator = 1 
    SET @UserID = NULL 

SELECT * FROM employees 
WHERE manager_ID = ISNULL(@UserID, manager_ID) 

或不同的意見/存儲的特效

+0

謝謝,我選擇這個答案作爲回答,因爲它回答我的問題,即使正如Simen S所討論的那樣,回答這可能是用這種方式做事情的噩夢。但是,在處理遺留應用程序時,您無法從頭開始重寫架構。 – LaBracca 2011-05-19 09:16:49

2

我想我會盡量避免在SQL查詢中嵌入這種類型的授權。在選擇要執行的查詢之前,有單獨的查詢,並在單獨的圖層/組件中解析角色和權限。

+0

好,所以很可能取決於一個人的判斷,根據多少複雜的事情進行。謝謝。 – LaBracca 2011-05-19 08:57:12

+0

如果有直接的數據庫訪問,則可繞過任何客戶端安全。這是一個例子。數據安全性可能經常出現在數據庫層中,例如 – gbn 2011-05-19 09:05:15

+0

。但是,當事情變得非常精細時,在數據庫層中管理它非常複雜。 – LaBracca 2011-05-19 09:15:43