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、样本数据和期望的输出?它已经被添加到问题中,接近我想要的。它返回用户拥有的角色及其所有用户权限,但不返回角色拥有的任何权限,这是我遇到的主要困难。我只想从整个查询中得到一个特权列表。我根本不在乎它是来自用户还是某个角色。我已经更新了答案,以包含一个返回所有角色特权关联的存储过程。