示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 2008,示例数据库是AdventureWorks for SQL Server 2008。起初我以为示例数据库AdventureWorks for SQL Server 2005 与AdventureWorks for SQL Server 2008 数据库结构应该差不多,可是在练习的过程中,我发现两个数据库中很多表的结构还是有很多不一样的地方。于是决定到微软下载中心将示例数据库AdventureWorks for SQL Server 2005下过来,附加到SQL Server 2008上,以便顺利进行练习。我以SQL Server 2008的超级管理员账户“sa”连接登录到实例SQLSERVER2008:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL

在附加示例数据库AdventureWorks for SQL Server 2005时,弹出了下图这个错误:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_Server_02

尝试打开或创建物理文件......时,CREATE FILE遇到操作系统错误 5(拒绝访问。)”  ,一看就知道应当是对要附加的数据文件的操作权限不够。     按一般的思维习惯,我们会对操作权限不够的文件授予足够的操作权限。比如,有网友说“给要附加的数据文件和相应的日志文件授予Everyone的权限”,授权过程如下三张截图所示(注意数据文件和日志文件都必须授权):

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_Server_03

 

(图1:授权数据文件)

 

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_数据文件_04

(图2:数据文件授权后)

 

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_Server_05

(图3:日志文件授权后)  

 

是不是问题就这样解决了呢?这样子做对吗?     如果在真实的数据库管理过程中,我们把数据文件、日志文件的权限放大到Everyone,那肯定是不对的做法。因为这样数据库的安全性将大打折扣,虽然对Everyone只授予了【读取和执行】、【读取】的权限,但这仍然有泄漏数据的危险。

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_数据文件_06

 

(相应数据文件原本的权限情况) 

 

 

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_数据文件_07

(xrm用户的信息) 

 

SA连接登录实例后,SQL Server却没有权限访问此数据文件。换句话说,以SQL Server 2008的超级管理员SA连接登录实例后,登录的身份不在SYSTEM用户组,也不是xrm这个管理员。那会是什么呢?

Sql Server Configuration Manager (即SQL Server 配置管理器)查看一下当前连接到的实例服务的相关信息,如下图所示:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL_08

 

(当前实例服务的相关信息)  

 

,即操作系统授权的【本地服务】,本地服务也是了个用户组。换句话说,如果我们仅授予【本地服务】这个用户组的权限(而不是Everyone),应该也可以在SQL Server 2008中用sa的账户附加数据库了。为此,将刚刚授予相应数据文件和日志文件Everyone的权限都删除,再授予LocalService用户组相应数据文件和日志文件的权限,重新尝试附加相应的数据库,发现的确可以附加成功!不必说,授予操作系统授权的【本地服务】用户组比起授予Everyone来说肯定要安全的多。

SA身份连接登录SQL Server 2008的实例也能访问相应的数据文件。而要达到这个目的,我们只需要将相应实例的登录身份改为SYSTEM【本地系统】用户组,SYSTEM也是在相应数据文件的权限范围之内的用户组,而且SQL Server实例以本地系统身份运行,安全性将更高。我们可以在SQL Server 配置管理器中将相应的SQL Server实例的登录身份修改为【本地系统】即Local System,如下列图所示:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL_09

 

(修改实例的登录身份)

 

  

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL_10

(实例的登录身份变为LocalSystem)

 

SA身份连接登录SQL Server 2008的相应实例并尝试附加数据库, 同样可以成功的将数据库附加上!!!  

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_数据文件_11

SA身份连接登录SQL Server 2008的相应实例来附加相应数据库,那么在连接登录SQL Server 2008的相应实例时,身份验证选择【Windows 身份验证】,不做前文中所述的其他修改就可以把数据库附加上去了,原因就在于:【Windows 身份验证】用的是当前操作系统的用户的权限,权限一般都足够大的。另外,在【SQL Server 配置管理器】中针对实例服可以做的操作,在Windows的【服务】上也可以做到。

 

 

 

标签: SQL Server附加数据库, 错误5123, Microsoft SQL Server 错误5123



