处理SQL数据库中孤立用户_SQL SERVER数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

处理SQL数据库数据库中孤立用户

作者:黑客防线网安SQL维护基地 来源:黑客防线网安SQL维护基地 浏览次数:0

本篇关键词:SQL数据库SQL教程
黑客防线网安网讯:   把数据库从一个服务器实例附加和恢复到另一个实例中是数据库管理员执行的常见的任务。附加或者恢复一个数据库之后,之前在数据库中创建和配置的登录名已经不能访问了。这个问题最常见的...

   把数据库从一个服务器实例附加和恢复到另一个实例中是数据库管理员执行的常见的任务附加或者恢复一个数据库之后之前在数据库中创建和配置的登录名已经不能访问了这个问题最常见的症状是应用程序会遇到登录失败的错误或者是当你试着把登录名添加到数据库中时,你可能会得到一个信息比如这个用户已经在这个数据库中存在。当你执行一个附加或者一个恢复时,这是很常见的一种情况,那么你如何解决这个问题呢?
  专家解答
  当数据库从一个服务器迁移到另一个服务器时,存储在主从数据库中的登录名ids与存储在每个用户数据库中的登录名ids不符合。正如上面所说的,附加或恢复一个数据库之后你会看到的一些错误包括:

  Msg 229, Level 14, State 1
  %s permission denied on object %.*s, database %.*s, owner %.*s
  或者
  Microsoft SQL-DMO (ODBC SQLState: 42000) Error 15023: User or role '%s' already exists in the current database.
  没有正确的理解和适当的计划,你可能会遇到这个问题。你可能会删除和重新创建这个用户,但是你将释放所有配置的权限。所以一个正确的链接机制是需要的,因此要保留权限。
  你可能看到的一些可能的错误信息包括


   在开始这个问题的解决方案之前,最好看看反方向的问题。存储在主从数据库中的SQL Server 登录名映射到个别的数据库中。SQL Server 登录名通过使用映射到适当的SQL Server 登录名的数据库用户来访问个别的数据库。有两种情况例外,那就是来宾帐户和Microsoft Windows组成员身份。服务器实例上的SQL Server 2005登录名在sys.server_principals系统目录视图和sys.syslogins视图上是可见的。对于SQL Server 2000,你可以在sysxlogins表中得到SQL Server登录名信息。
  另一方面,映射到另一个数据库用户的信息存储在系统表sysusers的数据库中。它包括数据库用户名和相对应的SQL Server登录名的安全标示符(SID)。这个数据库用户的权限用于在数据库中授权。

  所以我们可以说,每次我们创建一个SQL Server登录名,就可以在SQL Server 2005 的 sys.server_principals系统目录视图或者sys.syslogins视图上看到它。一个数据库中的sysusers表的表项链接到上图显示的SQL Server 登录名中。这个链接通过一个名为SID的栏创建。
  如果我们通过某些过程把我们的数据库迁移到另一个SQL Server实例上,那么这个新的服务器可能会或可能不会拥有相同的登录名并且这些登录名的SIDs可能与原来服务器中的登录名的SIDs不一样。这意味着,迁移的数据库中的sysusers表具有与新的服务器中的主从数据库的登录名信息不符的SIDs。因此,我们得到孤立用户(orphaned users)。
  以下将作为一个例子,我在AdventureWorks数据库中创建和配置四个具有不同权限的用户。这些用户是TestUser1,TestUser2,TestUser3和TestUser4。当我把这个数据库备份还原到SQL Server 2005实例中,虽然用户在AdventureWorks数据库中显示并且登录名存在于新的服务器中,但是这些登录名没有一个访问到新的恢复数据库中。
  所以记住这个情景,让我们先来执行一些查询,看看SQL Server 登录名SIDs(如果SQL Server登录名显示了)和TestUser3的数据库用户SIDs之间的差异。
  用来查看SID中的差异的脚本

  USE MASTER
  GO
  SELECT name as SQLServerLogIn,SID as SQLServerSID FROM sys.syslogins
  WHERE [name] = 'TestUser3'
  GO
  USE AdventureWorks
  GO
  SELECT name DataBaseID,SID as DatabaseSID FROM sysusers
  WHERE [name] = 'TestUser3'
  GO

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-11621-1.html
网站维护教程更新时间:2012-03-21 03:23:36  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer