神奇的“用户 'sa' 登录失败”,期待高人解释。
风声3 2011-05-21 09:42:11 网上搜索几天了,没有对应的解法,问题似乎很简单:
通过备份文件在本地恢复了一个数据库(以下称外来数据库),在本机调试程序总出错:
无法打开登录所请求的数据库 "××××"。登录失败。
用户 'sa' 登录失败。
暂时没有在网上找到有效的各种解决方案,神奇的地方是:
1、将数据库连接中数据库名更换为本机创建的数据库,可以访问。
这应该可以说明数据库连接没问题,sa密码没问题,数据库服务器也没问题;
2、SQL Server Management Studio/查询分析器均能通过sa正常访问。
3、我开始怀疑备份文件是不是IO错误:
1)于是下载一个更早日期的备份恢复为数据库 B,程序成功访问数据库 B(代码无任何修改);
2)我以为问题解决,正在抱怨谁提供的备份数据库,害我折腾老半天;
3)接下来,我又下载一个晚一点日期的备份恢复为数据库 C,仍旧发现“用户'sa'登录失败”;
4)我决定不求所以然了,切换(仅修改程序连接字符串)回数据库 B 去做我无聊的调试去,天杀的数据库 B 发脾气了:“用户'sa'登录失败”。
外来的数据库伤不起啊……我开始为刚才草率的抱怨羞愧不已……
综上几点,我开始研究这些外来的数据库和我本机原生的数据库有什么异同,发现:
1、外来数据库“安全性-用户”里含有更多的用户,先不管什么根据,删掉;
2、其中一个居然删除失败,提示架构中含有主体;
3、仔细对比之下修改架构和本机原生数据库完全相同,成功删除那个用户;
4、发现原生数据库“安全性-用户”里面的“dbo”用户名为:dbo 登录名为:计算机名\Administrator
5、发现外来数据库“安全性-用户”里面的“dbo”用户名为:dbo 登录名为:sa(无法修改)
6、发现数据库服务器“安全性-用户”里面“sa”用户映射里原生数据库没有打勾
7、发现数据库服务器“安全性-用户”里面“sa”用户映射里外来数据库打勾了(无法删除)
事实证明,以上研究纯粹是乱投医,数据库B坚定的告诉我:“用户'sa'登录失败”。