我们的用户名之一已合法更改,因此我们将其Active Directory用户名更改为匹配-从domain \ oldname更改为domain \ newname。但是,当此用户在存储过程中调用suser_sname()时,它将返回旧名称,而不是新名称。
Googling将我引向了KB 946358,这表明它们的名称已在服务器上缓存并且未更新,大概是因为suser_name()正在调用LsaLookupSids。但是,该文章中的解决方法涉及重新启动服务器,即使是这样,我仍然想了解问题所在。
如果我将上下文更改为他们的上下文,则会返回正确的名称:
EXECUTE AS LOGIN = 'domain\newname'
GO
SELECT suser_name() --returns 'domain\newname'
...我以为这也将调用LsaLookupSids,因此将返回错误的名称。我似乎不太了解此处的工作机制。
一些可能重要的观察结果:
该用户在服务器上没有显式登录。但是他们是这样做的AD组的成员。更改后的名称(domain \ newname)出现在的结果集中
exec xp_logininfo 'domain\ADGroupName', 'members'
;域\旧名称没有。用户正在从存储过程中调用suser_name(),该过程是从Access 2003 MDB中的直通查询调用的。
过去,我们已经更改了许多用户的帐户名,但是仅在上周才发现此问题(上周进行了两项更改,似乎都显示了该问题)。
该服务器正在Windows 2008 R2 Datacenter版上运行Sql Server 2008 SP3 x64。
这是怎么回事?作为DBA,我该怎么办?或者我打算在哪里解决这个问题?
SUSER_SNAME()
,此时应将其修复。然后,您可以尝试删除登录名,看看它是否保留了新名称。
ipconfig /flushdns
并ipconfig /registerdns
从命令行查看是否可以解决问题。
EXECUTE AS
并进行SELECT SUSER_NAME()
测试。另外,您是否尝试过SUSER_SNAME()
其他100种变体中的任何一种?