SQL 2008 R2 membuat pengguna / skema ketika pengguna Windows membuat tabel

9

Kami menambahkan login server dan pengguna database yang memetakan Windows Group ke contoh SQL 2008 R2 menggunakan skrip berikut, dengan nama yang diubah untuk anonimitas:

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

Ketika akun DOMAIN \ User1 masuk ke aplikasi, User1 menanyakan tabel dalam skema dbo karena User1 adalah anggota dari DOMAIN \ AppUsers, tetapi aplikasi ini memungkinkan pengguna untuk membuat tabel juga. Saat membuat tabel ini tanpa menentukan skema , SQL Server melakukan hal berikut:

  1. Membuat pengguna 'DOMAIN \ User1' di AppDb yang menggunakan info masuk 'DOMAIN \ User1' yang tidak tercantum dalam SSMS \ Security \ Login sebagai contoh.
  2. Membuat skema 'DOMAIN \ User1' di AppDb.
  3. Membuat tabel tersebut menggunakan skema 'DOMAIN \ User1' yang baru.

Saya benar-benar bingung dengan hasil ini. Ini pertanyaan saya:

  1. Saya berharap pembuatan tabel gagal daripada membuat objek tambahan. Dapatkah seseorang mengarahkan saya ke bagian Buku Online yang menjelaskan hal ini?
  2. Mengapa server tidak membuat skema 'DOMAIN \ AppUsers' dan menambahkan tabel baru ke skema itu jika ingin menambah skema?
  3. Juga, bagaimana database menggunakan login yang tidak ditampilkan di SSMS \ Security \ Login?
  4. Melihat pengguna 'DOMAIN \ User1' di SSMS \ Databases \ AppDb \ Security \ Users, ikon pengguna memiliki panah merah kecil yang mengarah ke bawah. Apa artinya?

Kami baru mulai menggunakan Otentikasi Windows di dalam organisasi yang lebih memilih Otentikasi SQL untuk kesederhanaan, jadi saya yakin pertanyaan saya berasal dari tidak mengetahui perbedaan. Kode ini ditulis jauh sebelum kami mempertimbangkan untuk menggunakan Otentikasi Windows, jadi saya yakin kami perlu meningkatkan pemahaman kami tentang membuat skema baru ketika masuk menggunakan Otentikasi Windows sebagai orang lain selain pemilik basis data.

Jika Anda tidak tahu, saya yang mendorong untuk menggunakan Windows Authentication melalui SQL Authentication. Jika kami tidak memahami ini dengan benar, kami akan kembali ke SQL Authentication.

flipdoubt
sumber
Anda dapat menetapkan Skema default {dbo, misalnya} untuk pengguna domain, tetapi tidak untuk grup domain.

Jawaban:

9

Ini selalu terjadi, kembali ke SQL Server 2000.
Tanpa skema, bagaimana SQL Server tahu Anda ingin memasukkannya ke dalam dboskema?

Satu-satunya cara untuk menentukan skema default adalah dengan:

  • gunakan SQL login (bukan Windows)
  • jalankan sebagai "sysadmin"

Tak satu pun dari ini dapat diterima

Praktik terbaik adalah untuk selalu memenuhi syarat skema untuk setiap referensi objek untuk DDL dan DML. Ada manfaat kinerja yang jelas karena rencana digunakan kembali.

Juga, penggunaan skema yang disengaja lebih baik untuk SQL Server 2005:

  • tabel di Data
  • tabel lain Archive, Stagingdll
  • Kode di skema per izin klien: Desktop, WebGUIdll

Menggunakan skema dbo adalah begitu milenium terakhir :-) Links:

