--创建账号角色关联表T_ACC_ROLECREATE TABLE IF NOT EXISTS T_ACC_ROLE (
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ACC_ID INT(6) NOT NULL COMMENT '账号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
PRIORITY int(4) default NULL COMMENT '优先权',
PRIMARY KEY(ACC_ROLE_ID),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--创建访问控制列表 T_ACLCREATE TABLE IF NOT EXISTS T_ACL(
PRI_TYPE INT(2) NOT NULL COMMENT '主体标识',
ACC_ID INT(6) NOT NULL COMMENT '账号ID',
ROLE_ID INT(4) NOT NULL COMMENT '角色ID',
MOD_ID INT(6) NOT NULL COMMENT '模块ID',
ACL_POWER INT(11) NOT NULL default 0 COMMENT 'ACL权限条码',
ACL_TRL_POWER INT(2) NOT NULL default 0 COMMENT 'ACL继承状态',
PRIMARY KEY(PRI_TYPE,ACC_ID,ROLE_ID,MOD_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;查询ACL权限条码=某个值(是一个表达式运算,你可以不写)的SQL。要采集这两个表的MOD_ID ,MOD_ID 在T_ACL表中会重复。但是T_ACC_ROLE 中一个账号有多个ROLE_ID(一个账号多个角色),这时候要PRIORITY 较小的信息,说白了是优先级别较高的信息。但是在T_ACL 也有ACC_ID(账号直接享有资源),那么表T_ACL 中的信息处于更高的优先级,那么就采用T_ACL的信息。 算法过程: 例如:搜索表T_ACC_ROLE
有四个个ACC_ID=2的信息,取PRIORITY =1对应的MOD_ID信息。
但是在T_ACL 表中也有ACC_ID=2的信息,那么T_ACC_ROLE关联的T_ACL 表的信息就是旧信息,不采用,使用T_ACL的信息。
PRI_TYPE 就两种取值,0是账号存储,1是角色存储。
当存ACC_ID账号的时候ROLE_ID 是0
当存ROLE_ID角色的时候ACC_ID 是 0
最后结果是:
PRI_TYPE ACC_ID ROLE_ID MOD_ID ACL_POWER ACL_TRL_POWER
1 0 4 2 14 0
1 0 5 2 1 0
1 0 5 4 2 0
1 0 5 5 4 0
1 0 5 7 8 0
T_ACC_ROLE
ACC_ROLE_ID ACC_ID ROLE_ID PRIORITY
5 2 5 1
6 2 4 2
7 2 6 3
8 2 7 4查询结果:MOD_ID PRIORITY ROLE_ID
5 1 5
7 1 5
2 \N 0
4 \N 0
8 \N 0
-------------------------------------------------------
大体SQL是:但是很不理想: SELECT A.MOD_ID,B.PRIORITY ,A.ROLE_ID FROM T_ACL A INNER JOIN T_ACC_ROLE B ON (A.ROLE_ID=B.ROLE_ID)
WHERE B.ACC_ID='2'
AND B.PRIORITY=
(SELECT MIN(C.PRIORITY)
FROM T_ACC_ROLE C INNER JOIN T_ACL D ON (C.ROLE_ID=D.ROLE_ID)
WHERE D.MOD_ID=A.MOD_ID AND D.ACC_ID=A.ACC_ID AND D.PRI_TYPE=A.PRI_TYPE)
AND A.MOD_ID NOT IN
(SELECT E.MOD_ID FROM T_ACL E WHERE E.ACC_ID=B.ACC_ID AND E.PRI_TYPE='0' AND E.ROLE_ID='0')
UNION ALL
SELECT F.MOD_ID,null,F.ROLE_ID FROM T_ACL F WHERE F.ACC_ID='2' AND F.PRI_TYPE='0' AND F.ROLE_ID='0'-----有更好办法的指点一二!!不需要存储过程。如果认为还没说清楚的看 简化版本 http://topic.csdn.net/u/20090511/18/6f62a38c-607a-40f7-ae2d-d5d91d064a36.html
http://topic.csdn.net/u/20090511/18/7f2977d8-332b-4646-a120-45e27f6a441a.html
ACC_ROLE_ID INT(11) NOT NULL AUTO_INCREMENT COMMENT '编号ID',
ACC_ID INT(6) NOT NULL COMMENT '账号ID',
ROLE_ID int(4) NOT NULL COMMENT '角色ID',
PRIORITY int(4) default NULL COMMENT '优先权',
PRIMARY KEY(ACC_ROLE_ID),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;--创建访问控制列表 T_ACLCREATE TABLE IF NOT EXISTS T_ACL(
PRI_TYPE INT(2) NOT NULL COMMENT '主体标识',
ACC_ID INT(6) NOT NULL COMMENT '账号ID',
ROLE_ID INT(4) NOT NULL COMMENT '角色ID',
MOD_ID INT(6) NOT NULL COMMENT '模块ID',
ACL_POWER INT(11) NOT NULL default 0 COMMENT 'ACL权限条码',
ACL_TRL_POWER INT(2) NOT NULL default 0 COMMENT 'ACL继承状态',
PRIMARY KEY(PRI_TYPE,ACC_ID,ROLE_ID,MOD_ID)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;查询ACL权限条码=某个值(是一个表达式运算,你可以不写)的SQL。要采集这两个表的MOD_ID ,MOD_ID 在T_ACL表中会重复。但是T_ACC_ROLE 中一个账号有多个ROLE_ID(一个账号多个角色),这时候要PRIORITY 较小的信息,说白了是优先级别较高的信息。但是在T_ACL 也有ACC_ID(账号直接享有资源),那么表T_ACL 中的信息处于更高的优先级,那么就采用T_ACL的信息。 算法过程: 例如:搜索表T_ACC_ROLE
有四个个ACC_ID=2的信息,取PRIORITY =1对应的MOD_ID信息。
但是在T_ACL 表中也有ACC_ID=2的信息,那么T_ACC_ROLE关联的T_ACL 表的信息就是旧信息,不采用,使用T_ACL的信息。
PRI_TYPE 就两种取值,0是账号存储,1是角色存储。
当存ACC_ID账号的时候ROLE_ID 是0
当存ROLE_ID角色的时候ACC_ID 是 0
最后结果是:
PRI_TYPE ACC_ID ROLE_ID MOD_ID ACL_POWER ACL_TRL_POWER
1 0 4 2 14 0
1 0 5 2 1 0
1 0 5 4 2 0
1 0 5 5 4 0
1 0 5 7 8 0
T_ACC_ROLE
ACC_ROLE_ID ACC_ID ROLE_ID PRIORITY
5 2 5 1
6 2 4 2
7 2 6 3
8 2 7 4查询结果:MOD_ID PRIORITY ROLE_ID
5 1 5
7 1 5
2 \N 0
4 \N 0
8 \N 0
-------------------------------------------------------
大体SQL是:但是很不理想: SELECT A.MOD_ID,B.PRIORITY ,A.ROLE_ID FROM T_ACL A INNER JOIN T_ACC_ROLE B ON (A.ROLE_ID=B.ROLE_ID)
WHERE B.ACC_ID='2'
AND B.PRIORITY=
(SELECT MIN(C.PRIORITY)
FROM T_ACC_ROLE C INNER JOIN T_ACL D ON (C.ROLE_ID=D.ROLE_ID)
WHERE D.MOD_ID=A.MOD_ID AND D.ACC_ID=A.ACC_ID AND D.PRI_TYPE=A.PRI_TYPE)
AND A.MOD_ID NOT IN
(SELECT E.MOD_ID FROM T_ACL E WHERE E.ACC_ID=B.ACC_ID AND E.PRI_TYPE='0' AND E.ROLE_ID='0')
UNION ALL
SELECT F.MOD_ID,null,F.ROLE_ID FROM T_ACL F WHERE F.ACC_ID='2' AND F.PRI_TYPE='0' AND F.ROLE_ID='0'-----有更好办法的指点一二!!不需要存储过程。如果认为还没说清楚的看 简化版本 http://topic.csdn.net/u/20090511/18/6f62a38c-607a-40f7-ae2d-d5d91d064a36.html
http://topic.csdn.net/u/20090511/18/7f2977d8-332b-4646-a120-45e27f6a441a.html
解决方案 »
- 尽量减少mysql的内存暂用
- mysql数据导出找不到表
- 2003下LAMP错误!
- MySQL游标问题?
- The MySQL adapter "mysql" is not available. 请文各位这个是什么错误
- 对于存储上千万条数据,用mysql好还是mssql好?
- MySQL创建delete触发器语法错误了
- 用mm.mysql.jdbc连接mysql的user库,其中的Y/N都能显示出,但localhost不能显示?
- python3.6通过pymysql连接mysql,报错,求解答
- 使用sum很慢的问题
- MYSQL中关于除法运算的问题
- 实际值是相同,但被加上不同的字符,还能比对相等吗?
但是在T_ACL 表中也有ACC_ID=2的信息,那么T_ACC_ROLE关联的T_ACL 表的信息就是旧信息,不采用,使用T_ACL的信息。
PRI_TYPE 就两种取值,0是账号存储,1是角色存储。
当存ACC_ID账号的时候ROLE_ID 是0
当存ROLE_ID角色的时候ACC_ID 是 0
最后结果是:
PRI_TYPE ACC_ID ROLE_ID MOD_ID ACL_POWER ACL_TRL_POWER
1 0 4 2 14 0
1 0 5 2 1 0
1 0 5 4 2 0
1 0 5 5 4 0
1 0 5 7 8 0
T_ACC_ROLE
ACC_ROLE_ID ACC_ID ROLE_ID PRIORITY
5 2 5 1
6 2 4 2
7 2 6 3
8 2 7 4
目前使用的SQL
SELECT A.MOD_ID,B.PRIORITY ,A.ROLE_ID,A.ACL_POWER FROM T_ACL A INNER JOIN T_ACC_ROLE B ON (A.ROLE_ID=B.ROLE_ID)
WHERE B.ACC_ID='2'
AND B.PRIORITY=
(SELECT MIN(C.PRIORITY)
FROM T_ACC_ROLE C INNER JOIN T_ACL D ON (C.ROLE_ID=D.ROLE_ID)
WHERE D.MOD_ID=A.MOD_ID AND D.ACC_ID=A.ACC_ID AND D.PRI_TYPE=A.PRI_TYPE)
AND A.MOD_ID NOT IN
(SELECT E.MOD_ID FROM T_ACL E WHERE E.ACC_ID=B.ACC_ID AND E.PRI_TYPE='0' AND E.ROLE_ID='0') AND A.ACL_POWER&1=1
UNION ALL
SELECT F.MOD_ID,null,F.ROLE_ID,F.ACL_POWER FROM T_ACL F WHERE F.ACC_ID='2' AND F.PRI_TYPE='0' AND F.ROLE_ID='0' AND F.ACL_POWER&1=1执行结果是:
我说的太繁琐,让你误解了!抱歉。。有四个个ACC_ID=2的信息,取PRIORITY =1对应的MOD_ID信息。 上次说过INFO是简化的字段,实际就来源一个表T_ACL。那就是MOD_ID.取账号是(ACC_ID=2)的MOD_ID---只是取对应角色MOD,实际T_ACL有直接给予的MOD,处于最高的优先权。
SELECT A.MOD_ID FROM T_ACL A INNER JOIN T_ACC_ROLE B ON (A.ROLE_ID=B.ROLE_ID)
-- t_acc_role(新业务)按优先级(min(priority))取舍,---如果业务相同,即冲突--T_ACL(老业务表)的优先级高于T_ACL_ROLE(新业务表); --业务:权限分配 查角色(role_id)多对应的模块ID(mod_id);<!--有四个个ACC_ID=2的信息,取PRIORITY =1对应的MOD_ID信息。
select min(a.priority),a.acc_id from t_acc_role a group by a.acc_id;<!--取账号是(ACC_ID=2)的MOD_ID---只是取对应角色MOD,
select olda.role_id,olda.mod_id from t_acl olda where olda.acc_id in(
select acc_id from
(select min(a.priority),a.acc_id from t_acc_role a group by a.acc_id) b
)<!--实际T_ACL有直接给予的MOD,处于最高的优先权。--不明白
--结合上面--但是在T_ACL 表中也有ACC_ID=2的信息,那么T_ACC_ROLE关联的T_ACL 表的信息就是旧信息,不采用(T_ACC_ROLE),使用T_ACL的信息。--理解
:
SELECT aa.MOD_ID,bb.PRIORITY ,aa.ROLE_ID FROM T_ACL aa INNER JOIN T_ACC_ROLE bb ON (aa.ROLE_ID=bb.ROLE_ID) WHERE bb.ACC_ID in(
select mm.acc_id from (
select olda.role_id,olda.mod_id,olda.acc_id from t_acl olda where olda.acc_id in(
select acc_id from
(select min(a.priority),a.acc_id from t_acc_role a group by a.acc_id) b
)
)mm
)
传奇私服 www.92045.org
传奇私服 www.xinsf.net
传奇私服 www.ux13.com