วิธีการแก้ไขปัญหาสิทธิ์เมื่อคุณย้ายฐานข้อมูลระหว่างเซิร์ฟเวอร์ที่กำลังเรียกใช้ SQL Server

นำไปใช้กับ: Microsoft SQL Server 2005 Developer EditionMicrosoft SQL Server 2005 Enterprise EditionMicrosoft SQL Server 2005 Express Edition

สรุป


บทความนี้อธิบายวิธีการแมปล็อกมาตรฐาน และรวมในการแก้ไขปัญหาสิทธิ์เมื่อคุณย้ายฐานข้อมูลระหว่างเซิร์ฟเวอร์ที่กำลังเรียกใช้ SQL Server

ข้อมูลเพิ่มเติม


เมื่อคุณย้ายฐานข้อมูลจากหนึ่งเซิร์ฟเวอร์ที่กำลังเรียกใช้ SQL Server ไปยังเซิร์ฟเวอร์อื่นที่เรียกใช้ SQL Server ที่ไม่ตรงกันอาจเกิดขึ้นได้ระหว่างเลขรหัสความปลอดภัย (Sid) ของล็อกอินในฐานข้อมูลหลักและผู้ใช้ในผู้ใช้ ฐานข้อมูล โดยค่าเริ่มต้น SQL Server 7.0, SQL Server 2000, SQL Server 2005 ให้กระบวนการระบบที่จัดเก็บsp_change_users_loginให้แมปผู้ใช้เหล่านี้ไม่ตรงกัน อย่างไรก็ตาม คุณสามารถใช้กระบวนงานเก็บไว้sp_change_users_loginเพื่อแมปล็อกอิน SQL Server มาตรฐานเท่านั้น และคุณต้องดำเนินการเหล่านี้การแม็ปสำหรับผู้ใช้หนึ่งคนในแต่ละครั้ง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกระบวนงานเก็บไว้sp_change_users_loginดูหัวข้อ "sp_change_users_login" ใน SQL Server 7.0, SQL Server 2000 และ SQL Server 2005 Books Online

ใน SQL Server 7.0 หรือรุ่นที่ใหม่กว่า คุณสามารถรักษาการแม็ประหว่างผู้ใช้ในฐานข้อมูลผู้ใช้และการล็อกอินในฐานข้อมูลหลักโดยใช้ SIDs แม็ปนี้จะต้องรักษาสิทธิ์ที่ถูกต้องสำหรับการล็อกอินในฐานข้อมูลผู้ใช้ เมื่อแม็ปนี้จะหายไป ล็อกอินที่มีปัญหาเกี่ยวกับสิทธิ์ที่รวมถึง แต่ไม่จำกัดดังต่อไปนี้:
  • ถ้าไม่มีการเข้าสู่ระบบ SQL Server บนเซิร์ฟเวอร์ใหม่ และผู้ใช้ที่พยายามเข้าสู่ระบบ ผู้ใช้อาจได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
    เซิร์ฟเวอร์: ข่าวสารเกี่ยวกับ 18456 ระดับ 16 สถานะ 1
    เข้าสู่ระบบล้มเหลวสำหรับผู้ใช้ '%ls'
  • ถ้าการเข้าสู่ระบบ SQL Server มีอยู่บนเซิร์ฟเวอร์ใหม่ แต่ SID ในฐานข้อมูลหลักที่แตกต่างจาก SID ในฐานข้อมูลผู้ใช้ผู้ใช้ที่สามารถเข้าสู่ระบบ SQL Server เสร็จเรียบร้อยแล้ว อย่างไรก็ตาม เมื่อผู้ใช้พยายามเข้าถึงฐานข้อมูลนั้น ผู้ใช้อาจได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:
    เซิร์ฟเวอร์: ข่าวสารเกี่ยวกับ 916 ระดับ 14 สถานะ 1, Line1
    ผู้ใช้เซิร์ฟเวอร์ ' % * ls' ไม่ถูกต้องผู้ใช้ในฐานข้อมูล ' % * ls'
    หมายเหตุ ใน SQL Server 2005 ผู้ใช้อาจได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

    ผู้ใช้เซิร์ฟเวอร์ '%s' ไม่ถูกต้องผู้ใช้ในฐานข้อมูล '%s' เพิ่มบัญชีผู้ใช้ลงในฐานข้อมูลก่อน
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการรักษาความปลอดภัย 7.0 เซิร์ฟเวอร์ SQL ให้ดูเอกสารทางเทคนิค "Microsoft SQL Server 7.0 ความปลอดภัย" เมื่อต้องการดูเอกสารทางเทคนิค แวะไปที่เว็บไซต์ต่อไปนี้ของ Microsoft:สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการรักษาความปลอดภัย 2000 เซิร์ฟเวอร์ SQL คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:

