我已经将数据库从SQL 2000移到新的2005服务器。 一切都很好,直到我login到一个特定的用户的Sql Serverpipe理工作室。 它看起来像我login成功,但是当我试图扩大数据库,我得到'数据库不可访问'。 我可以login与Windows身份validation和其他SQL用户没有问题,可以看到一切。
我检查并确保数据库不处于单用户模式。 我也检查了孤儿login(exec sp_change_users_login'报告'),没有被发现。 用户也有权访问数据库。
任何帮助指引我在正确的方向将不胜感激。
这很可能是新服务器上的权限问题。 您的SQLlogin不会自动继续,如果您在新服务器上手动创build它,它将得到一个不同的SID,这个SID将不会被允许访问数据库的SID。
最好的方法是使用sp_help_revlogin (KB918992万一链接死掉)在旧服务器上生成login脚本,然后在新服务器上运行脚本。 此过程将SID和密码信息传送到新服务器,有效地在新服务器上重新创buildlogin。 完成此操作后,数据库中设置的权限应与新服务器上的login名同步。
这对Windowslogin不应该是一个问题,因为SQL从Windows获取SID,尽pipe您仍然需要在新服务器上设置Windowslogin。 sp_help_revlogin也会为你处理这个部分。
感谢您的回应! 经过一段时间,我去了,从数据库中删除用户,并重新创build它,工作! 我曾经删除了用户并重新创build了它,但是之前我在服务器级别上进行了这一操作,而不是数据库级别。 一旦我从数据库中删除用户,并重新创build它,它工作正常。 再次感谢您的帮助!
您不会遇到基于Windows的login问题,因为它们没有通过SID关联到数据库。 SQLlogin的情况就是这样,因为这会导致“孤立”。 最好的办法是使用sp_help_revlogin(主动)或使用sp_change_users_login(被动地)。 我在发现sp_help_revlogin之前,始终使用了以下脚本。 这仍然有效:
DECLARE @user SYSNAME DECLARE @SQL NVARCHAR(300) DECLARE cur_Users CURSOR FOR SELECT name FROM sysusers WHERE islogin = 1 AND isntname = 0 AND NAME NOT IN ('guest', 'dbo', 'sys', 'INFORMATION_SCHEMA') ORDER BY name OPEN cur_Users FETCH NEXT FROM cur_Users INTO @user WHILE @@FETCH_STATUS = 0 BEGIN SELECT @SQL = 'EXEC sp_change_users_login ' + '''' + 'UPDATE_ONE' + '''' + ', ' + '''' + @user + '''' + ', ' + '''' + @user + '''' EXEC sp_executesql @SQL FETCH NEXT FROM cur_Users INTO @user END CLOSE cur_Users DEALLOCATE cur_Users
从2000年到2005年发生的变化之一与2005年新的数据库级权限CONNECT有关。 在SQL Server 2000中,作为数据库中的用户还意味着您可以访问数据库。 但是,在SQL Server 2005中,作为数据库中的用户本身并不足以授予用户对其的访问权限。 通常情况下,你甚至不会注意到这一点,因为在SQL Server 2005中创build用户,无论是通过DDL还是通过GUI,都会自动授予用户CONNECT权限。 有没有可能在升级过程中丢失了这个?
我可以通过创buildlogin并将login映射到数据库,然后到数据库并发出REVOKE CONNECT TO用户名来重新创build您的问题。 当我试图通过SSMS作为用户名访问该数据库时,我得到相同的错误消息,数据库不可访问。
如果您确定用户不是孤立的,那么我将通过SSMS进入数据库属性的Permissions页面,并validation您的问题用户是否具有CONNECT权限的Grant,或者运行以下查询:
SELECT pr.name,per。* FROM sys.database_principals AS pr JO JO sys.database_permissions AS per ON pr.principal_id = per.grantee_principal_id WHERE pr.name ='your username here'AND per.permission_name ='CONNECT';
如果没有行被返回,则用户需要重新添加CONNECT权限才能按预期访问数据库。
是升级还是分离和重新连接? 如果将数据库分离并移动到另一台服务器,则用户将出现在数据库中,但不一定会获得安全性挂钩。 您可能需要重置其在服务器上的权限,或删除用户并重新创build它。
您还可以使用存储过程sp_change_users_login将数据库用户重新映射到新服务器上的相应login名。 这没有删除数据库用户的伎俩。 这也保留了用户的权限,如果您已经设置了数据库中的对象的细化权限,那么这非常方便。 (请注意,这不适用于Windows身份validationlogin,但通常在正确同步的情况下我没有任何问题。)