修复孤儿用户“来宾”吗?


8

如果guest孤立了该特殊用户(未链接到任何登录名),该怎么办?

对于我的一个数据库(SQL Server 2005),执行以下操作会将来宾用户列为孤立用户。

exec sp_change_users_login 'report'

结果:

UserName    UserSID
guest       0x3C2E66759FFBC14F84127D6795C27FD3

如果尝试使用该过程修复来宾用户,则会得到以下信息:

exec sp_change_users_login 'update_one', 'guest', 'guest'

终止此过程。在此过程中,“ guest”是登录名参数的禁止值。

如果我尝试删除用户,则会得到:

不能删除用户“来宾”,只能将其禁用。

select * from sys.database_principals where name = 'guest'

结果是:

name                 guest
principal_id         2
type                 S
type_desc            SQL_USER
default_schema_name  guest
create_date          11/13/98 2:58 AM
modify_date          10/16/01 4:31 PM
owning_principal_id  NULL
sid                  0x3C2E66759FFBC14F84127D6795C27FD3
is_fixed_role        0

数据库似乎对于这是否是特殊用户感到困惑。有什么可以做的吗?


其SID被列出为0x3C2E66759FFBC14F84127D6795C27FD3代替0x00
JustinStolle,2012年

您是否尝试过自动修复?我很好奇看到结果。
SQLRockstar 2012年

我得到Terminating this procedure. 'guest' is a forbidden value for the login name parameter in this procedure.
JustinStolle,2012年

因为没有用户名(msdn.microsoft.com/en-us/library/ms174378.aspx),所以收到该错误。我很难重新创建您的方案。
Thomas Stringer 2012年

1
我想补充一点,就是遇到了与贾斯汀完全一样的问题。这里的问题是guest的sid应该为0x00,但是无论出于什么原因,它都不是,因此sp_change_users_login'report'会将其作为孤立的用户使用。我只是看不到DBA有一种以常规方式更改或破坏[guest] sid的方法。因此,我认为这种混乱很可能是由sql服务器补丁在某个时候以某种方式造成的。
jyao

Answers:


5

用户“ guest”永远不会分配给服务器登录名,即使在全新安装中,它也被归类为没有登录名的SQL用户。由于您只能设置登录名(创建时)的SID,而不能设置用户的身份,所以我认为这是不可能的。sp_change_users_login不能完全正常运行,原因是永远不要将来宾帐户映射到服务器登录名。结果,用户“访客”始终是孤立用户。可能不是您想要的答案:)


您是否认为有一种方法可以将该数据库备份/还原到另一个位置,同时将来宾用户从还原中删除呢?
贾斯汀·斯托(JustinStolle)2012年

是的,但不是很漂亮。简单的备份和还原将不起作用,因为其中将包括来宾用户。您需要从使用与原始安装相同的方法创建的新数据库开始(假设模型中的来宾具有正确的SID)。然后从现有系统中将所有数据导出到新数据库中。这会行得通,但是对于这么小的事情却需要付出很多努力……
World DBA 2012年

因此,尽管该帐户的SID意外,您认为它确实没有问题,可以安全地在sp_change_users_login报告中忽略它吗?
贾斯汀·斯托(JustinStolle)2012年

在这种情况下,我要说的是,基于一个事实,就是您实际上无能为力。然后是关于是否应该使用它的经典辩论,但这完全是一个不同的问题... :)
World Wide DBA

2

我的想法...之所以sp_change_users_login抛出该错误,是因为MS也编写了该错误。[时不时地浏览系统过程代码会很有趣。:)]但是,在运行报表时会显示该事实,表明某人/某些进程将帐户弄乱了,或者MS可能提供了热修复程序(您永远不会知道)。

来宾帐户应该在那里,因为默认情况下该帐户存在于模型中,所以它存在于所创建的每个数据库中。要使其不显示在报告中,可能需要将SID更改回0x00我猜。只要帐户被禁用,我都会不理会它,而忽略它。如果确实让我感到困扰,尽管我会掏出钱并在Microsoft支持下打电话。


换句话说,您是说guest在这种情况下结果中不会出现问题。
贾斯汀·斯托(JustinStolle)2012年

是的,是的。

1

注意:每当将数据库从一台服务器移动到另一台服务器时,通常都会出现孤立用户问题。FileListOnly是sql server中的新术语,它具有有权访问它的已创建备份的所有详细信息。

因此,您必须遵循一些任务序列

  1. 首先,您必须将FileListOnly从创建的备份还原到目标服务器或新服务器。
  2. 恢复备份。
  3. 根据需要使用sp_change_users_login。有关此过程的帮助,可以参考 http://msdn.microsoft.com/zh-cn/library/ms174378.aspx

我在这里举一个例子,希望对您有所帮助:

> RESTORE FILELISTONLY FROM DISK = N'C:\YourDB.bak'
> 
> RESTORE DATABASE YourDb FROM DISK = N'C:\YourDB.bak' WITH MOVE
> N'YourDB' TO N'D:\YourDB.mdf', MOVE N'YourDB_log' TO N'D:\YourDB.ldf',
> REPLACE
> 
> exec YourDB.dbo.sp_change_users_login 'update_one', 'UserName','UserName'

这对guest用户不起作用。请参阅上面布朗斯通先生的回答。
西蒙·里加特斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.