322712 Microsoft SQL Server 2000 S322712 ความปลอดภัยลักษณะการทำงานและวิธีปฏิบัติที่ดีที่สุด

ข้อจำกัด

  • ถ้ามีผู้ใช้ในตารางsysusersโดยไม่มีคำนำหน้าชื่อคอมพิวเตอร์หรือชื่อโดเมนที่วัตถุเอง และวัตถุเหล่านี้ถูกอ้างอิงในแอพลิเคชัน โดยใช้ชื่อสองส่วน
    ชื่อผู้ใช้ objectnameแอพลิเคชันอาจแบ่งได้เนื่องจากกระบวนงานเก็บไว้sp_sidmapเปลี่ยนชื่อผู้ใช้เหล่านี้ ด้วยคำนำหน้าของชื่อคอมพิวเตอร์หรือชื่อโดเมน ตามที่ปรากฏในตารางsysxlogins เมื่อต้องการหลีกเลี่ยงปัญหานี้ กระบวนงานที่เก็บไว้เสร็จสมบูรณ์หลังจากsp_sidmapเปลี่ยนชื่อผู้ใช้ที่ได้รับผลกระทบในตารางsysusersเป็นชื่อเดิมของตน หรือติดต่อผู้ให้บริการสนับสนุนหลัก
  • บทความนี้ไม่ถือว่านามแฝง คุณต้องจัดการนามแฝงด้วยตนเอง
  • ถ้าไม่มีการล็อกอิน SQL Server มาตรฐานอยู่บนเซิร์ฟเวอร์ SQL Server ใหม่ คุณสามารถเพิ่มการเข้าสู่ระบบ ด้วยรหัสผ่านเป็น NULL คุณอาจต้องเปลี่ยนรหัสผ่านสำหรับล็อกอินเหล่านี้ตามลำดับ
  • ถ้าผู้ใช้ถูกสร้างขึ้นในฐานข้อมูลผู้ใช้ด้วยชื่อที่แตกต่างจากที่ซึ่งปรากฏในตารางsysxloginsจะไม่สามารถล็อกอินที่สอดคล้องกันสำหรับผู้ใช้ที่ทราบ ดังนั้น ก่อนที่คุณเรียกใช้sp_sidmapกระบวนงานเก็บไว้:
    1. โอนย้ายวัตถุทั้งหมดที่ผู้ใช้นี้เป็นเจ้าของไปยังฐานข้อมูลการจัดเตรียม
    2. ลบผู้ใช้ เพิ่มผู้ใช้ที่มีชื่อถูกต้อง และโอนย้ายกลับออบเจ็กต์ทั้งหมดสำหรับผู้ใช้นี้
  • ถ้าผู้ใช้ไม่มีการล็อกอินที่สอดคล้องกันหรือคำนำหน้าของชื่อคอมพิวเตอร์หรือชื่อโดเมน คุณได้รับข้อความสำหรับผู้ใช้นี้ ข้อความนี้บ่งชี้ว่า คุณต้องเพิ่มผู้ใช้ในระดับ Windows และเพิ่มไปยังเซิร์ฟเวอร์ SQL เป็นล็อกอิน หลังจากที่คุณทำเช่นนี้ คุณต้องเรียกใช้กระบวนงานเก็บไว้sp_sidmapอีกครั้ง
  • ถ้าผู้ใช้มีคำนำหน้าของชื่อโดเมนหรือชื่อเซิร์ฟเวอร์ภายในเครื่องของ Windows แต่ไม่มีล็อกอินที่สอดคล้องกันอยู่ในตารางsysxloginsกระบวนงานเก็บไว้พยายามเพิ่มสิ่งนี้เป็นล็อกอินใหม่กับ SQL Server ถ้าผู้ใช้ Windows ที่มีอยู่ ดังกล่าวสร้างข้อความผลลัพธ์ในหน้าต่างผลลัพธ์ และจากนั้น ด้วยตนเองสร้างล็อกอินหลังจากนั้นก่อนเพิ่มผู้ใช้ Windows
  • ถ้ามีมากกว่าหนึ่งล็อกอินสำหรับผู้ใช้ในตารางsysusersคุณเห็นข้อความผลลัพธ์ในแฟ้มผลลัพธ์ และแสดงโครงสร้างล็อกอินทั้งหมดที่มีชื่อเดียวกัน ณจุดนี้ คุณต้อง intervene เพื่อให้แน่ใจว่า ผู้ใช้ที่สอดคล้องกับล็อกอินเดียวเท่านั้นด้วยตนเอง

    ตัวอย่าง ถ้าตารางsysusersมีผู้ใช้ชื่อว่า "johndoe" และตารางsysxloginsมีล็อกอิน ด้วยชื่อเช่น "Test\johndoe" และ "Test2\johndoe" เมื่อคุณเรียกใช้กระบวนงานเก็บไว้ คุณได้รับข้อความแจ้งว่า ผู้ใช้ได้มากกว่าหนึ่งรายการ เข้าสู่ระบบและให้ผู้ดูแลระบบต้องเลือกหนึ่ง นี่คือสถานการณ์เดียวที่คุณต้องรันสองกระบวนงานที่เก็บsp_prefix_sysusersnameที่ให้ไว้ในบทความนี้ นอกจากนี้ สถานการณ์นี้จะอธิบายในรายละเอียดในแฟ้มอ่าน Readme.txt

