包含是针对数据库独立性而来的,非包含数据库(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,如下图:
再点击连接时,可以成功连接。
本文链接:https://blog.nnwk.net/article/1533
有问题请留言。版权所有,转载请在显眼位置处保留文章出处,并留下原文连接
Leave your question and I'll get back to you as soon as I see it. All rights reserved. Please keep the source and links
友情链接:
子卿全栈
全部评论