2011-05-19 54 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