แผนผังการล็อกอินแบบมาตรฐาน และแบบครบวงจร

หลังจากที่คุณย้ายฐานข้อมูลจากหนึ่งเซิร์ฟเวอร์ที่กำลังเรียกใช้เซิร์ฟเวอร์ SQL Server ไปยังเซิร์ฟเวอร์อื่นที่เรียกใช้ SQL Server เซิร์ฟเวอร์ ให้ทำตามขั้นตอนเหล่านี้สำหรับการขัดจังหวะโดยผู้ใช้เพียงเล็กน้อย:

SQL Server 7.0 และ SQL Server 2000

  1. ตรวจสอบให้แน่ใจว่า ไม่มีการล็อกอินในsysxloginsตารางในฐานข้อมูลหลักสำหรับแต่ละผู้ใช้ในตารางsysusersของฐานข้อมูล

    หมายเหตุ เมื่อต้องการเพิ่มการเข้าสู่ระบบ SQL Server มาตรฐาน ดูหัวข้อ "sp_addlogin" ใน SQL Server Books Online เมื่อต้องการเพิ่มการเข้าสู่ระบบ SQL Server รวม ดูหัวข้อ "sp_grantlogin" ใน SQL Server Books Online
  2. ดาวน์โหลดแฟ้ม MapSids.exe และ Sp_sidmap.sql และอ่าน Readme.txt แฟ้มที่แยกแล้ว
  3. เข้าสู่ระบบไปยังเซิร์ฟเวอร์ที่กำลังเรียกใช้ SQL Server เป็นผู้ดูแลระบบ และจากนั้น เรียกใช้แฟ้ม Sp_sidmap.sql ในฐานข้อมูลผู้ใช้ เรียกใช้แฟ้ม Sp_sidmap.sql สร้างกระบวนงานที่เก็บไว้สองsp_sidmapและsp_prefix_sysusersname
  4. ตรวจสอบให้แน่ใจว่า ฐานข้อมูลจะไม่สามารถเข้าถึงได้ โดยผู้ใช้อื่นมากกว่าที่จะเรียกใช้กระบวนงานเก็บไว้
  5. ตรวจสอบให้แน่ใจว่า ตัววิเคราะห์คำถามแสดงผลลัพธ์ ในรูปแบบข้อความ และไม่อยู่ ในรูปแบบของเส้นตาราง เมื่อต้องการทำเช่นนี้ อย่างใดอย่างหนึ่งกด
    CTRL ^ Tคีย์ หรือคลิกแบบสอบถามและจากนั้น คลิกผลลัพธ์ในข้อความ ซึ่งเป็นสิ่งสำคัญมากเพื่อให้คุณสามารถดูผลลัพธ์และข้อความให้ข้อมูลในหน้าต่างหนึ่ง และบันทึกผลลัพธ์ลงในแฟ้มข้อความ คุณอาจต้องการแฟ้มนี้ในภายหลังเมื่อต้องการแก้ไขบางอย่างของการแม็ป
  6. เนื่องจากคุณไม่สามารถตรวจสอบว่า มีส่งพารามิเตอร์ไม่ถูกต้อง ตรวจสอบให้แน่ใจเพื่อส่งต่อไปได้อย่างถูกต้องให้กับกระบวนงานที่เก็บไว้sp_sidmap :
    EXEC sp_SidMap @old_domain = old_domain_name,
    @new_domain = new_domain_name,
    @old_server = old_server_name,
    @new_server = new_server_name
    แทนค่าสำหรับชื่อเซิร์ฟเวอร์และชื่อโดเมนเก่า และใหม่อย่างเหมาะสม
  7. บันทึกผลลัพธ์ลงในแฟ้ม และทำตามคำแนะนำที่กำหนดไว้ในแฟ้มอ่าน Readme.txt

    หมายเหตุ เมื่อคุณเรียกใช้กระบวนงานที่เก็บเหล่านี้ ตารางsysusersมีตารางเท่านั้นที่เปลี่ยนแปลงในฐานข้อมูล เมื่อต้องการกลับไปยังสถานะที่คุณเริ่มต้นใช้งาน การคืนค่าฐานข้อมูลจากสำเนาสำรอง หรือจำ

