SQL Server权限管理
login 与user的区别
我玩惯了Oracle刚一来玩SQL Server就被login 和user这样的概念搞的有点迷糊了.因为Oracle中没有这样的区分.就一个用户登进去,然后自己创建了啥表等对象就保存在自个的用户下面.别人想访问你用户下的表得需要额外权限,你要访问其他用户下面的表也要额外权限.所以一切泾渭分明,条理清晰,一目了然.当然这样你用户理解起来简单了,爽了.但也会在数据权限控制的操作上变得不灵活.比如你需要访问某其他用户的哪一部分表的权限,只能一个个表的赋权限,如果有一百个表你就得用100条sql就赋予权限.而sql server中由于用户和schema完全分离的两个概念,可以把那些表放到某个schema下面,然后让某个用户可以访问这个schema就行了.
当你用Oracle的时候刚开始肯定先create 一个user.然后就可以登陆了.结果跑sql server里面一看发现,你根本没法create一个user然后给个密码.因为sql server里面实际上只能用login来登陆.而且单独的login也没法用,你一登进去里面是空的,啥的没有.
database是大院子,schema是其中小房间.login可以有不同的大院子的钥匙,user有不同的小房间的钥匙
我们创建login时可以映射多个database给它.一个database相当于一个大院子吧(我本来是喜欢用仓库来比喻的,但看到其他人这样形容,也抄袭来用用),你创建login时映射很多databse,相当于给了你很多院子大门的钥匙.你闲着没事可以一个个的大门去打开看下.但是财物(数据)都是保存在院子里的房间里,你还没有房间的钥匙.你就相当于是个看大门的.当然有些schema(房间),如果owner指明为public,也就是公共的财物.这样的房子没锁门,你可以随便进去拿.只有传说中的共_产主义社会才会财产公有的.正常情况没这样的好事啊.所以大部分时候房间都锁上.
扯淡了这么一堆,你可能会想那我到底怎么去知道房间的锁?此时需要创建一个user,这里的user就不需要你再创建密码了.然后指定user的owned shcemas.相当于给user一个或几个房间的钥匙.在创建user的时候你还要指定user是属于哪个login. 所以login与user是一对多的关系,一个login可以有很多user.打个不恰当的比方.login像男人,而user像女人.一个男人可以有很多老婆的啊.有些国家是这样的.如果是中国嘛你就等同可以搞二奶三奶啥的了.当然如果一个login对应多个user时,那些user不能在同一个databse下,也就是不能在同一个院子.比如你要找二奶的话也不敢明目张胆的让她们住一起吧.肯定得金屋藏娇,藏远点,放另外哪的大院子里去,其实也可以把大院子看成大别墅了啊.
而且大部分时候都是男人做主.所以登陆数据库时用login就行了.当然我说的比喻不一定恰当,可能你会觉得实际上也可以是女的是login,男的是user.一个女的如果够风流的话也可以搞很多男的啊.哎反正是比喻嘛,咋整都行.
闲扯了这么多,这会等来点实际的,看具体咋操作的.
create loginboy with password = 'sb123' use mydb; --创建login名boy,然后指定一个databse mydb给他.相当于给大院子mydb的钥匙给他.
那接下来怎么创建user呢?
先登陆到数据库mydb,然后create user girl for login boy.
不过再指定些schema给user挺麻烦的.还是简单点用Management studio这个图形界面的工具操作吧.
database是mydb(这个是我自己创的mydb,你也可以指定其他的了).那你从图形界面上要先找到那个database,然后在它在树形结构下面会看到有users的选项.你右击选new user.你会发现在创建login并指定某个database时系统会默认创建一个名字相同的user,你右击user boy,然后查看properties.再在owned schemas中选项你想把那些schemas给这个user(给很多房间钥匙给user)
绕了这么一大圈,总算把一个用户给建好啊.麻烦虽然是麻烦.不过这样的话就比较全球做精细的权限管理啊.
角色(role)
我们知道Oracle中有角色的概念.sql server中也有.而且用法相差不大,没有上面创建用户区别那么大.
在sql server中你创建用户时要指定它拥有的schema,得一个个指定挺麻烦.你可以先创建一个role,指定此role拥有哪些schema.然后创建用户时把这个角色role赋给用户就行了.当然了现在我谈的只是啥database,schema这样的逻辑的存储空间的使用权概念.实际上还有其他对表等对象的操作权限还没谈到.
赋予权限
比如要给database mydb下面的user girl赋予建表的权限.这里要注意一点的是,不同的数据库下面的user是不同的概念.假如mydb下面有个user叫girl.在testdb下面还有个user才叫girl.他们都对应login boy.那么对不同的database下面的user girl赋予权限是不影响另外的user girl的.
所以先登陆到database mydb.然后grant create table to girl; --ok,给用户girl赋予好权限了.
用比喻来对比Oracle 与SQL Server
其实要区分oracle和sql server关于database和schema , login 与user这样混淆的概念.还是来打几个比喻吧
Oracle的世界
可以这样来理解.oracle中你装好一个server后,就只有一个database,相当于一个大院子,然后院子里有很多小房间,也就是schema.而每个人(user)只能有一个房间(schema).一一对应的,如果那人死了,他的房间也给拆掉.由于刚建好数据库时只有默认的sys,scott,system等几个少数的用户,所以院子(database)中就只有sys,scott,system这几个房间,其他是空地.当你创建一个用户后,假如是用户arwen,那就在院子里建一个房间,房间名就叫arwen.不停的建新用户就不停的建新房间.假如用户arwen同志因啥意外壮烈牺牲了,比如走椰子树下被掉下来的一个椰子砸死了.(这样死有点死得冤啊.),那数据库中就删除用户arwen,然后把大院子里叫arwen的房间(schema)也拆了.房间里的遗物啥的全部烧掉.
SQL Server的世界
实际上装好一个sql server后,可以在里面整很多个databse,而且它就这样明目张胆的叫databse,有很多个.而不像oracle就一个.(当然实际上database实际上只是个逻辑概念.在物理上就是几个数据文件.像oracle中一个database也可以有很多个数据文件的). 假如sql server中也只有一个database的话就跟oracle很像了.database是大院子,但没有user的时候你也可以先建很多个房间(schema),然后等创建了一个user时,假如创建user arwen,可以分一个或几个房间给arwen.如果arwen虽然天天在打酱油但极会拍马屁,很受领导赏识.于是升官了.然后可以再多分几个房间(schema)给arwen. 假如哪天arwen同志又因意外挂掉了.这次假如是闲得蛋痛跑楼顶去玩,结果一失足摔下去摔成肉酱了.结果很多人认为arwen同志工作太努力,压力太大,想不开自杀了啊.于是哀悼叹息了一阵子.领导们把arwen的名字删掉了.但他的房间还在,遗物还在.过了几天又来了哥们叫weiwen.并且接arwen的班.于是领导们把之前arwen的房间中的某几个分给weiwen.当然里面的遗物自然还在.
而不管arwen还是weiwen都只是些小罗罗,打打酱油的.开啥会时也只当当听众,给领导们鼓鼓掌.啥意思一般也只能被领导给代表了.user只能使用一个大院子(database中的小房间),而那些大领导们可以拥有不同的院子里的房间.假如有某领导(login)名为SB,他有两个职员ss和bb.这两个职员在不同的地方.假如ss在大院子db1中,有一个房间,而bb在另一个大院子db2中.有两个房间. 于是领导SB就有三个房间的拥有权了.因为他的职员的财产也就是他的.可以随时回收的.
于是我们发现oracle的世界比较公平点,每个人一个房间.你死了还拿房间给你陪葬了.虽然浪费点,但多有人情味啊.而sql server中没那么公平,而且没人情味.你挂了房间就被别人拿去用了.