用户、角色和权限,多表查询
2016-08-19 23:21
435 查看
一,各个表格
1、用户表
CREATE TABLE `t_user` (`id` varchar(40) NOT NULL,
`username` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
)
2、角色表
CREATE TABLE `t_role` (`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
3、权限表
CREATE TABLE `t_permission` (`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`description` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
)
4、用户角色关系表
CREATE TABLE `user_role` (`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(40) NOT NULL,
`role_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_user_role_t_role_1` (`role_id`),
KEY `fk_user_role_t_user_1` (`user_id`),
CONSTRAINT `fk_user_role_t_role_1` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_user_role_t_user_1` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)
5、角色权限关系表
CREATE TABLE `role_permission` (`id` int(11) NOT NULL AUTO_INCREMENT,
`role_id` int(11) NOT NULL,
`permission_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_role_permission_t_permission_1` (`permission_id`),
KEY `fk_role_permission_t_role_1` (`role_id`),
CONSTRAINT `fk_role_permission_t_permission_1` FOREIGN KEY (`permission_id`) REFERENCES `t_permission` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_role_permission_t_role_1` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
)
![](https://images2015.cnblogs.com/blog/1009195/201608/1009195-20160819232331109-1651448991.png)
6、测试数据
INSERT INTO `role_permission` VALUES ('1','1','1'), ('2','2','2'), ('3','3','3');INSERT INTO `t_permission` VALUES ('1','小说收藏',NULL), ('2','小说发布',NULL), ('3','广告发布',NULL);
INSERT INTO `t_role` VALUES ('1','读者',NULL), ('2','作者',NULL), ('3','管理员',NULL);
INSERT INTO `t_user` VALUES ('u1','reader'), ('u11','reader1'), ('u2','author'), ('u22','author2'), ('u3','admin'), ('u33','admin2');
INSERT INTO `user_role` VALUES ('1','u1','1'), ('2','u2','2'), ('3','u3','3'), ('4','u11','1'), ('5','u22','2'), ('6','u33','3');
小说网站,用户表的设计。
用户有着“读者”,“作者”和“管理员”角色,角色有不同权限,如小说收藏,小说发布和广告发布
假定,用户和角色是一对一关系,即一个用户只有一个角色;角色和用户的关系是一对多关系,一个角色对应着多个用户。(方便后面对应英文单词直观反应着关系,如看到reader就是表示读者角色)
角色和权限的关系是多对多关系。即一个角色有着多种权限,同样,一个权限可以分给不同角色。
二、多对多查询
1、查询拥有某角色的用户信息
SELECTu.id,u.username
FROM
t_user u,t_role r,user_role ur
WHERE
r.id=1 AND r.id=ur.role_id AND ur.user_id=u.id;
![](https://images2015.cnblogs.com/blog/1009195/201608/1009195-20160819231612578-96936849.png)
2、查询某用户的对应的角色。
SELECTu.id,u.username,r.`name` role_name
FROM
t_user u,t_role r,user_role ur
WHERE
u.username LIKE 'a%' AND u.id=ur.user_id AND ur.role_id=r.id;
![](https://images2015.cnblogs.com/blog/1009195/201608/1009195-20160819231813343-583020749.png)
3、查询拥有某权限的角色
SELECT p.`name`,r.`name`FROM
t_permission p,role_permission rp,t_role r
WHERE
p.`name`='小说发布' AND p.id=rp.permission_id AND rp.role_id=r.id;
![](https://images2015.cnblogs.com/blog/1009195/201608/1009195-20160819231853953-1735417564.png)
4、查询某角色拥有的权限。
SELECT r.`name`,p.`name`FROM
t_permission p,role_permission rp,t_role r
WHERE
r.`name`='作者' AND r.id=rp.role_id AND rp.permission_id=p.id;
![](https://images2015.cnblogs.com/blog/1009195/201608/1009195-20160819231916859-1406683064.png)
5、查询某用户拥有的权限。
这里用户和角色是一对一关系,通过先查询用户的角色,再查询权限。(单行单例子查询)SELECT p.`name`
FROM
t_permission p,role_permission rp,t_role r
WHERE
r.id=rp.role_id AND rp.permission_id=p.id AND r.id
IN
(SELECT r.id
FROM
t_user u,t_role r,user_role ur
WHERE
u.username ='author' AND u.id=ur.user_id AND ur.role_id=r.id);
![](https://images2015.cnblogs.com/blog/1009195/201608/1009195-20160819231934531-1586962092.png)
6.查询拥有某权限的用户
权限与角色是多对多关系,角色和用户是一对一关系。这个是查询是多行单列子查询
SELECT
u.id,u.username
FROM
t_user u,t_role r,user_role ur
WHERE
r.id=ur.role_id AND ur.user_id=u.id AND r.id
IN
(SELECT r.id
FROM
t_permission p,role_permission rp,t_role r
WHERE
p.`name`='小说发布' AND p.id=rp.permission_id AND rp.role_id=r.id);
![](https://images2015.cnblogs.com/blog/1009195/201608/1009195-20160819232007343-261209220.png)
相关文章推荐
- 第三天3-1锁,事务】【账号锁定】【配额限制用户使用表空间的量】【查询当前session的用户权限】【session包含的角色】
- Oracle查询用户权限角色(dba_sys_privs) (转)
- Oracle查询用户权限角色(dba_sys_privs)
- 查询oracle用户角色权限
- TD表权限、用户角色查询
- 常用的数据库用户角色访问权限查询语句
- 在oracle db中查询某用户的权限 or 角色
- 如何查询oracle用户、权限、及角色
- sap 根据权限对象查询所用用户、参数文件、角色等的事务代码
- 查询角色的权限、创建用户和授权语句
- SQL Server中查询用户的对象权限和角色的方法
- WordPress查询文章作者的文章数及WordPress用户角色/权限
- 在realm中动态查询用户的权限&角色
- mybatis用户角色权限一对多关联查询
- oracle查询 :一个角色包括的系统权限,对象权限,Oracle有多少种角色,某个用户有什么角色
- sys通过授予select_catalog_role角色给用户,使用户有权限查询数据字典。
- oracle用户/角色权限查询
- 查询用户的角色和权限
- oracle 数据字典和动态性能视图数据 与用户权限角色查询
- 如何查询oracle用户、权限、及角色