0

我有以下数据库架构:

在此处输入图像描述

用户表存储登录的用户。字段“overridetemplate”是一个布尔值,让我们知道我们是否获得了用户安全模板信息或用户覆盖信息。

user_access表将用户关联到 security_template(如用户角色)。

security_template表具有安全模板信息(例如:高级用户等)

security_template_exception具有其对模板的访问权限的所有操作(例如:访问类型为“FullAccess”的“insert_user”,访问类型为“Deny”的“delete_user”)

因此,这样一个用户就有了一个角色或安全模板,并且该模板有一堆“操作”,该用户的访问类型。

然后,我有一个额外的表user_override_template,它是为覆盖安全模板而创建的,然后您可以将单独的操作权限分配给用户,而不会影响完整的安全模板。

“accesstype”只有 3 种类型:“FullAccess”、“ReadOnly”和“Deny”。

现在,带来安全操作访问权限的查询如下:

SELECT
                        ste.[objectid], ste.[accesstype]
                    FROM
                        [user] AS u
                        JOIN [users_access] AS ua ON u.[userid] = ua.[userid]
                        JOIN [security_template] AS st ON ua.[templateid] = st.[templateid]
                        JOIN [security_templates_exceptions] AS ste ON st.[templateid] = ste.[templateid]
                    WHERE
                        su.[userid] = @userid

查询的结果是这样的:

在此处输入图像描述

因此,我需要依赖于“覆盖模板”字段,我应该从“user_override_template”或“security_template_exception”获取访问信息。

关于如何在不使用的情况下执行此操作的任何线索(我想在一次选择中执行此操作):

IF @overridetemplate = 1
BEGIN

END
ELSE
BEGIN

END
4

1 回答 1

0

您在select子句中进行连接并选择您想要的:

SELECT (case when @UseSecurityTemplate = 'Y' then ste.[objectid]
             else uto.objectid
        end) as objectid
       (case when @UseSecurityTemplate = 'Y' then ste.[accesstype]
             else uto.accesstype
        end) as AccessType
FROM [user] AS u
     LEFT JOIN [users_access] AS ua ON u.[userid] = ua.[userid]
     LEFT JOIN [security_template] AS st ON ua.[templateid] = st.[templateid]
     LEFT JOIN [security_templates_exceptions] AS ste ON st.[templateid] = ste.[templateid]
     LEFT JOIN [user_override_template] AS uot ON ua.[templateid] = uot.[templateid]
WHERE su.[userid] = @userid;

left outer join当周围没有行时,我将连接切换到以防止不需要的过滤。

于 2013-07-28T16:41:58.790 回答