gbn
sumber
Jadi saya mengambil dari ini adalah bahwa kita harus memperbarui kode untuk mengawali tabel baru dengan skema, kan? Apakah ini berarti itu adalah kejadian umum untuk memiliki pengguna baru muncul di bawah simpul Keamanan?
flipdoubt
@ flipdoubt: ya untuk keduanya. Setelah Anda masuk ke dalamnya, dan menggunakan skema sebagai ruang nama atau wadah, itu menjadi sifat kedua
gbn
Satu pertanyaan terakhir. Jika itu adalah praktik umum untuk memiliki pengguna secara otomatis ditambahkan dan praktik terbaik untuk menentukan skema selama pembuatan objek, bagaimana Anda bisa memberikan hak kepada skema baru sebelum pengguna yang dibuat secara otomatis membuat kesalahan dengan menanyakan objek dalam skema baru? Dengan menggunakan contoh yang saya posting mengenai 'DOMAIN \ User1', saya dapat menetapkan akses ke akun 'DOMAIN \ AppUsers', tetapi akankah pertanyaan menggunakan hak akses untuk 'DOMAIN \ User1' atau 'DOMAIN \ AppUsers'? Itu sangat licik bahwa server menciptakan pengguna segera setelah objek dibuat.
flipdoubt
Izin akan default ke pemilik skema, yaitu user1. Ini seperti DB_OWNER untuk skema
gbn
2

Yah @gbn mengetik lebih cepat dari yang saya lakukan ...

Saya hanya menawarkan adalah ... Anda referensi pengguna login ke app dan itu memungkinkan pengguna untuk membuat tabel dan semacamnya. Jika aplikasi mengizinkan ini dan pengguna tidak melakukan ini melalui SQL Server itu sendiri (masuk langsung ke database menggunakan SSMS) maka Anda perlu memeriksa dengan vendor aplikasi itu.

Komunitas
sumber
Kami menulis aplikasinya.
flipdoubt
2

Meskipun pertanyaannya sudah sangat lama dan sudah memiliki jawaban yang dapat diterima, saya akan mencoba menjawab pertanyaan Anda secara lebih spesifik (daripada memberikan saran umum).

  1. Perilaku ini didokumentasikan dalam https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql , di bagian "Skema Tersirat dan Penciptaan Pengguna"

  2. Jika Anda ingin objek dibuat dalam skema tertentu (ketika skema tidak ditentukan secara eksplisit dalam pernyataan), Anda harus menentukan DEFAULT_SCHEMA untuk pengguna. Dalam SQL Server 2008 R2 (dan versi sebelumnya), Anda akan mendapatkan kesalahan jika Anda mencoba untuk menetapkan DEFAULT_SCHEMA ke pengguna yang didasarkan pada grup Windows, tetapi dalam SQL Server 2012 (dan versi yang lebih baru) ini sekarang mungkin.

  3. Itu tidak ditampilkan hanya karena tidak ada login untuk pengguna itu. Sebagaimana ditentukan dalam https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql , pengguna dapat dibuat untuk seseorang yang log in menggunakan grup yang berbeda atau bahkan tanpa login apa pun.

  4. Panah merah kecil (atau merah kecil x dalam versi SSMS yang lebih baru) mewakili pengguna yang tidak memiliki izin CONNECT dalam database (namun, izin ini dapat diperoleh melalui grup lain).

Razvan Socol
sumber
0

Sementara ini adalah pertanyaan lama saya telah mengamati perilaku ini (Dalam SQL Server 2014) dan menemukan yang berikut ini:

Diberikan skrip

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
)

Script ini akan membuat dua tabel yang disebut Test.

Yang pertama CREATE TABLEmembuat tabel yang disebut [MyDomain\MyAdGroupUser].[Test]dan juga menciptakan MyDomain\MyAdGroupUserskema (serta MyDomain\MyAdGroupUserpengguna basis data yang dinonaktifkan)

yang kedua CREATE TABLEmembuat tabel bernama[dbo].[Test]

Alasan untuk ini adalah karena CREATE TABLEperintah tidak menjelaskan keadaan skema, mereka akan menggunakan skema default.

Karena kami tidak menentukan skema default saat membuat pengguna, SQL Server menetapkan skema default pengguna Windows sebagai dbo tetapi TIDAK mengatur skema default APA PUN untuk pengguna Windows Group dan karenanya hal ini menyebabkan skema / pembuatan pengguna

SEarle1986
sumber