我有以下数据库模式:
用户表存储登录的用户。字段“overridetemplate”是一个布尔值,告诉我们是否获取用户安全模板信息或用户覆盖信息。
user_access 表将用户与security_template(如用户角色)相关联。
security_template 表包含安全模板信息(例如:高级用户等)
security_template_exception 包含对模板具有访问权限的所有操作(例如:“insert_user”,访问类型为“FullAccess”,“delete_user”,访问类型为“拒绝”)
因此,这样一来,用户就拥有了一个角色或安全模板,并且该模板有一堆带有该用户访问类型的“操作”。
然后,我有一个额外的表, user_override_template ,它是为覆盖安全模板而创建的,然后您可以为用户分配单独的操作权限,而不会影响完整的安全模板。
只有3种类型的“accessstype:”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
查询结果如下:
所以,我需要的是依赖字段“overridetemplate”我应该从“user_override_template”或“security_template_exception”获取访问信息。
有关如何不使用的任何线索(我想在一次选择中执行此操作):
IF @overridetemplate = 1
BEGIN
END
ELSE
BEGIN
END
答案 0 :(得分: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
以防止在没有行的情况下进行不必要的过滤。