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没有权限访问这些⽂件。我们右键⽂件,到⽂件属性中查看⼀下⽂件的权限情况,如下图
所⽰:
(相应数据⽂件原本的权限情况)
我们发现只有SYSTEM和xrm这两个组或⽤户才有权操作此数据⽂件。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的【服务】上也可以做到。
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。


发布评论