SQL Server的安全模型
下面我们来学习一下SQL Server的安全模型,首先看一张图:
登录账号->数据库用户->访问权限,通过三道关口才能接触到数据表。登录名(登录帐号)与用户名(数据库用户)不是一回事。
这就是SQLServer的三层安全管理体系,我们打个比方,假设您住在一个防卫森严的小区,您如果希望进入您的房间,当然需要闯三关。
第一关:您需要通过小区的门卫检查,进入小区;
第二关:到了您所在的单元楼门前,您还需要单元门的钥匙或门铃密码;
第三关:进了单元门后,您还需要您自己房间的钥匙。
看一下上面的图,SQLServer的安全管理是不是非常类似小区的三层验证关口?同样的,我们想操作数据库的某张表也要闯三关:
第一关:我们需要登录到SQL Server系统,即需要登录帐户;
第二关:我们需要访问某个数据库(相当于我们的单元楼),即需要成为该数据库的用户,即需要该数据库的用户账户。
第三关:我们需要访问数据库中的表(相当于打开我们的房间),即需要数据库管理员DBA给您授权(需要有该对象的权限),如增添、修改、删除、查询等权限。
咱们都知道,登录验证有两种方式:
1.SQL身份验证:适合于非windows平台的用户或Internet用户,需要提供帐户和密码
2.Windows身份验证:适合于windows平台用户,不需要提供密码,和windows集成验证
那么,登录帐户相应有两种:SQL帐户和Windows帐户。
下面我们就一起来看看如何创建登录帐户、如何创建数据库用户以及如何给用户授权。
1.创建登录
•添加 Windows登录帐户
EXEC sp_grantlogin ‘leno/123‘ /*域名/用户名 */
•添加 SQL登录帐户
EXEC sp_addlogin ‘zhangsan', ‘1234’/*用户名/密码*/
2.创建数据库用户
创建数据库用户需要调用系统存储过程sp_grantdbaccess,其用法为:
EXEC sp_grantdbaccess ‘登录帐户名’,’数据库用户名’
其中,“数据库用户名“为可选参数,默认为登录帐户名,即数据库用户默认和登录帐户同名。
USE stuDB
GO
EXEC sp_grantdbaccess
'leno/123', 'lenoDBUser'
EXEC sp_grantdbaccess
'zhangsan', 'zhangsanDBUser'
对于Sql Server较高版本,可以使用SQL语句创建创建登录名和用户名的一般的简单形式如下:
-- 先创建了一个名为Alice的用户,登录密码是:henry626626
CREATE LOGIN Alice
WITH PASSWORD = 'henry626626';
GO
-- 给刚刚创建的登录名Alice创建一个数据库用户Alice
CREATE USER Alice FOR LOGIN Alice;
GO
系统本身就内置了两个数据库用户:
dbo用户
表示数据库的所有者(DB Owner)
无法删除 dbo用户,此用户始终出现在每个数据库中
guest用户
适用于没有数据库用户的登录帐号访问
每个数据库可有也可删除
dbo用户:表示DataBase Owner即数据库的主人,一般来说,谁创建的数据库,谁就是数据库的主人,但是可以转让,就像房屋产权证转让一样。
guest来宾用户:就像你不是某个公司的员工,您进入该公司就是作为一个来宾(guest)身份一样。数据库中的guest用户含义一样:如果登录到SQL Server中了,希望访问某个数据库,但又不是该数据库的用户,那么当你访问时,SQL Server就认为你作为guest用户的身份访问数据库,至于你作为guest来宾用户是否能够访问数据库,那就看管理员的授权了。如果管理员给guest帐户授予了访问的权限,那么你就能访问。那么,什么叫做访问权限呢?打个比方:对于某间房屋来说,房屋的权限就是指房产出售权(房主)、转租(可能是租房人有事不住了,但又没到期)、只能居住(租房人)等。对于数据库来说,访问权限指的就是数据库的增(insert)、删(delete)、改(update)、查(select)权限以及其它执行权限等。
3.给数据库用户授权
授权的语法
•GRANT权限 [ON表名 ] TO数据库用户
USE stuDB
GO
/*--为zhangsanDBUser分配对表stuInfo的select, insert, update权限--*/
GRANT select, insert, update
ON stuInfo TO zhangsanDBUser
/*--为lenoDBUser分配建表的权限--*/
GRANT create table TO lenoDBUser
注意授权只能向数据库用户授权,而不是给登录帐户授权。而且数据库的权限仅限于当前数据库,如果希望访问其他数据库,还需要成为其他数据库的用户。所以,现在大家应该清楚了:登录账号->数据库用户->访问权限,这三道关口就是SQL Server的安全模型。