首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > Mysql >

又发一贴,还是SQL有关问题,这个才是原版。有业务

2012-04-04 
又发一贴,还是SQL问题,这个才是原版。有业务!--创建账号角色关联表T_ACC_ROLECREATE TABLE IF NOT EXISTS T

又发一贴,还是SQL问题,这个才是原版。有业务!
--创建账号角色关联表T_ACC_ROLE

CREATE 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_IDint(4) NOT NULL COMMENT '角色ID',
PRIORITY int(4) default NULL COMMENT '优先权',
PRIMARY KEY(ACC_ROLE_ID),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--创建访问控制列表 T_ACL

CREATE 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_TYPEACC_IDROLE_IDMOD_IDACL_POWERACL_TRL_POWER
1042140
105210
105420
105540
105780
T_ACC_ROLE 
ACC_ROLE_IDACC_IDROLE_IDPRIORITY
5251
6242
7263
8274

查询结果:

MOD_IDPRIORITYROLE_ID
515
715
2\N0
4\N0
8\N0


-------------------------------------------------------
大体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_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

[解决办法]
问个问题要不要搞这么复杂,还是这个问题真的很复杂。
[解决办法]
高级货 帮顶
------解决方案--------------------


看的眼睛疼,字弄大点撒














----------------------------------華麗的個性簽名----------------------------------------
500人的编程群期待大家的加入,一起交流探讨软件开发
群名:程序人生大联盟主群
群号:49282233
[解决办法]
顶起来
[解决办法]
沙发

[解决办法]
顶!!!
[解决办法]

SQL code
--意思业务扩展是吧;EH    make varchar(10) not null,    model varchar(10) not null,    power char(1),    no_pass integer check (no_pass between 0 and 6),    cap float check (cap >= 0),    cc integer check (cc >= 0),    primary key (make,model));
[解决办法]
可以去SQL专区发个贴
[解决办法]
高级贴,顶
[解决办法]
晕呼呼,看不下去,瞌睡了。。。
[解决办法]
挺想帮忙的,但是心有余而力不足……
[解决办法]
帮顶一下
[解决办法]
帮顶~~~~~~~~~~~~~~~`
[解决办法]
非常好
[解决办法]
顶起来~!!!
[解决办法]
顶起来
[解决办法]
帮顶
[解决办法]
帮顶
[解决办法]
学习一下
[解决办法]
看不懂
[解决办法]
我是看不懂哦
[解决办法]


看得头晕,建议楼主能用点例子说明。

[color=#FFFFFF][/color]
[解决办法]
ddddddddddddddd
[解决办法]
学习学习
[解决办法]
up
[解决办法]

[解决办法]
这么好的文章,好好研究
[解决办法]
收藏了...

热点排行