SQL Server 部分包含数据库及从SSMS链接

3/4/2024 5:52:31 PM
303
0

包含是针对数据库独立性而来的,非包含数据库(SQL Server 2012以前版本的所有数据库,以及SQL Server 2012及以后的数据库属性CONTAINMENT 设置为NONE的数据库)是在实例master库下进行登陆账户密码验证的;而包含数据库可以通过本身带有密码的用户直接与应用进行交互。

应用场景

部分包含数据库和非包含数据库最大的差异在于排序规则,即如果数据库的排序规则和实例排序规则不一致,并且跨库操作较少,则使用部分包含数据库能极大的减轻开发者的负担。这也是部分包含数据库的应用场景之一。

非实例级故障转移,如Always On、日志传送等如果使用包含数据库,将登录账户全部变为包含用户,就不需要额外的同步登陆账户及权限,可以极大限度的减少账户同步带来的故障恢复时间,及DBA日常维护登陆账户权限同步的额外工作及时间。这是部分包含数据库的应用场景之二。

创建部分包含数据库

可以在创建数据库时指定CONTAINMENT=PARTIAL直接创建部分包含数据库,如下:

CREATE DATABASE test3
 CONTAINMENT = PARTIAL

查看数据库是否启用部分包含属性

SELECT  name, containment, containment_desc
FROM    sys.databases
WHERE name='test3'

SSMS中启用部分包含数据库

可以直接从对象资源管理器中,右击对应数据库(本文使用的test3数据库)→属性→选项→包含类型→部分,如下图:

点击确定,即可。

T-SQL 启用部分包含数据库

当然,更改数据库包含类型设置时,不能有用户连接该数据库,如果有用户连接,可以使用如下脚本查出并kill掉相关进程:

USE master
GO
SELECT  'kill '+CONVERT(varchar(3),spid)
FROM    sys.sysprocesses
WHERE   dbid = DB_ID('test3')

下面给出启用部分包含数据库的T-SQL:

--启用包含数据库
USE [master]
GO
EXEC sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
EXEC sp_configure 'contained database authentication', 1
RECONFIGURE WITH OVERRIDE
ALTER DATABASE [test3] SET CONTAINMENT = PARTIAL WITH NO_WAIT
GO

包含用户连接

接下来我将在部分包含数据库 test3 中创建测试包含用户。当然除包含用户可以连接外,登陆账户仍可以连接。在部分包含数据库test3中创建包含用户Jack(带密码的 SQL 用户) 并赋予其连接数据库的权限,脚本如下:

USE test3
GO
--创建包含用户Jack
CREATE USER Jack WITH PASSWORD = 'a8ea v*(Rd##+' 
--赋予用户Jack 连接数据库的权限
GRANT CONNECT TO Jack

从SSMS的资源管理器中使用用户Jack连接数据库,直接连接,会报如下错误:

这是因为使用包含用户连接包含数据库时,需要指定对应的包含数据库,在连接属性中,指定要连接的部分包含数据库test3,如下图:

再点击连接时,可以成功连接。

 

全部评论



提问