Windows kullanıcı tablo oluşturduğunda SQL 2008 R2 kullanıcı / şema oluşturur


9

Aşağıdaki komut dosyasını kullanarak bir Windows Grubunu SQL 2008 R2 örneğiyle eşleyen bir sunucu oturum açma adı ve veritabanı kullanıcısı ekledik ve anonimlik için adları değiştirdik:

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 hesabı uygulamada oturum açtığında, User1, DOMAIN \ AppUsers üyesi olduğu için dbo şemasındaki User1 tablolarını iyi sorgular, ancak bu uygulama kullanıcının tablolar oluşturmasına da izin verir. Şema belirtmeden bu tabloları oluştururken SQL Server aşağıdakileri yapar:

  1. AppDb'de, örnek için SSMS \ Security \ Logins'de listelenmeyen bir 'DOMAIN \ User1' girişi kullanan bir 'DOMAIN \ User1' kullanıcısı oluşturur.
  2. AppDb'de 'DOMAIN \ User1' şeması oluşturur.
  3. Bu tabloları yeni 'DOMAIN \ User1' şemasında kullanarak oluşturur.

Bu sonuçlardan tamamen şaşırdım. Sorularım:

  1. Tablo oluşturma ek nesneleri oluşturmak yerine başarısız olmasını beklenir. Birisi beni Books Online'ın bunu açıklayan kısmına yönlendirebilir mi?
  2. Sunucu neden 'DOMAIN \ AppUsers' şeması oluşturmuyor ve şema ekleyecekse yeni tabloları bu şemaya eklemiyor?
  3. Ayrıca, veritabanı SSMS \ Security \ Logins'de gösterilmeyen bir girişi nasıl kullanır?
  4. SSMS \ Veritabanları \ AppDb \ Security \ Users'daki 'DOMAIN \ User1' kullanıcısına bakıldığında, kullanıcı simgesinin üzerinde küçük bir kırmızı ok bulunur. Bu ne anlama geliyor?

Basitlik için SQL Kimlik Doğrulamasını tercih eden bir kuruluşta Windows Kimlik Doğrulaması'nı kullanmaya başlıyoruz, bu yüzden sorumun farkları bilmemesinden kaynaklandığına eminim. Bu kod, Windows Kimlik Doğrulaması kullanmayı düşündüğümüzden çok önce yazılmıştı, bu yüzden veritabanı sahibi dışında herhangi biri olarak Windows Kimlik Doğrulaması'nı kullanarak oturum açtığınızda yeni şemalar oluşturma anlayışımızı geliştirmemiz gerektiğinden eminim.

Söyleyemiyorsanız, SQL Kimlik Doğrulaması üzerinden Windows Kimlik Doğrulaması kullanımı için iten tek kişiyim. Bunu sağlam bir şekilde anlayamazsak, SQL Kimlik Doğrulaması'na geri döneceğiz.


Etki alanı kullanıcıları için varsayılan Şema {dbo, örneğin tanımlayabilirsiniz, ancak etki alanı grupları için tanımlayamazsınız.

Yanıtlar:


9

Bu her zaman geri SQL Server 2000'e, oldu
nasıl SQL Server koymak istiyorum biliyor, şema olmadan dboşema?

Varsayılan bir şema belirtmenin tek yolu:

  • SQL girişlerini kullan (Windows değil)
  • "sysadmin" olarak çalıştır

Bunların hiçbiri kabul edilemez

En iyi uygulama, her zaman DDL ve DML için her nesne referansı için şemayı nitelendirmektir. Planın yeniden kullanımı nedeniyle belirgin performans avantajları vardır.

Ayrıca, kasıtlı şema kullanımı SQL Server 2005 için daha iyidir:

  • tablolar Data
  • Diğer tablolar Archive, Stagingvb
  • İstemci izinleri başına şemalarında kod: Desktop, WebGUIvb

Dbo şemasını kullanmak çok son binyıl :-) Bağlantılar:


Yani bundan uzaklaşmam şemaya yeni tablolar eklemek için kodu güncellememiz. Bu, yeni kullanıcının Güvenlik düğümünde görünmesinin yaygın bir olay olduğu anlamına mı geliyor?
flipdoubt

