sql多表查询详解用户表角色表权限表权限加减表,根据用户id查询所有权限,连接查询(代码片段)

dlage dlage     2023-01-03     306

关键词:

sql语句如下

SELECT
    p.*
FROM
    ums_admin_role_relation ar
    LEFT JOIN ums_role r ON ar.role_id = r.id
    LEFT JOIN ums_role_permission_relation rp ON r.id = rp.role_id
    LEFT JOIN ums_permission p ON rp.permission_id = p.id
WHERE
    ar.admin_id = #adminId
    AND p.id IS NOT NULL
    AND p.id NOT IN (
        SELECT
            p.id
        FROM
            ums_admin_permission_relation pr
            LEFT JOIN ums_permission p ON pr.permission_id = p.id
        WHERE
            pr.type = -1
            AND pr.admin_id = #adminId
    )
UNION
SELECT
    p.*
FROM
    ums_admin_permission_relation pr
    LEFT JOIN ums_permission p ON pr.permission_id = p.id
WHERE
    pr.type = 1
    AND pr.admin_id = #adminId

咋一看,代码还蛮多的。一共涉及5个表

CREATE TABLE `ums_admin_role_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `admin_id` bigint DEFAULT NULL,
  `role_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户和角色关系表';
CREATE TABLE `ums_role` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `name` varchar(100) DEFAULT NULL COMMENT '名称',
  `description` varchar(500) DEFAULT NULL COMMENT '描述',
  `admin_count` int DEFAULT NULL COMMENT '后台用户数量',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `status` int DEFAULT '1' COMMENT '启用状态:0->禁用;1->启用',
  `sort` int DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户角色表';
CREATE TABLE `ums_permission` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `pid` bigint DEFAULT NULL COMMENT '父级权限id',
  `name` varchar(100) DEFAULT NULL COMMENT '名称',
  `value` varchar(200) DEFAULT NULL COMMENT '权限值',
  `icon` varchar(500) DEFAULT NULL COMMENT '图标',
  `type` int DEFAULT NULL COMMENT '权限类型:0->目录;1->菜单;2->按钮(接口绑定权限)',
  `uri` varchar(200) DEFAULT NULL COMMENT '前端资源路径',
  `status` int DEFAULT NULL COMMENT '启用状态;0->禁用;1->启用',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `sort` int DEFAULT NULL COMMENT '排序',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户权限表';
