SQL 2008 R2 สร้างผู้ใช้ / สคีมาเมื่อผู้ใช้ Windows สร้างตาราง


9

เราเพิ่มการเข้าสู่ระบบเซิร์ฟเวอร์และผู้ใช้ฐานข้อมูลที่จับคู่ Windows Group กับอินสแตนซ์ SQL 2008 R2 โดยใช้สคริปต์ต่อไปนี้โดยเปลี่ยนชื่อเป็น anonymity:

USE master
go
CREATE LOGIN [DOMAIN\AppUsers] FROM WINDOWS
WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
go
USE AppDb
go
CREATE USER [DOMAIN\AppUsers] FOR LOGIN 
[DOMAIN\AppUsers]
go
EXEC sp_addrolemember N'db_owner', N'DOMAIN\AppUsers'
go

เมื่อบัญชี DOMAIN \ User1 เข้าสู่แอป User1 ทำการสืบค้นตารางใน dbo schema ได้ดีเนื่องจาก User1 เป็นสมาชิกของ DOMAIN \ AppUsers แต่แอปนี้อนุญาตให้ผู้ใช้สร้างตารางด้วย เมื่อสร้างตารางเหล่านี้โดยไม่ระบุสกีมา SQL Server จะทำสิ่งต่อไปนี้:

  1. สร้างผู้ใช้ 'DOMAIN \ User1' ใน AppDb ที่ใช้การเข้าสู่ระบบ 'DOMAIN \ User1' ที่ไม่อยู่ใน SSMS \ Security \ Logins สำหรับอินสแตนซ์
  2. สร้างสคีมา 'DOMAIN \ User1' ใน AppDb
  3. สร้างตารางเหล่านั้นโดยใช้ในสคีมา 'DOMAIN \ User1' ใหม่

ฉันรู้สึกงงงันกับผลลัพธ์เหล่านี้ นี่คือคำถามของฉัน:

  1. ฉันคาดว่าการสร้างตารางจะล้มเหลวแทนที่จะสร้างวัตถุเพิ่มเติม ใครสามารถชี้ให้ฉันเป็นส่วนหนึ่งของ Books Online ที่อธิบายสิ่งนี้
  2. ทำไมเซิร์ฟเวอร์ไม่สร้างสคีมา 'DOMAIN \ AppUsers' และเพิ่มตารางใหม่ในสคีมานั้นถ้ามันจะเพิ่มสคีมา
  3. นอกจากนี้ฐานข้อมูลใช้การเข้าสู่ระบบไม่แสดงใน SSMS \ Security \ Logins อย่างไร
  4. ดูที่ผู้ใช้ 'DOMAIN \ User1' ใน SSMS \ Databases \ AppDb \ Security \ Users ไอคอนผู้ใช้มีลูกศรสีแดงเล็ก ๆ ชี้ลง นั่นหมายความว่าอย่างไร?

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

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


คุณสามารถกำหนด Schema เริ่มต้น {dbo ตัวอย่างเช่น} สำหรับผู้ใช้โดเมน แต่ไม่ใช่สำหรับกลุ่มโดเมน

คำตอบ:


9

สิ่งนี้เกิดขึ้นเสมอกลับไปที่ SQL Server 2000
หากไม่มีสคีมา SQL Server จะรู้ได้อย่างไรว่าคุณต้องการวางไว้ในdboสคีมา

วิธีเดียวในการระบุสคีมาเริ่มต้นคือ:

  • ใช้การเข้าสู่ระบบ SQL (ไม่ใช่ Windows)
  • ทำงานเป็น "ดูแลระบบ"

ไม่ยอมรับสิ่งเหล่านี้

แนวปฏิบัติที่เหมาะสมที่สุดคือการมีคุณสมบัติสกีมาเสมอสำหรับทุกการอ้างอิงวัตถุสำหรับ DDL และ DML มีประโยชน์ด้านประสิทธิภาพที่ชัดเจนเนื่องจากมีการใช้งานซ้ำตามแผน

นอกจากนี้การใช้ schema โดยเจตนาจะดีกว่าสำหรับ SQL Server 2005:

  • ตารางใน Data
  • ตารางอื่น ๆ ในArchive, Stagingฯลฯ
  • รหัสในสกีมาต่อสิทธิ์ของลูกค้า: Desktop, WebGUIฯลฯ

การใช้สคี dbo คือเพื่อสหัสวรรษสุดท้าย :-) ลิงค์:


ดังนั้นสิ่งที่ฉันจะหลีกเลี่ยงจากสิ่งนี้คือเราควรอัปเดตโค้ดเพื่อนำหน้าตารางใหม่ด้วยสคีมาใช่ไหม นี่หมายความว่าเป็นเรื่องปกติที่มีผู้ใช้ใหม่ปรากฏขึ้นภายใต้โหนดความปลอดภัยหรือไม่
flipdoubt

@flipdoubt: ใช่ทั้งคู่ เมื่อคุณได้รับมันและใช้ schemas เป็น namespaces หรือภาชนะบรรจุมันจะกลายเป็นธรรมชาติที่สอง
gbn