@flipdoubt: ikisine de evet. Bir kez girip şemaları ad alanı veya kapsayıcı olarak kullandığınızda, bu ikinci doğa olur
gbn

Son bir soru. Kullanıcıların otomatik olarak eklenmesi yaygın bir uygulamadır ve nesne oluşturma sırasında şemaları belirtmek için en iyi yöntemse, otomatik olarak oluşturulan kullanıcı yeni şemadaki bir nesneyi sorgulama hatası oluşturmadan önce yeni şemaya nasıl hak verebilirsiniz? 'DOMAIN \ User1' ile ilgili yayınladığım örneği kullanarak, 'DOMAIN \ AppUsers' hesabına erişim atayabilirim, ancak sorgular 'DOMAIN \ User1' veya 'DOMAIN \ AppUsers' erişim haklarını kullanacak mı? Nesne oluşturulur yaratılmaz sunucunun kullanıcıyı oluşturması çok sinsidir.
flipdoubt

İzinler, user1 olan şema sahibine varsayılan olarak uygulanır. Bu şema için DB_OWNER gibidir
gbn

2

Eh @gbn hızlı benden daha türlerini ...

Benim tek teklifim ... Kullanıcı app oturum açma referans ve kullanıcının tablolar ve benzeri oluşturmak için izin verir. Uygulama buna izin veriyorsa ve kullanıcı bunu SQL Server'ın kendisi üzerinden yapmıyorsa (SSMS kullanarak doğrudan veritabanına giriş yapıyorsa), o uygulamanın satıcısına danışmanız gerekir.


Uygulamayı yazdık.
flipdoubt

2

Soru çok eski olmasına ve zaten kabul edilmiş bir cevaba sahip olmasına rağmen, sorularınızı daha genel olarak cevaplamaya çalışacağım (genel tavsiye vermek yerine).

  1. Davranış https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql , "Örtülü Şema ve Kullanıcı Oluşturma" bölümünde belgelenmiştir.

  2. Nesnelerin belirli bir şemada oluşturulmasını istiyorsanız (şema deyimde açıkça belirtilmediğinde), kullanıcı için DEFAULT_SCHEMA belirtmeniz gerekir. SQL Server 2008 R2'de (ve önceki sürümlerde), bir kullanıcıya Windows grubunu temel alan bir DEFAULT_SCHEMA atamaya çalışırsanız hata alırsınız, ancak SQL Server 2012'de (ve sonraki sürümlerde) bu artık mümkündür.

  3. Bu kullanıcı için giriş olmadığı için gösterilmiyor. Https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql adresinde belirtildiği gibi , farklı bir grup kullanarak oturum açmış olan veya olmayan bir kullanıcı için bir kullanıcı oluşturulabilir herhangi bir giriş.

  4. Küçük kırmızı ok (veya SSMS'nin daha yeni sürümlerindeki küçük kırmızı x) veritabanında CONNECT izni olmayan bir kullanıcıyı temsil eder (ancak bu izin başka bir gruptan alınabilir).


0

Bu eski bir soru olsa da (SQL Server 2014'te) bu davranışı gözlemledim ve aşağıdakileri buldum:

Senaryo verildi

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
)

Bu komut dosyası Test adında iki tablo oluşturur.

Birincisi CREATE TABLEadlı bir tablo [MyDomain\MyAdGroupUser].[Test]oluşturur ve MyDomain\MyAdGroupUserşemayı da ( MyDomain\MyAdGroupUserdevre dışı bırakılmış bir veritabanı kullanıcısı) oluşturur.

ikincisi CREATE TABLEadlı bir tablo oluşturur[dbo].[Test]

Bunun nedeni, CREATE TABLEkomutların şemayı açıklamaması nedeniyle varsayılan şemayı kullanmalarıdır.

Kullanıcıları oluştururken varsayılan şemayı belirtmediğimiz için, SQL Server Windows kullanıcısının varsayılan şemasını dbo olarak ayarlar, ancak Windows Grubu kullanıcısı için HERHANGİ BİR varsayılan şemayı DEĞİLDİR ve bu nedenle şema / kullanıcı oluşturulmasına neden olur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.