mssql sqlserver SQL 位运算举例权限应用


摘要:
下文通过举例的方式讲述sqlserver中位运算的相关知识,如下所示:
实验环境:sqlserver 2008 R2


在sqlserver的权限设置,我们通常使用1、2、4、8、16、32、64、128等数值分别表示相关信息的某一状态供业务状态使用,通过字段值之间的组合形成一个状态值存储到数据库中,
设置一个角色拥有的权限
例:
1:代表“查看”按钮权限
2:代表”修改”按钮
4:代表”导出”按钮
8:代表”删除”按钮

 --例:
 --权限表如下:
  create table userRole(userId varchar(36),
    roleInfo int);
	go
    
	insert into userRole(userId,roleInfo)values('test',1)  ---初始化测试账号"test",拥有查看权限
    insert into userRole(userId,roleInfo)values('猫猫',2) 
		

    --当我们需要给用户加入修改"2"权限,则可以使用以下运算
    update userRole set roleInfo =roleInfo|2 where userId ='test'


    --当我们需要给用户加入导出"4"权限,则可以继续使用以下运算
    update userRole set roleInfo =roleInfo|4 where userId ='test'
   
   
	  --当我们需要给用户删除导出"4"权限,则可以继续使用以下运算
	 --删除权限前需判断用户是否存在此权限,此脚本不可多次运行
	 --if exists (select null from userRole where roleInfo &4 =4 and userId ='test')
	 ---begin
      update userRole set roleInfo =roleInfo^4 where userId ='test' and roleInfo&4 =4 
     --end
     
  
     ---我们检索所有拥有权限"修改2"的用户信息
     select * from userRole where roleInfo &2 = 2 

    go
    truncate table userRole
    drop     table userRole
 


注意事项:
此处权限设置,主要使用二进制中每一位代表一个权限及位运算的特性进行权限的增减操作
由于”^异或运算”运算,左表达式1或0 时 右表达式为1时,将分别产生 0、1,所以剔除权限时,一定要判断是否存在此权限