SQL Server:登录成功但是“数据库[dbName]不可访问。(ObjectExplorer)”

63
我使用的是Windows 8.1和SQL Server 2012。我曾经使用一个名为“Manoj”的操作系统账户通过Windows身份验证访问SQL SERVER。最近我删除了操作系统中的用户账户“Manoj”,并创建了一个相同名称的新账户“Manoj”。

但是系统将新账户视为“Manoj_2”。这个变化使我无法访问我之前创建的旧数据库。

每当我尝试访问之前创建的任何一个数据库时,都会出现以下错误提示:

The database [dbName] is not accessible. (ObjectExplorer)

我尝试在SQL Server中为“Manoj_2”创建新的登录名,并将默认数据库设置为“master”,但问题仍然存在。

我无法分离数据库,也无法展开数据库。

注意:在操作系统中,我对“Manoj”账户拥有管理员权限。

请问有谁能告诉我该怎么做?可以从操作系统或SQL Server两方面考虑。


你需要首先在服务器级别上为你的 SQL Server 实例创建一个使用你的新操作系统账户的登录;然后你需要在每个你想要访问的数据库中为该登录创建用户 - marc_s
无法删除现有登录 删除登录失败

标题:Microsoft SQL Server Management Studio

删除 'IRON\Manoj_2' 登录失败。 (Microsoft.SqlServer.Smo)执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)无法删除登录 'IRON\Manoj_2',因为它不存在或您没有权限。 (Microsoft SQL Server, 错误: 15151)
- Manoj Kumar
1
我并没有说你必须放弃任何东西..... - marc_s
抱歉,如您建议的那样,我尝试在服务器级别上创建登录。但似乎我已经创建了登录,仍然无法在树形视图中展开数据库。因此,我尝试删除该登录,但出现了上述错误。 - Manoj Kumar
1
如果您拥有一个默认数据库为master的登录名为IRON\Manoj_2,那么您可以在对象资源管理器中打开“安全性>登录名”节点,找到您的登录名,右键单击并选择“属性”,然后在“用户映射”部分定义此登录名需要访问哪些数据库。 - marc_s
22个回答

40

针对这种情况,您需要以单用户模式连接到数据库。

在单用户模式下启动 SQL Server,可以使计算机本地管理员组的任何成员连接到 SQL Server 实例,作为 sysadmin 固定服务器角色的成员。

您可以在此处找到逐步说明来完成此操作。

简言之,您必须使用-m 参数启动 sqlserver 实例,在使用 Windows 身份验证启动 Sql Server Management Studio。

现在您是一个sysadmin,请将sysadmin 角色分配给您的用户,然后退出并删除 -m 参数并重新启动 sql server。


如果我这样做,我就无法登录到我的SQL Server管理工具,你有任何想法为什么会出现这种情况吗? - Jeremy C.
也许有一个正在运行的服务(或远程连接),代替你登录到 SQL 并获取唯一的连接。 - Max
1
最糟糕的建议给了我。搞乱了我的用户和数据库。必须进行完全重新安装。紧急! - user1019042
首先尝试更简单的解决方案,检查数据库服务。 - Matthew Lock

34
问题在于数据库中的用户是“孤儿”。这意味着该用户没有与之相关联的登录 ID 或密码。即使存在匹配该用户的登录 ID,也是如此,因为还必须匹配 GUID(在 Microsoft 术语中称为 SID)。
过去修复此问题非常麻烦,但目前(SQL Server 2000,SP3),有一个存储过程可以执行繁重的工作。
所有这些说明都应该由数据库管理员完成,并选择恢复的数据库。
首先,请确保这是问题所在。以下操作将列出所有孤立的用户:
EXEC sp_change_users_login 'Report'
如果您已经拥有该用户的登录ID和密码,请按照以下步骤进行修复:
EXEC sp_change_users_login 'Auto_Fix', 'user'

如果您想为该用户创建新的登录ID和密码,请执行以下操作:

EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password'

这段文字是从http://www.fileformat.info/tip/microsoft/sql_orphan_user.htm获取的,时间为2017年12月13日。


1
这对我有用。确保将“user”替换为孤儿用户名,如果你(像我一样)不知道发生了什么 :) - Luis Aceituno
在我使用下面@Njal的答案切换到受影响的数据库之后,这对我起作用了:USE [dbname] GO EXEC sp_change_users_login... - Pakman

10

这个解决方案可能有些愚蠢,但我还是会在这里分享一下,以防有人通过谷歌搜索到这里。

我刚刚重启了SQL服务,在出现这个错误后等待了10分钟左右,问题就解决了。似乎这个错误只会在SQL服务刚启动时出现。


2
很奇怪!但对我有用。非常感谢分享。 - SP Developer

5
如果您正在使用Sql Management Studio,则只需以管理员身份启动它。
右键单击->以管理员身份运行。

4
这是我遇到的问题以及如何解决它的过程:
1.从.bak文件恢复了我的数据库,并将其还原到另一个SQL服务器实例中,其中包括一个预先存在的用户。
2.尝试使用相同的连接字符串但更新的服务器实例像往常一样从我的应用程序访问已还原的数据库。
3.收到错误信息。
4.删除了作为数据库所有者的用户,然后重新添加了具有完全相同凭据、映射和登录等的用户。
5.重新添加用户后,能够使用该用户登录。

4

我有两个用户:一个拥有sysadmin角色,另一个(有问题的那个)没有。

所以我用另一个用户登录(可以创建一个新用户),并从以下位置勾选“sysadmin”复选框:安全性-->登录名-->右键单击您的SQL用户名-->属性-->服务器角色-->确保“sysadmin”复选框被勾选。单击"确定"后,尝试使用新勾选的用户连接。


3
当用户的默认数据库设置为他们没有权限或离线的数据库时,就会出现此问题。只需尝试重新添加用户。请查看这里

1
尝试重新添加用户时,我在删除时遇到了错误。无法删除现有的登录名DROPPING THE LOGIN DELETE FAILURE TITLE:Microsoft SQL Server Management Studio ------------------------------ 删除“IRON\Manoj_2”登录名失败。(Microsoft.SqlServer.Smo)执行Transact-SQL语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo)无法删除登录名“IRON\Manoj_2”,因为它不存在或您没有权限。(Microsoft SQL Server,错误:15151) - Manoj Kumar

2
这对我有用:
Use [dbName]
GO

EXEC sp_change_users_login 'Auto_Fix','Manoj', null, 'Manojspassword'
GO

2

在我的情况下,当我使用管理员凭据打开SQL Server Management Studio,并右键单击数据库并选择“上线”或类似选项时,它起作用了。


1

请尝试这个脚本。它的作用是查看数据库的活动会话并终止它们,以便您可以将数据库恢复在线状态。

 CREATE TABLE #temp_sp_who2
        (
          SPID INT,
          Status VARCHAR(1000) NULL,
          Login SYSNAME NULL,
          HostName SYSNAME NULL,
          BlkBy SYSNAME NULL,
          DBName SYSNAME NULL,
          Command VARCHAR(1000) NULL,
          CPUTime INT NULL,
          DiskIO INT NULL,
          LastBatch VARCHAR(1000) NULL,
          ProgramName VARCHAR(1000) NULL,
          SPID2 INT
          , rEQUESTID INT NULL --comment out for SQL 2000 databases

        )


    INSERT  INTO #temp_sp_who2
    EXEC sp_who2


    declare @kill nvarchar(max)= ''
    SELECT  @kill = @kill+ 'kill '+convert(varchar,spid) +';'
    FROM    #temp_sp_who2
    WHERE   DBName = 'databasename'

    exec sp_executesql @kill


  ALTER DATABASE DATABASENAME SET ONLINE WITH IMMEDIATE ROLLBACK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接