เนื่องจากอาจมีความกลัวที่ไม่มีมูลความจริงมากเท่าที่มีความเสี่ยงที่ไม่รู้จักฉันจะคิดว่าเป็นการยากที่จะพูดว่าทำไมนโยบายถึงเกิดขึ้นโดยไม่ถามใครก็ตามที่สร้างนโยบายขึ้นมาว่าทำไมพวกเขาถึงกังวล
อย่างไรก็ตามฉันเดาว่ามันอาจจะเกี่ยวข้องกับสิ่งที่BULK INSERT
/ SqlBulkCopy
/ BCP / OPENROWSET(BULK ...)
อนุญาตให้คนทำคือ:
- ปิดการใช้งาน จำกัด (
CHECK
, DEFAULT
และFOREIGN KEY
ผมเชื่อว่า)
- ปิดการใช้งานทริกเกอร์ (หากมีทริกเกอร์การตรวจสอบในสถานที่โดยผ่านพวกเขาอาจจะถือว่าไม่พึงประสงค์สำหรับคำอธิบายเพิ่มเติมเกี่ยวกับปัญหานี้โดยเฉพาะโปรดดู@DVKs ตอบ )
ตัวเลือกต่าง ๆ อธิบายไว้ในเอกสารประกอบต่อไปนี้:
ผมไม่ได้พูดถึงปัญหาตารางล็อคที่ระบุไว้โดย @RDFozz เนื่องจากว่าเป็นไปไม่ได้เฉพาะเจาะจงBULK INSERT
: ตารางสามารถทุกคน TABLOCK / XLOCK หรือตั้งเพื่อTRANSACTION ISOLATION LEVEL
SERIALIZABLE
UPDATE
ฉันเจอข้อมูลเพิ่มเติมอีกสองชิ้นที่อาจช่วย จำกัด เรื่องนี้:
ปัญหาของความสามารถในการทริกเกอร์ปิดการใช้งานปิดการใช้งานข้อ จำกัด และชุดIDENTITY_INSERT ON
อาจจะไม่ได้เป็นเหตุผลที่ครอบงำเพื่อดูADMINISTER BULK OPERATIONS
, ADMINISTER DATABASE BULK OPERATIONS
(เริ่มต้นด้วย SQL Server 2017) หรือbulkadmin
บทบาทเซิร์ฟเวอร์เป็นภัยคุกคาม เหตุผลก็คือเพื่อที่จะทำสิ่งใด ๆ ในสามสิ่งที่กล่าวถึงนี้ผู้ใช้จำเป็นต้องได้ALTER TABLE
รับอนุญาตในตารางนั้นหรือบน Schema ที่มีอยู่ในตารางการผูกมัดการเป็นเจ้าของไม่ครอบคลุมการแก้ไข DDL ดังนั้นหากผู้ใช้ไม่มีALTER TABLE
ความสามารถในการทำสามสิ่งเหล่านี้จึงไม่ใช่ปัญหา
สิ่งที่ยังไม่ได้รับการกล่าวถึงเพื่อให้ห่างไกลและสิ่งที่ท้ายที่สุดอาจจะปัญหาด้านความปลอดภัยคือทั้งสองและการเข้าถึงทรัพยากรภายนอกนอกของ SQL Server เมื่อเข้าถึง SQL Server ผ่านทางเข้าสู่ระบบ Windows บัญชี Windows นั้นจะถูกเลียนแบบ (แม้ว่าคุณจะเปลี่ยนบริบทการรักษาความปลอดภัยโดยใช้) สำหรับการเข้าถึงระบบไฟล์ ซึ่งหมายความว่าคุณสามารถอ่านไฟล์ที่ได้รับอนุญาตให้อ่านเท่านั้น ไม่มีอะไรผิดปกติกับที่BULK INSERT
OPENROWSET(BULK...
EXECUTE AS LOGIN='...'
แต่เมื่อเข้าถึง SQL Server ผ่านการเข้าสู่ระบบของเซิร์ฟเวอร์ SQL การเข้าถึงภายนอกจะกระทำในบริบทของบัญชีบริการ SQL Server ซึ่งหมายความว่าคนที่มีสิทธิ์นี้สามารถอ่านไฟล์ที่พวกเขาไม่สามารถอ่านได้และในโฟลเดอร์ที่ไม่สามารถเข้าถึงได้
อย่างน้อยที่สุดถ้า SQL Server ถูกตั้งค่าให้ทำงานเป็นบัญชีที่สร้างขึ้นสำหรับ SQL Server (วิธีที่ต้องการ) เท่านั้นผู้ใช้ดังกล่าวสามารถอ่านไฟล์เหล่านั้นที่บัญชี "SQL Server" สามารถเข้าถึงได้ แม้ว่านี่จะเป็นปัญหาที่ จำกัด แต่ก็ยังช่วยให้สามารถอ่านไฟล์เช่นล็อกไฟล์ SQL Server (และฉันทดสอบตัวอย่างต่อไปนี้และมันใช้งานได้):
SELECT tmp.[Col1]
FROM OPENROWSET(BULK
N'C:\Program Files\Microsoft SQL Server\MSSQLxx.InstanceName\MSSQL\Log\ERRORLOG.1',
SINGLE_NCLOB) tmp([Col1]);
คนส่วนใหญ่จะไม่สามารถเข้าถึงโฟลเดอร์MSSQL \ Logดังนั้นนี่จะเป็นวิธีหลีกเลี่ยงข้อ จำกัด ด้านความปลอดภัยที่มีอยู่
และถ้า SQL Server ทำงานเป็นLocal System
บัญชีฉันสงสัยว่าขอบเขตของปัญหาจะเพิ่มขึ้นเท่านั้นและผู้ใช้ที่มีสิทธิ์นี้จะสามารถอ่านไฟล์ที่เกี่ยวข้องกับระบบได้หลากหลาย
และนี่อาจเป็นสาเหตุที่วิธีการอื่นในการทำการนำเข้าจำนวนมาก - BCPและSqlBulkCopy
- ไม่ต้องการbulkadmin
สิทธิ์ / บทบาท: พวกเขาเริ่มต้นนอก SQL Server และจะจัดการการอนุญาตระบบไฟล์ด้วยตนเอง ในกรณีดังกล่าว SQL Server จะไม่อ่านไฟล์ (หรือไปถึงนอก SQL Server) เพียงแค่รับข้อมูลที่จะนำเข้าจากไฟล์ที่กำลังอ่านโดยกระบวนการภายนอก
ความหมายที่เป็นไปได้กันก็ถูกกล่าวในคำถาม
เพื่อประโยชน์ของแอปพลิเคชัน BULK INSERT นั้นมีประสิทธิภาพมากกว่ารวดเร็วกว่า ..
ตกลงไป ...
และบรรเทาความต้องการโปรแกรมเมอร์ในการแยกไฟล์นอก SQL
Whoa Nelly หยุดตรงนี้กัน T-SQL ไม่ใช่ทางเลือกภาษาที่ดีที่สุดสำหรับการวิเคราะห์คำ มันเป็นการดีที่สุดที่จะทำการแยกวิเคราะห์ก่อนที่จะแทรกสิ่งต่างๆลงในฐานข้อมูล วิธีหนึ่งในการทำเช่นนี้คือการใช้พารามิเตอร์ที่มีมูลค่าแบบตาราง (TVPs) โปรดดูคำตอบของฉันคำถามอื่น (ที่นี่ใน DBA.StackExchange) ที่เกี่ยวข้องกับหัวข้อของก่อนการแยกและการตรวจสอบพร้อมกับกลุ่มที่มีประสิทธิภาพในการนำเข้าของข้อมูลกล่าวว่า:
T-SQL: CSV-> ไพพ์ไลน์ของตารางที่มีข้อมูลตัวเลขแบบแยกวิเคราะห์ที่กำหนดเองค่าการค้นหา