กำหนดค่าการมอบหมายที่ไม่ จำกัด สำหรับ BULK INSERT


12

ฉันมีโหนด Microsoft SQL Server 2016 คู่หนึ่งในกลุ่ม Always On Availability ฉันกำลังพยายามดำเนินการBULK INSERT(โดยใช้แบบสอบถาม SQL Server 2016 Management Studio) ในไฟล์ที่อยู่ในคลัสเตอร์เซิร์ฟเวอร์ล้มเหลวของ Windows Server 2016 แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

เกี่ยวกับข่าวสาร 4861 ระดับ 16 สถานะ 1
ไม่สามารถโหลดจำนวนมากได้เนื่องจากไม่สามารถเปิดไฟล์ "\ nas2.my.domain \ Microsoft SQL Server 2016 Enterprise \ test.txt" รหัสข้อผิดพลาดของระบบปฏิบัติการ 5 (ปฏิเสธการเข้าถึง)

สิ่งนี้จะเกิดขึ้นโดยไม่คำนึงว่าฉันใช้ชื่อโหนดที่ใช้งาน ( nas2.my.domain) หรือฟังคลัสเตอร์ล้มเหลว ( nas.my.domain) หรือไม่

หลังจากมองไปรอบ ๆ ผมพบว่านี่เป็นเพราะของ SQL Server BULK INSERTไม่สามารถที่จะปลอมตัวเป็นบัญชีผู้ใช้ฉันเชื่อมต่อกับเนื่องจากความแตกต่างกับ

หากคุณเชื่อมต่อกับ SQL Server โดยใช้ Windows Authentication บัญชีบริการ SQL Server จะพยายามเลียนแบบบัญชีผู้ใช้ของคุณเมื่อเชื่อมต่อกับเซิร์ฟเวอร์ไฟล์ หากคุณเชื่อมต่อโดยใช้การตรวจสอบความถูกต้องของ SQL Server จะเชื่อมต่อกับไฟล์เซิร์ฟเวอร์เช่นบัญชีบริการ SQL Server

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

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

ฉันได้ลองทำตามคำแนะนำในคู่มือของthesqldude แล้วแต่มันยังไม่ทำงาน

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

ไม่มีใครรู้ว่าเกิดอะไรขึ้น? หรือถ้ามีอะไรเปลี่ยนแปลงใน SQL Server 2016 เพื่อให้คำแนะนำเหล่านี้ล้าสมัย?

ฉันสามารถยืนยันได้ว่าวัตถุนโยบายกลุ่มนี้ได้ถูกนำไปใช้กับ MSSQL1 ผ่านgpresult.exe /Rและทั้งโหนด SQL และ File Server ถูกรีบูตหลังจากนั้นเพื่อให้แน่ใจว่าแคชใด ๆ ได้รับการล้าง


1
คำถามสองข้อ: 1)คุณลองเปิดใช้งานบัญชี Windows Domain ส่วนตัวของคุณสำหรับการมอบหมายงานหรือไม่, 2)เมื่อคุณเชื่อมต่อกับ SQL Server ผ่าน SSMS คุณได้เข้าสู่เซิร์ฟเวอร์ (เช่น Remote Desktop) ที่ SQL Server กำลังทำงานอยู่ หรือล็อกอินเข้าสู่เวิร์กสเตชันของคุณและเชื่อมต่อกับ SQL Server จากระยะไกล หากคุณยังไม่ได้ลองเข้าสู่เซิร์ฟเวอร์โดยตรงและเชื่อมต่อภายในผ่าน SSMS ให้ลองทำเช่นนั้น หากคุณยังไม่ได้ลองเปิดใช้งานบัญชีโดเมนของคุณเพื่อการมอบหมายให้ลองทำดู
โซโลมอน Rutzky

คำตอบ:


1

การกำหนดค่าของคุณดูแข็งแกร่ง SPN และการมอบหมายมีการกำหนดค่าตามที่ฉันจะทำเอง

สิ่งเดียวที่คุณยังไม่ได้อธิบายคือสิทธิ์ของไฟล์ / การแชร์ นี่คือที่โซลูชันของฉันเข้ามา

