一、SQL Server 身份验证模式
身份验证模式是指系统确认用户的方式。SQL Server有两种身份验证模式:
- Windows验证模式。
- SQL Server验证模式。
这是在安装SQL Server的过程中由“数据库引擎配置”确定的。
1.1 WIndows验证模式
用户登录Windows时进行身份验证,登录SQL Server时就不再进行身份验证了。注意:
- 必须将Windows账户加入到SQL Server中,才能采用Windows账户登录SQL Server。
- 如果使用Windows账户登录到另一个网络的SQL Server,则必须在Windows中设置彼此的托管权限。
1.2 SQL Server验证模式
在SQL Server验证模式下,SQL Server服务器要对登录的用户进行身份验证。系统管理员必须设定登录验证模式的类型为混合验证模式。当采用混合模式时,SQL Server系统既允许使用Windows登录名登录,也允许使用SQL Server登录名登录。
二 SQL Server 安全性机制
2.1 服务器级别
服务器级别所包含的安全对象主要有登录名、固定服务器角色等。
其中,登录名用于登录数据库服务器,而固定服务器角色用于给登录名赋予相应的服务器权限。
SQL Server中的登录名主要有两种:
- Windows登录名:对应Windows验证模式,该验证模式所涉及的账户类型主要有Windows本地用户账户、Windows域用户账户、Windows组。
- SQL Server登录名:对应SQL Server验证模式,在该验证模式下,能够使用的账户类型主要是SQL Server账户。
2.1数据库级别
数据库级别对应的安全对象有用户、角色、应用程序角色、证书、对称密钥、非对称密钥、程序集、全文目录、DDL事件、架构等。
用户安全对象是用来访问数据库的,如果只有登录名而没有创建对应的用户,则无法访问响应的数据库。
角色是用来控制用户操作数据库的权限。如果没有给用户赋予响应的角色,则默认使用public角色。那这样的话就只能使用一些公共的权限。
2.1 架构级别
架构级别所包含的安全对象有表、视图、函数、存储过程、类型、同义词、聚合函数等。在创建这些对象时可设定架构,若不设定则系统默认架构为dbo。
数据库只能在自己的架构中对数据库对象进行操作。
三、建立和管理用户账户
3.1 登录名创建
语法格式:
SQL Server验证模式登录名
create login 登录名
{
with password='密码',
/*下面为可选参数*/
SID = 登录GUID,
| DEFAULT_DATABASE = 数据库,
| DEFAULT_LANGUAGE = 语言,
| CHECK_EXPIRATION = { ON | OFF},
| CHECK_POLICY = { ON | OFF},
[ CREDENTIAL = 凭据名 ],
}
Windows验证模式登录名
create login 登录名
{
WINDOWS
[ WITH
DEFAULT_DATABASE = 数据库,
| DEFAULT_LANGUAGE = 语言
]
}
证书映射登录名
create login 登录名
{
CERTIFICATE证书名
}
非对称密钥映射登录名
create login 登录名
{
ASYMMETRIC KEY 非对称密钥名
}
3.1.1 创建Windows验证模式登录名
创建Windows登录名使用FROM子句,在FROM子句的语法格式中,WINDOWS关键字指定将登录名映射到Windows登录名,其中,<Windows选项>为创建Windows登录名的选项,DEFAULT_DATABASE
指定默认数据库,DEFAULT_LANGUAGE
指定默认语言。
假设已存在windows用户jxj
,本地计算机名字为test
,使用的默认数据库为xscj
。则创建Windows登录名jxj
如下:
use xscj
go
create login [test\jxj]
from windows with default_database=xscj
3.1.2 创建SQL Server验证模式登录名
创建SQL Server验证模式登录名使用with语句。
password
:登录密码,为字符串。
-
HASHED
选项:指定在PASSWORD
参数后输入的密码已经过哈希运算。如果未选择此选项,则在将作为密码输入的字符串存储到数据库之前,对其进行哈希运算。 -
MUST_CHANGE
选项:SQL Server会在首次使用新登录名时提示用户输入新密码。
-
SID
:指定新SQL Server登录名的全局唯一标识符。如果未选择此选项,则自动指派 -
DEFAULT_DATABASE
:指定默认数据库。如果未指定此选项,则默认数据库将设置为master。 -
DEFAULT_LANGUAGE
:指定默认语言。如果未指定此选项,则默认语言将设置为服务器的当前默认语言。 -
CHECK_EXPIRATION
:指定是否对此登录名强制实施密码过期策略,默认值为OFF。 -
CHECK_POLICY
:指定应对此登录名强制实施运行SQL Server的计算机的Windows密码策略,默认值为ON。
例子:创建一个名为stu
的SQL Server 登录名,密码为123456
,默认数据库为xscj
create login stu with password='123456',default_database=xscj
3.1.3 删除登录名
删除登录名用drop loing
命令。例如删除登录名jxj
和stu
drop login [test\jxj]
drop login stu
3.2 数据库用户创建
3.2.1 创建数据库用户
创建数据库用户使用CREATE USER命令。语法格式:
create user 用户名
[
{for | from}
{
login 登录名
| cretificate 证书名
| asymmetric key 非对称密钥名
}
| without login
]
[with default_schema=架构名]
- 用户名:用于指定数据库用户名。FOR或FROM子句用于指定相关联的登录名。
- LOGIN 登录名:指定要创建数据库用户的SQL Server登录名。“登录名”必须是服务器中有效的登录名。当此登录名进入数据库时,它将获取正在创建的数据库用户的名称和ID。
- WITHOUT LOGIN:指定不将用户映射到现有登录名。
- WITH DEFAULT_SCHEMA:指定服务器为此数据库用户解析对象名称时将搜索的第一个架构,默认为dbo。
使用SQL Server登录名stu和Windows登录名[test\jxj]
在xscj
数据库中创建用户stu
和jxj
,默认架构名为dbo
use xscj
go
create user stu for login stu with default_schema=dbo
go
create user jxj for login [text\jxj] with default_schema=dbo
3.2.2 删除数据库用户
删除数据库用户使用DROP USER语句。 例如要删除之前创建的两个用户stu
和jxj
。
删除之前要指定响应的数据库
use xscj
go
drop user stu,jxj
四、角色管理
4.1 固定服务器角色
SQL server提供了以下的固定服务器角色
角色名 | 权限 |
sysadmin | 系统管理员,角色成员可对SQL Server服务器进行所有的管理工作,为最高管理角色。这个角色一般适合于数据库管理员(DBA)。 |
securityadmin | 安全管理员,角色成员可以管理登录名及其属性,可以授予、拒绝、撤销服务器级和数据库级的权限,还可以重置SQL Server登录名的密码。 |
serveradmin | 服务器管理员,角色成员具有对服务器进行设置及关闭服务器的权限。 |
setupadmin | 设置管理员,角色成员可以添加和删除链接服务器,并执行某些系统存储过程。 |
processadmin | 进程管理员,角色成员可以终止SQL Server实例中运行的进程。 |
diskadmin | 用于管理磁盘文件。 |
dbcreator | 数据库创建者,角色成员可以创建、更改、删除或还原任何数据库。 |
bulkadmin | 可执行BULK INSERT语句,但是这些成员对要插入数据的表必须有INSERT权限。BULK INSERT语句的功能是以用户指定的格式复制一个数据文件至数据库表或视图。 |
public | 其角色成员可以查看任何数据库。 |
4.1.1 利用系统存储过程添加固定服务器角色成员
利用系统存储过程sp_addsrvrolemember可将一登录名添加到某一固定服务器角色中,使其成为固定服务器角色的成员。语法格式:
- ‘login’:可以是SQL server登录名或则Windows登录名,用于指定加到到固定服务器角色’role’的登录名。
sp_addsrvrolemember [ @登录名 = ] 'login', [@角色名 =] 'role'
- 将登录名添加为固定服务器角色的成员后,该登录名就会得到与此固定服务器角色相关的权限。
- 不能更改sa角色成员资格。
- 不能在用户定义的事务内执行sp_addsrvrolemember存储过程。
- sysadmin固定服务器的成员可以将任何固定服务器角色添加到某个登录名,其他固定服务器角色的成员可以执行sp_addsrvrolemember,为某个登录名添加同一个固定服务器角色。
- 如果不想让用户有任何管理权限,就不要将其指派给服务器角色,这样就可以将用户限定为普通用户。
将SQL Server登录名stu添加到sysadmin固定服务器角色中
exec sp_addsrvrolemember 'stu','sysadmin'
/*或者下面这样*/
exec sp_addsrvrolemember @loginame='stu',@rolename='sysadmin'
4.1.2 利用系统存储过程添加固定服务器角色成员
利用sp_dropsrvrolemember系统存储过程可从固定服务器角色中删除SQL Server 登录名或Windows登录名。语法格式:
sp_dropsrvrolemember [ @登录名 = ] 'login' , [ @角色名 = ] 'role'
例如 从sysadmin固定服务器角色中删除SQL Server登录名 stu
exec sp_dropsrvrolemember 'stu','sysadmin'
exec sp_dropsrvrolemember @loginame='stu',@rolename='sysadmin'
4.2 固定数据库角色
SQL Server提供了以下固定数据库角色。
用户发出的所有SQL语句均受限于该用户具有的权限。例如,CREATE DATABASE仅限于sysadmin和dbcreator固定服务器角色的成员使用。
角色名 | 权限 |
db_owner | 数据库所有者,这个数据库角色的成员可执行数据库的所有管理操作。 |
db_accessadmin | 数据库访问权限管理者,角色成员具有增加、删除数据库使用者、数据库角色和组的权限。 |
db_securityadmin | 数据库安全管理员,角色成员具有可管理数据库中的权限,如设置数据库表的增加、删除、修改和查询等存取权限。 |
db_ddladmin | 数据库DDL管理员,角色成员可增加、修改或删除数据库中的对象。 |
db_backupoperator | 数据库备份操作员,角色成员具有执行数据库备份的权限 |
4.2.1 利用系统存储过程添加固定数据库角色成员
利用系统存储过程sp_addrolemember可以将一个数据库用户添加到某一固定数据库角色中,使其成为该固定数据库角色的成员。语法格式:
-
role
:为当前数据库中的数据库角色的名称。 -
security_account
:为添加到该角色的安全账户,可以是数据库用户或当前数据库角色。
sp_addrolemember [ @角色名 = ] 'role', [ @成员名 = ] 'security_account'
- 当使用sp_addrolemember将用户添加到角色时,新成员将继承所有应用到角色的权限。
- 不能将固定数据库或固定服务器角色或者dbo添加到其他角色。
- 在用户定义的事务中不能使用sp_addrolemember。
- 只有sysadmin固定服务器角色和db_owner固定数据库角色中的成员可以执行 sp_addrolemember,以将成员添加到数据库角色。
- db_securityadmin固定数据库角色的成员可以将用户添加到任何用户定义的角
例如将xscj数据库上的数据库用户stu添加为固定数据库角色db_owner
的成员
use xscj
go
exec sp_addrolemember 'db_owner','stu'
4.2.2 利用系统存储过程删除固定数据库角色成员
利用系统存储过程sp_droprolemember可以将某一成员从固定数据库角色中去除。
语法格式:
sp_droprolemember [ @角色名 = ] 'role' , [ @成员名 = ] 'security_account'
删除某一角色的成员后,该成员将失去作为该角色的成员身份所拥有的任何权限;不能删除public角色的用户,也不能从任何角色中删除dbo。
例如将数据库用户stu
从db_owner
删除
exec sp_droprolemember 'db_owner','stu'
4.3 自定义数据库角色
4.3.1 命令行形式创建数据库角色
在当前数据库中创建新的数据库角色。
-
role_name
:待创建角色的名称。 -
AUTHORIZATION owner_name
:将拥有新角色的数据库用户或角色。 如果未指定用户,则执行 CREATE ROLE 的用户将拥有该角色。 角色的所有者或拥有角色的任何成员都可以添加或删除角色的成员。
CREATE ROLE role_name [ AUTHORIZATION owner_name ]
例如在xscj
数据库创建student
角色,stu
create role student authorization stu
4.3.2 用存储过程创建数据库角色
在当前数据库中创建新的数据库角色。
[ @rolename = ] 'role'
:新数据库角色的名称。 role是sysname,无默认值。 role必须是有效的标识符(ID),并且不能已存在于当前数据库中。[ @ownername = ] 'owner'
:新数据库角色的所有者。 所有者为sysname,默认值为当前正在执行的用户。 所有者必须是当前数据库中的数据库用户或数据库角色。
sp_addrole [ @rolename = ] 'role' [ , [ @ownername = ] 'owner' ]
例如在xscj
数据库创建student
角色,stu
exec sp_addrole student,stu
4.3.3 删除数据库角色
create role 角色名
例如删除xscj
数据库中的student
角色
drop role student
五 、数据库权限的管理
5.1 授予权限
利用GRANT语句可以给数据库用户或数据库角色授予数据库级别或对象级别的权限。
语法格式:
grant { all [ privileges ] } | 权限 [ ( 列 [ , ... ] ) ] [ , ... ]
[ ON 安全对象 ] TO 主体 [ , ... ]
[ with grant option ] [ as 主体 ]
- ALL:表示授予所有可用的权限。ALL PRIVILEGES是SQL-92标准的用法。
- 权限:权限的名称。根据安全对象的不同,权限的取值也不同。
- 列:指定表、视图或表值函数中要授予对其权限的列的名称。
- ON 安全对象:指定将授予其权限的安全对象。
- 主体:主体的名称,指被授予权限的对象,可为当前数据库的用户、数据库角色,指定的数据库用户、角色必须在当前数据库中存在,不可将权限授予其他数据库中的用户、角色。
- WITH GRANT OPTION:表示允许被授权者在获得指定权限的同时还可以将指定权限授予其他用户、角色或Windows组,WITH GRANT OPTION子句仅对对象权限有效。
- AS 主体:指定当前数据库中执行GRANT语句的用户所属的角色名或组名。
GRANT语句可使用两个特殊的用户账户:public角色和guest用户。授予public角色的权限可应用于数据库中的所有用户;授予guest用户的权限可为所有在数据库中没有数据库用户账户的用户使用。
给xscj数据库上的用户teachadmin
授予创建表的权限。以系统管理员(sa)身份登录SQL Server,新建一个查询,输入以下语句
use xscj
go
grant create table to teachadmin
go
首先在xscj数据库中给public角色授予xsb表的SELECT权限。然后,将其他一些权限授予用户admin1,使用户有对xsb表的所有操作权限。以系统管理员身份登录SQL Server,新建一个查询,输入以下语句:
use xscj
go
grant select on xsb to public
go
grant insert,update,delete,references on xsb to admin1
5.2 拒绝权限
使用DENY命令可以拒绝给当前数据库内的用户授予的权限,并防止数据库用户通过其组或角色成员资格继承权限。
语法格式:
DENY { all [ privileges ] }
| 权限 [ ( 列 [ , ... ] ) ] [ , ... ]
[ on 安全对象 ] to 主体 [ , ... ]
[ cascade] [ as 主体 ]
CASCADE表示拒绝授予指定用户或角色该权限,同时对该用户或角色授予该权限的所有其他用户和角色也拒绝授予该权限。
对stu用户和role2角色成员不允许使用create table语句。
deny create table to stu,role2
go
5.3 撤销权限
利用REVOKE命令可撤销以前给当前数据库用户授予或拒绝的权限。
语法格式:
revoke [ grant option for ]
{
[ all [ privileges ] ]
| 权限 [ ( 列 [ , ... ] ) ] [ , ... ]
}
[ on 安全对象 ]
{ to | from } 主体 [ , ... ]
[ cascade] [ as 主体 ]
说明:
- REVOKE只适用于当前数据库内的权限。GRANT OPTION FOR表示将撤销授予指定权限的能力。
- REVOKE只在指定的用户、组或角色上取消授予或拒绝的权限。
- REVOKE权限默认授予sysadmin固定服务器角色成员、db_owner和db_securityadmin固定数据库角色成员。
取消授予用户的多个语句权限。
revoke create table,create default from teacher
go
取消role2授予或拒绝的在xsb表上的SELECT权限。
revoke select on xsb from role2
六、数据库架构的定义和使用
6.1 创建架构
可以使用CREATE SCHEMA语句创建数据库架构。
语法格式:
CREATE SCHEMA <架构名子句> [ <架构元素> [ , ... ] ]
<架构名子句> ::=
{
架构名
| AUTHORIZATION 所有者名
| 架构名 AUTHORIZATION 所有者名
}
<架构元素> ::=
{
表定义 | 视图定义 | grant语句
revoke语句 | deny语句
}
说明:
- 架构名:在数据库内标识架构的名称,架构名称在数据库中要唯一。
- AUTHORIZATION 所有者名:指定将拥有架构的数据库级主体(如用户、角色等)的名称。
- 表定义:指定在架构内创建表的CREATE TABLE语句。
- 视图定义:指定在架构内创建视图的CREATE VIEW语句。
- grant语句:指定可对除新架构外的任何安全对象授予权限的GRANT语句。
- revoke语句:指定可对除新架构外的任何安全对象撤销权限的REVOKE语句。
- deny语句:指定可对除新架构外的任何安全对象拒绝授予权限的DENY语句。
在xscj数据库创建schema1架构
create schema schema1
6.2 删除架构
删除架构schema1
drop schema schema1