Sql server 在SQL Server存储过程中组合查询

Sql server 在SQL Server存储过程中组合查询,sql-server,stored-procedures,Sql Server,Stored Procedures,我希望在存储过程中结合来自用户的权限及其角色。为此,目前我正在运行许多查询。第一个获取用户拥有的角色。然后查询以获取每个角色的权限。然后执行一个查询以获取用户的权限。然后我从代码中将它们组合起来。我希望能够从存储过程中完成这一切。我从未使用过存储过程,所以我不知道这是否可能 希望这个图表能帮助你理解我在做什么 我开始写一个,但它还没有接近完成或功能 CREATE PROCEDURE get_privileges @userId INT AS SET NOCOUNT ON;

我希望在存储过程中结合来自用户的权限及其角色。为此,目前我正在运行许多查询。第一个获取用户拥有的角色。然后查询以获取每个角色的权限。然后执行一个查询以获取用户的权限。然后我从代码中将它们组合起来。我希望能够从存储过程中完成这一切。我从未使用过存储过程,所以我不知道这是否可能

希望这个图表能帮助你理解我在做什么

我开始写一个,但它还没有接近完成或功能

CREATE PROCEDURE get_privileges
    @userId INT
AS
    SET NOCOUNT ON;

    SELECT 
        role_id 
    FROM 
        user_role 
    INNER JOIN 
        role ON user_role.role_id = role.id 
    WHERE 
        user_id = @userId;

    -- For each role
    SELECT 
        privilege_id as id, name 
    FROM 
        role_privilege 
    INNER JOIN 
        privilege ON role_privilege.privilege_id = privilege.id 
    WHERE 
        role_id = ${roleId}

    SELECT 
        privilege_id as id, name 
    FROM 
        user_privilege 
    INNER JOIN 
        privilege ON user_privilege.privilege_id = privilege.id 
    WHERE 
        user_id = @userId;
我需要做什么来完成这个过程

  • 循环浏览第一次选择的结果。不知道怎么做

  • 结合结果。发现这可以通过创建一个临时表,然后将每个查询的结果集推送到临时表来实现。有更好的办法吗


  • 样本

    用户表

    +----+----------+
    | id | username |
    +----+----------+
    |  1 | caleb    |
    +----+----------+
    
    角色表

    +------+----------+
    | role |   name   |
    +------+----------+
    |    1 | admin    |
    |    2 | standard |
    +------+----------+
    
    +---------+---------+
    | user_id | role_id |
    +---------+---------+
    |       1 |       1 |
    +---------+---------+
    
    特权表

    +-----------+---------------+
    | privilege |     name      |
    +-----------+---------------+
    |         1 | CREATE_USER   |
    |         2 | DELETE_USER   |
    |         3 | ADMIN_VIEW    |
    |         4 | STANDARD_VIEW |
    |         5 | NOTHING       |
    +-----------+---------------+
    
    +---------+--------------+
    | user_id | privilege_id |
    +---------+--------------+
    |       1 |            1 |
    +---------+--------------+
    
    +---------+--------------+
    | role_id | privilege_id |
    +---------+--------------+
    |       1 |            2 |
    |       1 |            3 |
    |       2 |            4 |
    +---------+--------------+
    
    用户权限表

    +-----------+---------------+
    | privilege |     name      |
    +-----------+---------------+
    |         1 | CREATE_USER   |
    |         2 | DELETE_USER   |
    |         3 | ADMIN_VIEW    |
    |         4 | STANDARD_VIEW |
    |         5 | NOTHING       |
    +-----------+---------------+
    
    +---------+--------------+
    | user_id | privilege_id |
    +---------+--------------+
    |       1 |            1 |
    +---------+--------------+
    
    +---------+--------------+
    | role_id | privilege_id |
    +---------+--------------+
    |       1 |            2 |
    |       1 |            3 |
    |       2 |            4 |
    +---------+--------------+
    
    用户角色表

    +------+----------+
    | role |   name   |
    +------+----------+
    |    1 | admin    |
    |    2 | standard |
    +------+----------+
    
    +---------+---------+
    | user_id | role_id |
    +---------+---------+
    |       1 |       1 |
    +---------+---------+
    
    角色权限表

    +-----------+---------------+
    | privilege |     name      |
    +-----------+---------------+
    |         1 | CREATE_USER   |
    |         2 | DELETE_USER   |
    |         3 | ADMIN_VIEW    |
    |         4 | STANDARD_VIEW |
    |         5 | NOTHING       |
    +-----------+---------------+
    
    +---------+--------------+
    | user_id | privilege_id |
    +---------+--------------+
    |       1 |            1 |
    +---------+--------------+
    
    +---------+--------------+
    | role_id | privilege_id |
    +---------+--------------+
    |       1 |            2 |
    |       1 |            3 |
    |       2 |            4 |
    +---------+--------------+
    
    user\u id=1的预期结果

    +--------------+-------------+
    | privilege_id |    name     |
    +--------------+-------------+
    |            1 | CREATE_USER |
    |            2 | DELETE_USER |
    |            3 | ADMIN_VIEW  |
    +--------------+-------------+
    
    您可以尝试以下方法:

    创建或更改过程获取用户权限
    @用户ID int
    作为
    开始
    不计数;
    选择p.[id]作为[privilege\u id],p.[name]
    来自[用户]作为u
    将[user\u role]作为ur上的ur加入。[user\u id]=u.[id]
    在r.[id]=ur.[role\u id]上以r的身份加入[role]
    在rp.[role\u id]=r.[id]上以rp身份加入[role\u privilege]
    将[user\u privilege]作为up ON up加入。[user\u id]=u.[id]
    作为p上的p加入[privilege]。[id]=up。[privilege\u id]
    其中u.[id]=@userId
    按p.[id],p.[name]分组;
    结束;
    
    然后可以按如下方式执行此存储过程:

    EXEC get\u user\u privileges@userId=1
    
    希望这能有所帮助。

    旁注:

    看到了吗?无交叉线,可读性+100

    可能的解决方案之一(几乎是从自然语言到SQL的翻译): 返回用户权限列表或任何用户角色权限列表中存在的权限列表:


    未优化,但可以作为了解解决方案的良好开端。

    您应该能够在一个查询中完成整个任务。使用循环之类的方法检索数据不是一个好方法。@SeanLange您能解释一下我是如何做到的吗。我只是不明白那会是什么样子。你能不能把你数据库的图片换成实际的ddl、样本数据和期望的输出?它已经被添加到问题中,接近我想要的。它返回用户拥有的角色及其所有用户权限,但不返回角色拥有的任何权限,这是我遇到的主要困难。我只想从整个查询中得到一个特权列表。我根本不在乎它是来自用户还是某个角色。我已经更新了答案,以包含一个返回所有角色特权关联的存储过程。