ชื่อผู้ใช้ของเรามีการเปลี่ยนแปลงอย่างถูกต้องตามกฎหมายดังนั้นเราจึงเปลี่ยนชื่อผู้ใช้ 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 และจะส่งคืนชื่อที่ไม่ถูกต้อง ดูเหมือนว่าฉันจะไม่เข้าใจกลไกการทำงานที่นี่จริงๆ
ข้อสังเกตบางอย่างที่อาจสำคัญ:
ผู้ใช้รายนี้ไม่มีการเข้าสู่ระบบที่ชัดเจนบนเซิร์ฟเวอร์ แต่พวกเขาเป็นสมาชิกของกลุ่มโฆษณาที่ทำ ชื่อที่เปลี่ยนแปลง (โดเมน \ newname) จะปรากฏในชุดผลลัพธ์สำหรับ
exec xp_logininfo 'domain\ADGroupName', 'members'
; domain \ oldname ไม่ได้ผู้ใช้กำลังเรียก suser_name () จากภายในโพรซีเดอร์ที่เก็บไว้ซึ่งเรียกจากเคียวรี passthrough ใน Access 2003 MDB
เราได้เปลี่ยนชื่อบัญชีผู้ใช้จำนวนมากในอดีต แต่ได้สังเกตปัญหานี้ในสัปดาห์ที่แล้วเท่านั้น (มีการเปลี่ยนแปลงสองครั้งในสัปดาห์ที่แล้วทั้งสองดูเหมือนจะมีปัญหา)
เซิร์ฟเวอร์กำลังเรียกใช้ Sql Server 2008 SP3 x64 บน Windows 2008 R2 Datacenter edition
เกิดอะไรขึ้น? ในฐานะ DBA ฉันควรทำอย่างไรหรือฉันจะแก้ไขปัญหานี้ได้ที่ไหน
SUSER_SNAME()
มันควรได้รับการแก้ไข ณ จุดนั้น จากนั้นคุณสามารถลองลบข้อมูลเข้าสู่ระบบและดูว่าชื่อนั้นเป็นชื่อใหม่หรือไม่
ipconfig /flushdns
และipconfig /registerdns
จากบรรทัดคำสั่งเพื่อดูว่าปัญหานั้นหมดไปหรือไม่
EXECUTE AS
และSELECT SUSER_NAME()
ทดสอบของคุณ คุณเคยลองSUSER_SNAME()
และรูปแบบอื่น ๆ อีก 100 รูปแบบบ้างไหม?