示例数据库是AdventureWorks for SQL Server 2005,而我的机子上装的是SQL Server 2008,示例数据库是AdventureWorks for SQL Server 2008。起初我以为示例数据库AdventureWorks for SQL Server 2005 与AdventureWorks for SQL Server 2008 数据库结构应该差不多,可是在练习的过程中,我发现两个数据库中很多表的结构还是有很多不一样的地方。于是决定到微软下载中心将示例数据库AdventureWorks for SQL Server 2005下过来,附加到SQL Server 2008上,以便顺利进行练习。我以SQL Server 2008的超级管理员账户“sa”连接登录到实例SQLSERVER2008:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL_12

在附加示例数据库AdventureWorks for SQL Server 2005时,弹出了下图这个错误:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_Server_13

尝试打开或创建物理文件......时,CREATE FILE遇到操作系统错误 5(拒绝访问。)”  ,一看就知道应当是对要附加的数据文件的操作权限不够。     按一般的思维习惯,我们会对操作权限不够的文件授予足够的操作权限。比如,有网友说“给要附加的数据文件和相应的日志文件授予Everyone的权限”,授权过程如下三张截图所示(注意数据文件和日志文件都必须授权):

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL_14

 

(图1:授权数据文件)

 

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_数据文件_15

(图2:数据文件授权后)

 

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_Server_16

(图3:日志文件授权后)  

 

是不是问题就这样解决了呢?这样子做对吗?     如果在真实的数据库管理过程中,我们把数据文件、日志文件的权限放大到Everyone,那肯定是不对的做法。因为这样数据库的安全性将大打折扣,虽然对Everyone只授予了【读取和执行】、【读取】的权限,但这仍然有泄漏数据的危险。

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL_17

 

(相应数据文件原本的权限情况) 

 

 

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_数据文件_18

(xrm用户的信息) 

 

SA连接登录实例后,SQL Server却没有权限访问此数据文件。换句话说,以SQL Server 2008的超级管理员SA连接登录实例后,登录的身份不在SYSTEM用户组,也不是xrm这个管理员。那会是什么呢?

Sql Server Configuration Manager (即SQL Server 配置管理器)查看一下当前连接到的实例服务的相关信息,如下图所示:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_Server_19

 

(当前实例服务的相关信息)  

 

,即操作系统授权的【本地服务】,本地服务也是了个用户组。换句话说,如果我们仅授予【本地服务】这个用户组的权限(而不是Everyone),应该也可以在SQL Server 2008中用sa的账户附加数据库了。为此,将刚刚授予相应数据文件和日志文件Everyone的权限都删除,再授予LocalService用户组相应数据文件和日志文件的权限,重新尝试附加相应的数据库,发现的确可以附加成功!不必说,授予操作系统授权的【本地服务】用户组比起授予Everyone来说肯定要安全的多。

SA身份连接登录SQL Server 2008的实例也能访问相应的数据文件。而要达到这个目的,我们只需要将相应实例的登录身份改为SYSTEM【本地系统】用户组,SYSTEM也是在相应数据文件的权限范围之内的用户组,而且SQL Server实例以本地系统身份运行,安全性将更高。我们可以在SQL Server 配置管理器中将相应的SQL Server实例的登录身份修改为【本地系统】即Local System,如下列图所示:

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_数据文件_20

 

(修改实例的登录身份)

 

  

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_SQL_21

(实例的登录身份变为LocalSystem)

 

SA身份连接登录SQL Server 2008的相应实例并尝试附加数据库, 同样可以成功的将数据库附加上!!!  

SQL SERVER 2012附加 错误5171 sql附加数据库错误5171_Server_22

SA身份连接登录SQL Server 2008的相应实例来附加相应数据库,那么在连接登录SQL Server 2008的相应实例时,身份验证选择【Windows 身份验证】,不做前文中所述的其他修改就可以把数据库附加上去了,原因就在于:【Windows 身份验证】用的是当前操作系统的用户的权限,权限一般都足够大的。另外,在【SQL Server 配置管理器】中针对实例服可以做的操作,在Windows的【服务】上也可以做到。