หนึ่งคำถามสุดท้าย หากเป็นวิธีปฏิบัติทั่วไปที่มีผู้ใช้เพิ่มโดยอัตโนมัติและแนวปฏิบัติที่ดีที่สุดในการระบุสกีมาในระหว่างการสร้างวัตถุคุณจะให้สิทธิ์กับสคีมาใหม่ได้อย่างไรก่อนที่ผู้ใช้ที่สร้างขึ้นโดยอัตโนมัติจะสร้างข้อผิดพลาดในการค้นหาวัตถุในสคีมาใหม่ เมื่อใช้ตัวอย่างที่ฉันโพสต์เกี่ยวกับ 'DOMAIN \ User1' ฉันสามารถกำหนดสิทธิ์การเข้าถึงบัญชี 'DOMAIN \ AppUsers' แต่ข้อความค้นหาจะใช้สิทธิ์การเข้าถึงสำหรับ 'DOMAIN \ User1' หรือ 'DOMAIN \ AppUsers' หรือไม่ เป็นเรื่องส่อเสียดที่เซิร์ฟเวอร์สร้างผู้ใช้ทันทีที่วัตถุถูกสร้างขึ้น
flipdoubt

สิทธิ์จะเป็นค่าเริ่มต้นสำหรับเจ้าของสคีมาซึ่งคือ user1 นี่เป็นเหมือน DB_OWNER สำหรับ schema
gbn

2

ดี@gbnประเภทได้เร็วขึ้นกว่าที่ฉันทำ ...

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


เราเขียนแอป
flipdoubt

2

แม้ว่าคำถามจะเก่ามากและมีคำตอบที่ยอมรับแล้ว แต่ฉันจะพยายามตอบคำถามของคุณให้เจาะจงยิ่งขึ้น (แทนที่จะให้คำแนะนำทั่วไป)

  1. พฤติกรรมดังกล่าวได้รับการบันทึกไว้ในhttps://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sqlในส่วน "Schema โดยนัยและการสร้างผู้ใช้"

  2. หากคุณต้องการให้วัตถุถูกสร้างในสคีมาเฉพาะ (เมื่อไม่ได้ระบุสคีมาอย่างชัดเจนในคำสั่ง) คุณควรระบุ DEFAULT_SCHEMA สำหรับผู้ใช้ ใน SQL Server 2008 R2 (และรุ่นก่อนหน้า) คุณจะได้รับข้อผิดพลาดหากคุณพยายามกำหนด DEFAULT_SCHEMA ให้กับผู้ใช้ที่ใช้กลุ่ม Windows แต่ใน SQL Server 2012 (และรุ่นที่ใหม่กว่า) ตอนนี้เป็นไปได้

  3. มันไม่ได้แสดงเพียงเพราะไม่มีการเข้าสู่ระบบสำหรับผู้ใช้นั้น ตามที่ระบุไว้ในhttps://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sqlผู้ใช้อาจถูกสร้างขึ้นสำหรับคนที่เข้าสู่ระบบโดยใช้กลุ่มที่แตกต่างกันหรือแม้กระทั่งโดยไม่ต้อง เข้าสู่ระบบใด ๆ

  4. ลูกศรสีแดงขนาดเล็ก (หรือ red x ขนาดเล็กใน SSMS รุ่นใหม่กว่า) หมายถึงผู้ใช้ที่ไม่มีสิทธิ์ CONNECT ในฐานข้อมูล (อย่างไรก็ตามสิทธิ์นี้อาจได้รับจากกลุ่มอื่น)


0

ในขณะที่นี่เป็นคำถามเก่าฉันได้สังเกตพฤติกรรมนี้ (ใน SQL Server 2014) และพบต่อไปนี้:

รับบท

USE [master]
CREATE DATABASE [Test]

USE [Test]

-- Note that we create the users without specifying the default schema
CREATE USER [MyDomain\MyADGroup] FOR LOGIN [MyDomain\MyADGroup] -- ad group
CREATE USER [MyDomain\MyDomainUser] FOR LOGIN [MyDomain\MyDomainUser] -- ad user (not in said AD group)

ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyADGroup]
ALTER ROLE db_ddladmin ADD MEMBER [MyDomain\MyDomainUser]

EXECUTE AS LOGIN = 'MyDomain\MyAdGroupUser' -- a windows account which is a member of [MyDomain\MyADGroup]

CREATE TABLE Test
(
    a INT
)

REVERT 

EXECUTE AS USER = 'MyDomain\MyDomainUser'

CREATE TABLE Test
(
    a INT
)

สคริปต์นี้จะสร้างสองตารางที่เรียกว่าการทดสอบ

ครั้งแรกที่CREATE TABLEสร้างตารางที่เรียกว่า[MyDomain\MyAdGroupUser].[Test]และยังสร้างMyDomain\MyAdGroupUserคีมา (เช่นเดียวกับMyDomain\MyAdGroupUserผู้ใช้ฐานข้อมูลที่ถูกปิดใช้งาน)

ที่สองCREATE TABLEสร้างตารางที่เรียกว่า[dbo].[Test]

เหตุผลสำหรับสิ่งนี้คือเนื่องจากCREATE TABLEคำสั่งไม่ได้อธิบายสถานะของ schema อย่างชัดเจนพวกเขาจะใช้สคีมาเริ่มต้น

เนื่องจากเราไม่ได้ระบุสคีมาเริ่มต้นเมื่อสร้างผู้ใช้ SQL Server จะตั้งค่าสคีมาเริ่มต้นของผู้ใช้ Windows เป็น dbo แต่ไม่ได้ตั้งสคีมาเริ่มต้นใด ๆ สำหรับผู้ใช้ Windows Group และทำให้เกิดการสร้างสคีมา / ผู้ใช้

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