โซลูชันที่ 1 (บัญชีส่วนตัว)

  1. ตรวจสอบว่าบัญชีส่วนบุคคลของคุณได้รับอนุญาตให้เข้าถึงไฟล์ในส่วนแบ่งของเซิร์ฟเวอร์ไฟล์
    • บัญชีส่วนบุคคลของคุณต้องการสิทธิ์ในการอ่านอย่างน้อยในระดับสิทธิ์การแชร์หรือในกรณีส่วนใหญ่คุณอาจเห็นว่าทุกคนมีสิทธิ์อ่าน
    • บัญชีส่วนบุคคลของคุณต้องได้รับการอนุญาตอย่างน้อยอ่านในระดับสิทธิ์ของไฟล์
    • ตรวจสอบการสืบทอดสิทธิ์ที่ระดับไฟล์สำหรับหนึ่งไฟล์
      • รีบูตเซิร์ฟเวอร์ SQL หลังจากเปลี่ยนการอนุญาตไฟล์หรือวนรอบบริการ SQL Server
    • อีกทางหนึ่ง: เข้าสู่ระบบ SQL Server ด้วยบัญชีส่วนตัวของคุณและเชื่อมต่อกับการแชร์และเปิดไฟล์
  2. เปิด SSMS ด้วยบัญชีส่วนตัวของคุณ
  3. เปิดการเชื่อมต่อกับอินสแตนซ์ SQL Server ของคุณด้วย Windows Authentication
    • ตรวจสอบว่าคุณเชื่อมต่อกับอินสแตนซ์ของคุณด้วยบัญชีบริการ SQL Server ที่มีสคริปต์ที่คุณใช้ก่อนหน้านี้
  4. ดำเนินการนำเข้าด้วย BULK INSERT

โซลูชันที่ 2 (บัญชีบริการ SQL Server)

  1. ตรวจสอบว่าบัญชีบริการ SQL Serverได้รับอนุญาตให้เข้าถึงไฟล์ที่แชร์ไฟล์เซิร์ฟเวอร์
    • บริการ SQL Serverความต้องการของบัญชีที่สิทธิ์ในการอ่านอย่างน้อยในระดับสิทธิ์หุ้นหรือในกรณีส่วนใหญ่คุณอาจจะเห็นทุกคนที่มีสิทธิ์ในการอ่าน
    • บริการ SQL Serverความต้องการของบัญชีที่สิทธิ์ในการอ่านอย่างน้อยในระดับที่ได้รับอนุญาตของแฟ้ม
    • ตรวจสอบการสืบทอดสิทธิ์ที่ระดับไฟล์สำหรับหนึ่งไฟล์
      • รีบูตเซิร์ฟเวอร์ SQL หลังจากเปลี่ยนการอนุญาตไฟล์หรือวนรอบบริการ SQL Server
    • อีกทางหนึ่ง: เข้าสู่ระบบ SQL Server ด้วยบัญชีบริการเซิร์ฟเวอร์ SQL และเชื่อมต่อกับการแชร์และเปิดไฟล์
  2. เปิด SSMS ด้วยบัญชี บริการ SQL Server
    • Runas: your_domain \ SQL_Server_service_account
    • ระบุรหัสผ่าน
  3. เปิดการเชื่อมต่อกับ SQL Server ของคุณด้วย Windows Authentication
    • ตรวจสอบว่าคุณเชื่อมต่อกับอินสแตนซ์ของคุณด้วยบัญชีบริการ SQL Server ที่มีสคริปต์ที่คุณใช้ก่อนหน้านี้
  4. ดำเนินการนำเข้าด้วย BULK INSERT

สิทธิ์ในการแทรกจำนวนมาก

การมอบหมายบัญชีความปลอดภัย (การแอบอ้างบุคคลอื่น)

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

การอ้างอิง: BULK INSERT (Transact-SQL)


0

จากประสบการณ์ของฉันกับการมอบหมายบัญชีบริการเซิร์ฟเวอร์ SQL ต้องการสิทธิ์ที่เหมาะสมในการแบ่งปันที่พยายามเข้าถึงในนามของคุณ คุณปรับการอนุญาตเหล่านั้นแล้วหรือยัง? ฉันคิดว่าการอ่านเพียงอย่างเดียวก็เพียงพอแล้ว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.