日期:2014-05-17  浏览次数:20749 次

问几个MSSQL2000的权限问题
先看图:



问题:
1、第一张图里面,格子留空和打叉有什么分别?因为我试过留空和打叉都一样不能操作的
2、第二张图,是第一张图里面右下角打叉的项,这图里面除了一个打叉之外,其它的都是空的,但是这个留空又跟上面第一张图中的留空不一样,这些列都是可以操作的

下面这两条语句就是这个表的权限设置了
GRANT ALL ON [Sys_Market] TO $(dbname)_role
DENY UPDATE ON [Sys_Market](MKT_VALID) TO $(dbname)_role

第一句话,我赋于该角色拥有此表的所有权限了,又明确拒绝某个列的权限
那正常来说第二张图中留空的地方应该是全打勾才对的,为什么又留空了呢

------解决方案--------------------
是这样设计的,为什么要这样设定,我个人认为这个要从维护成本来考虑,第一个对象级别,你这里显示的都是表,打勾才有权限,因为大多情况下,对数据表的权限设定都到表为止就够了,所以这边要显示对每个操作都标记权限,系统也会在后台的系统表里为每个操作(用户)增加一条对应的权限.

第二个是列级别的权限设定,默认就是选定,所以这边没有显示出来,但是一旦有deny的标记,就必须显示出来(其实在后台的系统表里会多一条这样的记录),这样在系统表里就可以大大节省开销增加一条记录就可以,不用每个操作都增加一条记录
说到底就是数据库里列一定会比表多的多,所以这样做是节省数据库系统的空间和节约维护成本.

我们来简单演算一下成本.一个数据表假设有10列,10个用户或架构(2000和2005以上版本不一样),那对应的操作记录应该是6x10 就是60条
如果按照第一张图来设定就是 10x2x10 就是200条记录

从空间来说可以大大节省,当然这个算法不一定精确.只是我的一个猜测.

这个可能还不是最重要的,最重要的是在用户查询的时候还需要遍历这个表,这个才是最致命的开销.sqlserver不是一直标榜自己的速度快吗 ^^,当然要想尽办法优化存储结构和表结构

这是我的个人理解,不一定对