SQL Server 2005

ถ้าคุณกำลังเรียกใช้ SQL Server 2005 ใช้อนุประโยคกับล็อกอินของผู้ใช้ที่มีการเปลี่ยนแปลงงบเพื่อแมปผู้ใช้ล็อกอินใหม่ สำหรับข้อมูลเพิ่มเติม โปรดเยี่ยมชมเว็บไซต์ Microsoft Developer Network (MSDN) ต่อไปนี้:หมายเหตุ การใช้อนุประโยคกับล็อกอินของผู้ใช้ที่มีการเปลี่ยนแปลงงบ คุณต้องใช้ SQL Server 2005 Service Pack 2

ข้อมูลอ้างอิง


สำหรับข้อมูลเพิ่มเติม คลิกหมายเลขบทความต่อไปนี้เพื่อดูบทความในฐานความรู้ของ Microsoft:

274188 "ผู้ใช้ที่ถูกละเลยการแก้ไขปัญหา" หัวข้อ Books Online ไม่สมบูรณ์

246133วิธีการถ่ายโอนล็อกอินและรหัสผ่านระหว่างอินสแตนซ์ของ SQL Server

168001ผู้ใช้เข้าสู่ระบบและ/หรือสิทธิ์ข้อผิดพลาดหลังจากการคืนค่าการถ่ายโอนข้อมูล

ตัวอย่าง298897 : Mapsids.exe ช่วยแมป SIDs ระหว่างผู้ใช้และฐานข้อมูลหลักเมื่อฐานข้อมูลถูกย้าย