2023年11月27日发(作者:)

SQLServer数据库错误5123解决⽅案

因为⾃⼰有⼀本基于SQL Server 2005的数据库教程,⾥边使⽤的⽰例数据库是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

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

仔细看了⼀下主要信息尝试打开或创建物理⽂件......时,CREATE FILE遇到操作系统错误 5(拒绝访问。)”,⼀看就知道应当是对要

附加的数据⽂件的操作权限不够。 按⼀般的思维习惯,我们会对操作权限不够的⽂件授予⾜够的操作权限。⽐如,有⽹友说给要

附加的数据⽂件和相应的⽇志⽂件授予Everyone的权限,授权过程如下三张截图所⽰(注意数据⽂件和⽇志⽂件都必须授权):

(图1:授权数据⽂件)

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

(图3:⽇志⽂件授权后)

对要附加的数据⽂件和⽇志⽂件分别授予Everyone【读取和执⾏】、【读取】的权限后,在SQL Server 2008中重新尝试附加数据

库,发现可以附加成功了!是不是问题就这样解决了呢?这样⼦做对吗? 如果在真实的数据库管理过程中,我们把数据⽂件、⽇

志⽂件的权限放⼤到Everyone,那肯定是不对的做法。

因为这样数据库的安全性将⼤打折扣,虽然对Everyone只授予了【读取和执⾏】、【读取】的权限,但这仍然有泄漏数据的危

险。 我们应当保证能正常访问的情况下,使数据⽂件具有最⼩的访问权。我们之前授权给Everyone,那所有⽤户或账户都能操作

相应的⽂件了,这肯定不安全的。

那么如何才能授予最⼩的访问权限呢?思考⼀下,我们⽤SQL Server 2008去附加相应的数据⽂件,报出拒绝访问即权限不够的

错误,换句话说,当前SQL Server 2008没有权限访问这些⽂件。我们右键⽂件,到⽂件属性中查看⼀下⽂件的权限情况,如下图

所⽰:

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

我们发现只有SYSTEMxrm这两个组或⽤户才有权操作此数据⽂件。SYSTEM是⼀个⽤户组,即【本地系统】组,⽽xrm是⼀个

管理员⽤户,如图⽰:

xrm⽤户的信息)

SYSTEM⽤户组和xrm这个管理员⽤户都有权限操作此数据⽂件和⽇志⽂件,⽽以SQL Server2008的超级管理员SA连接登录实例

后,SQL Server却没有权限访问此数据⽂件。换句话说,以SQL Server2008的超级管理员SA连接登录实例后,登录的⾝份不在

SYSTEM⽤户组,也不是xrm这个管理员。

那会是什么呢? 我们查看⼀下当前SQL Server 2008的实例服务的相关信息就知道了,打开Sql ServerConfiguration Manager (

SQL Server 配置管理器)查看⼀下当前连接到的实例服务的相关信息,如下图所⽰:

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

发现当前实例SQLSERVER2008的登录⾝份为“NT AUTHORITYLocalService”,即操作系统授权的【本地服务】,本地服务也是

了个⽤户组。换句话说,如果我们仅授予【本地服务】这个⽤户组的权限(⽽不是Everyone),应该也可以在SQL Server 2008

sa的账户附加数据库了。

为此,将刚刚授予相应数据⽂件和⽇志⽂件Everyone的权限都删除,再授予LocalService⽤户组相应数据⽂件和⽇志⽂件的权限,

重新尝试附加相应的数据库,发现的确可以附加成功!不必说,授予操作系统授权的【本地服务】⽤户组⽐起授予Everyone来说

肯定要安全的多。

上⾯提到的⽅法中,我们都是改变了数据⽂件原来的权限范围(原来的权限范围只有SYSTEM即【本地系统】⽤户组和xrm这个系

统管理员)。

⽽更好的办法是不要改变数据⽂件的权限范围,仍然以SA⾝份连接登录SQL Server 2008的实例也能访问相应的数据⽂件。

⽽要达到这个⽬的,我们只需要将相应实例的登录⾝份改为SYSTEM【本地系统】⽤户组,SYSTEM也是在相应数据⽂件的权限

范围之内的⽤户组,⽽且SQL Server实例以本地系统⾝份运⾏,安全性将更⾼。我们可以在SQL Server 配置管理器中将相应的

SQL Server实例的登录⾝份修改为【本地系统】即Local System,如下列图所⽰:

(修改实例的登录⾝份)

(实例的登录⾝份变为LocalSystem

然后重启相应实例服务,重新以SA⾝份连接登录SQL Server 2008的相应实例并尝试附加数据库,同样可以成功的将数据库附加

其实,如果不是要特别地以SA⾝份连接登录SQL Server 2008的相应实例来附加相应数据库,那么在连接登录SQL Server 2008

相应实例时,⾝份验证选择【Windows ⾝份验证】,不做前⽂中所述的其他修改就可以把数据库附加上去了,原因就在于:

Windows ⾝份验证】⽤的是当前操作系统的⽤户的权限,权限⼀般都⾜够⼤的。另外,在【SQL Server 配置管理器】中针对实

例服务可以做的操作,在Windows的【服务】上也可以做到。

以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。