CREATE TABLE `ums_role_permission_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `role_id` bigint DEFAULT NULL,
  `permission_id` bigint DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb3 COMMENT='后台用户角色和权限关系表';
CREATE TABLE `ums_admin_permission_relation` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `admin_id` bigint DEFAULT NULL,
  `permission_id` bigint DEFAULT NULL,
  `type` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='后台用户和权限关系表(除角色中定义的权限以外的加减权限)';

sql语句里面有注释,一个用户有多个角色,每个角色有相应的权限(还有个角色权限加减表)

先看前面的语句

SELECT
    p.*
FROM
    ums_admin_role_relation ar
    LEFT JOIN ums_role r ON ar.role_id = r.id
    LEFT JOIN ums_role_permission_relation rp ON r.id = rp.role_id
    LEFT JOIN ums_permission p ON rp.permission_id = p.id

四个表连接,根据用户的id查询出用户的所有角色,根据角色查询出用户的权限。查询出权限了还不行,还有个加减权限的表,

AND p.id IS NOT NULL
    AND p.id NOT IN (
        SELECT
            p.id
        FROM
            ums_admin_permission_relation pr
            LEFT JOIN ums_permission p ON pr.permission_id = p.id
        WHERE
            pr.type = -1
            AND pr.admin_id = #adminId
    )

先看里面的选择语句,权限和权限加减表连接。pr.type=-1是当type等于-1时,这个权限角色要减去这个权限。

这个语句意思就清楚了,查询出用户的所有权限之后,减去一些权限。

union连接之后的语句时干什么用的。我们前面说了,ums_role_permission_relation这是一个权限加减表,刚刚我们只是减了权限。还要加上权限。

SELECT
    p.*
FROM
    ums_admin_permission_relation pr
    LEFT JOIN ums_permission p ON pr.permission_id = p.id
WHERE
    pr.type = 1
    AND pr.admin_id = #adminId

选择权限加减表的加上的权限和上面的权限连接即可。

mysql权限管理表设计(代码片段)

...理表设计权限管理需要用到五张表,其中包含三张主表(用户表、角色表、权限表)和两张关系表(用户角色关系表、角色权限关系表)用户表user角色表role权限表module用户角色关系表u_r角色权限 查看详情

mysql优化

...冗余,举例说明:在权限模型中可能会用到5张表用户表、角色表、权限表,还有用户角色关联表和角色权限关联表。如果此时要通过用户查询权限则必须关联查询或者使用多条sql查询,此时可以在用户表增加一个... 查看详情

hql多表查询转换问题,小弟受教了

1person表:字段1:ID//用户ID,主键字段2:personName//用户名字段3:personPwd//密码字段4:permissionID//权限ID外键权限表ID2permission表:字段1:ID//权限ID,主键字段2:permissionName//权限名------------------------------------------------------------------... 查看详情

多表查询

微信公众号:菜鸟永恒第1章多表关系实战1.1实战1:省和市?方案1:多张表,一对多?方案2:一张表,自关联一对多1.2实战2:用户和角色(比如演员和扮演人物)?多对多关系1.3实战3:角色和权限(比如公司职位和开除等权限)?多对多... 查看详情

模块设计-权限管理

...大核心表,加上用户角色、角色权限两个映射表(用于给用户表联系上权限表)。  这样就可以通过登录的用户来获取权限列表,或判断是否拥有某个权限。  大致用到5张表:用户表(UserInfo)、角色表(RoleInfo)、菜单表(... 查看详情

设计用户权限表

3张表两个多对多,所以最后是5张表。用户表:用户ID,用户名用户—角色表:ID,用户ID,角色ID角色表:角色ID,角色名角色—权限表:ID角色ID,权限ID权限表:权限ID,权限名 查看详情

如何授予 SQL 角色权限以创建和管理临时表

】如何授予SQL角色权限以创建和管理临时表【英文标题】:HowtoGRANTpermissionstoaSQLroletocreateandmanagetemptables【发布时间】:2011-01-1820:29:32【问题描述】:我想授予SQL角色创建临时表#foo的权限并授予对该表执行任何操作的权限(SELECT... 查看详情

一个角色对应多个用户,一个用户又有多个权限怎么设计数据库

...A一般权限设计都是基于角色的权限相关的设计到五张表用户表菜单表角色表角色菜单关系表用户角色关系表 查看详情

权限分级设置

...情况。新建一张表保存角色生成用户情况。取数据时递归查询,以用户为条件查询 查看详情

2、用户权限管理,数据库表设计

...,关注点在于实体属性值、条件、允许值,用户登录后,查询该用户的查询条件,根据条件获取数据即可。详细表结构设计可以参考:https://zhuanlan.zhihu.com/p/31339794具体介绍一下每 查看详情

用户角色权限数据库设计

...权限,然后给用户分配角色。这个设计主要涉及6张表,用户表(用于存储用户的所有信息)权限表(用于存储所有的权限)角色表(用于存储所有的角色)用户和角色的关联表(用户和角色的关联)角色和权限的关联表(角色... 查看详情

mysql优化

...冗余,举例说明:在权限模型中可能会用到5张表用户表、角色表、权限表,还有用户角色关联表和角色权限关联表。如果此时要通过用户查询权限则必须关联查询或者使用多条sql查询,此时可以在用户表增加一个... 查看详情

经典角色权限系统设计五张表及拓展应用

...大核心表,加上用户角色、角色权限两个映射表(用于给用户表联系上权限表)。这样就可以通过登录的用户来获取权限列表,或判断是否拥有某个权限。  大致用到5张表:用户表(UserInfo)、角色表(RoleInfo)、菜单表(MenuIn... 查看详情

mysql详解

MySql数据库基础MySQL各大存储引擎MySql常用字符集MySql支持的数据类型MySql枚举和集合详解MySql约束条件MySql表操作MySql多表关系MySql范式MySql单表查询MySql多表查询MySQL权限详解Mysql三大特性详解 查看详情

第二轮面试(代码片段)

...权限,一个权限也会属于多个角色(多对多)。设计表:用户表、用户角色关联表、角色表、角色权限关联表、用户权限表,通过通过用户表中的用户id在用户角色关联表中找到角色id,通过角色名找到权限id,获取权限id中的权... 查看详情

jeesite快速开发平台用户-角色-部门-区域-菜单-权限表关系

一、表关系一共有8张表分别用来实现用户-角色-部门-区域-菜单-权限管理,详细如下: 二、SQL语句[java] viewplain copy/*********************一共八张表************************/    select * from sys_user; 查看详情

drf三大认证:认证组件-权限组件-权限六表-自定义认证组件的使用(代码片段)

...:三表规则、五表规则、Django采用的是六表规则。三表:用户表、角色表、权限表五表:用户表、角色表、权限表、用户角色关系表、角色权限关系表、用户权限关系表六表:用户表、角色表、权限表、用户角色关系表、角色权... 查看详情

mybatis的多表(多对多)查询

...个角色一个角色可以赋予多个用户解决办法建立两张表:用户表,角色表让用户表和角色表具有多对多的关系。需要使用中间表,中间表包含各自的主键,在中间表中是外键。建立两个实体类:用户实体类和角色实体类让用户和... 查看详情