เพื่อนร่วมงานของฉันได้รับสคีมาของตัวเองได้อย่างไร


14

ฉันมีขั้นตอนการจัดเก็บที่:

  • ตรวจสอบว่ามีตารางอยู่หรือไม่และหากเป็นเช่นนั้นให้ลดลง
  • สร้างตารางนั้นอีกครั้ง
  • จากนั้นเติมตารางนั้นด้วยข้อความค้นหาประมาณ 30 รายการ

เมื่อฉัน (เจ้าของฐานข้อมูล) เรียกใช้ proc นี้ทุกอย่างทำงานตามที่ตั้งใจไว้ เมื่อเพื่อนร่วมงานของฉันทำเช่นนั้นใครมีสิทธิ์ DROP / CREATE ในฐานข้อมูลนี้ผ่านบทบาทใน Active Directory หลายสิ่งผิดปกติ นี่คือสิ่งที่รบกวนจิตใจของฉัน:

การสร้างตารางไม่ได้ระบุdboสคีมาไว้อย่างชัดเจนก่อนชื่อ สิ่งนี้ส่งผลให้ตารางที่เรียกว่าdomain\cowork_id.table_name_heretable ถูกสร้างขึ้น นอกเหนือจากตารางที่ถูกสร้างในสคีมาส่วนตัวตอนนี้เขายังมีสคีมานั้นในฐานข้อมูล (มันไม่ได้มีอยู่ก่อนการรัน proc)

เกิดอะไรขึ้น? เหตุใด SQL Server จึงสร้างตารางในสคีมาของผู้ใช้แทนที่จะเป็นdboเมื่อไม่ได้ระบุไว้


คำตอบ:


26

ตามกฎแล้วคุณควรระบุสคีมาอย่างชัดเจนdboหากคุณต้องการสร้างวัตถุในสคีมานี้

เช่นเดียวกับคุณdb_ownerสกีมาเริ่มต้นของคุณคือdboดังนั้นจึงไม่มีปัญหาเมื่อคุณไม่ได้ระบุสคีมา dbo ในขณะที่สร้างวัตถุ แต่สำหรับผู้ใช้อื่น ๆ (Windows) มันไม่เหมือนกัน

ผู้ใช้ของคุณเป็นสมาชิกของWindows groupที่ไม่มีสคีมาเริ่มต้น ในกรณีนี้ผู้ใช้และสคีมาที่เกี่ยวข้องจะถูกสร้างขึ้นเมื่อผู้ใช้สร้างวัตถุใด ๆ มีการบันทึกไว้ที่นี่: CREATE SCHEMA (Transact-SQL)

สคีมาโดยนัยและการสร้างผู้ใช้

ในบางกรณีผู้ใช้สามารถใช้ฐานข้อมูลโดยไม่ต้องมีบัญชีผู้ใช้ฐานข้อมูล (ฐานข้อมูลหลักในฐานข้อมูล) สิ่งนี้สามารถเกิดขึ้นได้ในสถานการณ์ต่อไปนี้:

การเข้าสู่ระบบมีสิทธิ์ควบคุมเซิร์ฟเวอร์

ผู้ใช้ Windows ไม่มีบัญชีผู้ใช้ฐานข้อมูลแต่ละบัญชี (ฐานข้อมูลหลักในฐานข้อมูล) แต่เข้าถึงฐานข้อมูลในฐานะสมาชิกของกลุ่ม Windows ที่มีบัญชีผู้ใช้ฐานข้อมูล (ฐานข้อมูลหลักสำหรับกลุ่ม Windows)

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

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

เพื่อแก้ไขปัญหาเพียงแค่กำหนดdboสคีมาเป็นdefault schemaกลุ่มผู้ใช้ Windows ทุกกลุ่มหรือเขียนสคีมาอย่างชัดเจนเมื่อสร้างวัตถุ เสมอ.

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