Wir haben einen Server-Anmelde- und Datenbankbenutzer hinzugefügt, der eine Windows-Gruppe mithilfe des folgenden Skripts einer SQL 2008 R2-Instanz zuordnet, wobei die Namen aus Gründen der Anonymität geändert wurden:
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
Wenn sich das Konto DOMAIN \ User1 bei der App anmeldet, fragt User1 Tabellen im dbo-Schema einwandfrei ab, da User1 Mitglied von DOMAIN \ AppUsers ist. Mit dieser App kann der Benutzer jedoch auch Tabellen erstellen. Wenn Sie diese Tabellen ohne Angabe eines Schemas erstellen , führt SQL Server die folgenden Schritte aus:
- Erstellt in AppDb einen Benutzer 'DOMAIN \ User1', der ein 'DOMAIN \ User1'-Login verwendet, das für die Instanz nicht in SSMS \ Security \ Logins aufgeführt ist.
- Erstellt ein 'DOMAIN \ User1'-Schema in AppDb.
- Erstellt diese Tabellen mit dem neuen Schema 'DOMAIN \ User1'.
Ich bin völlig verblüfft über diese Ergebnisse. Hier sind meine Fragen:
- Ich würde erwarten, dass die Tabellenerstellung fehlschlägt, anstatt zusätzliche Objekte zu erstellen. Kann mich jemand auf den Teil von Books Online verweisen, der dies erklärt?
- Warum erstellt der Server kein 'DOMAIN \ AppUsers'-Schema und fügt die neuen Tabellen zu diesem Schema hinzu, wenn Schemas hinzugefügt werden sollen?
- Wie verwendet die Datenbank ein Login, das nicht unter SSMS \ Security \ Logins angezeigt wird?
- Wenn Sie den Benutzer 'DOMAIN \ User1' in SSMS \ Databases \ AppDb \ Security \ Users betrachten, zeigt das Benutzersymbol einen kleinen roten Pfeil nach unten. Was bedeutet das?
Wir fangen gerade erst an, die Windows-Authentifizierung in einer Organisation zu verwenden, die der Einfachheit halber die SQL-Authentifizierung bevorzugt. Daher bin ich sicher, dass meine Frage darin besteht, die Unterschiede nicht zu kennen. Dieser Code wurde lange vor der Verwendung der Windows-Authentifizierung geschrieben. Ich bin daher sicher, dass wir unser Verständnis für das Erstellen neuer Schemas verbessern müssen, wenn Sie mit der Windows-Authentifizierung als einer andere als der Datenbankeigentümer angemeldet sind.
Falls Sie nicht sagen können, bin ich derjenige, der auf die Verwendung der Windows-Authentifizierung über die SQL-Authentifizierung drängt. Wenn wir dies nicht genau verstehen, kehren wir zur SQL-Authentifizierung zurück.
quelle
Antworten:
Dies war schon immer bei SQL Server 2000 der
Fall. Woher weiß SQL Server, dass Sie es ohne Schema in das
dbo
Schema einfügen möchten ?Die einzige Möglichkeit, ein Standardschema anzugeben, besteht darin:
Beides ist nicht akzeptabel
Es wird empfohlen, das Schema immer für jede Objektreferenz für DDL und DML zu qualifizieren. Aufgrund der Wiederverwendung des Plans ergeben sich deutliche Leistungsvorteile.
Außerdem ist die absichtliche Verwendung von Schemas für SQL Server 2005 besser:
Data
Archive
,Staging
usw.Desktop
,WebGUI
etcDie Verwendung des dbo-Schemas ist also letztes Jahrtausend :-) Links:
quelle
Nun, @gbn tippt schneller als ich ...
Mein einziges Angebot ist ... Sie verweisen auf die Benutzer in die App anmeldet und es ermöglicht dem Benutzer , Tabellen und so zu erstellen. Wenn die Anwendung dies zulässt und der Benutzer dies nicht über SQL Server selbst tut (direkte Anmeldung bei der Datenbank mithilfe von SSMS), müssen Sie sich beim Hersteller dieser Anwendung erkundigen.
quelle
Obwohl die Frage sehr alt ist und bereits eine akzeptierte Antwort hat, werde ich versuchen, Ihre Fragen genauer zu beantworten (anstatt allgemeine Ratschläge zu geben).
Das Verhalten ist unter https://docs.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql im Abschnitt "Implizites Schema und Benutzererstellung" dokumentiert.
Wenn Sie möchten, dass die Objekte in einem bestimmten Schema erstellt werden (wenn das Schema in der Anweisung nicht explizit angegeben ist), sollten Sie DEFAULT_SCHEMA für den Benutzer angeben. In SQL Server 2008 R2 (und früheren Versionen) wird eine Fehlermeldung angezeigt, wenn Sie versuchen, einem Benutzer basierend auf einer Windows-Gruppe ein DEFAULT_SCHEMA zuzuweisen. In SQL Server 2012 (und späteren Versionen) ist dies jetzt möglich.
Es wird nicht nur angezeigt, weil für diesen Benutzer kein Login vorhanden ist. Wie unter https://docs.microsoft.com/en-us/sql/t-sql/statements/create-user-transact-sql angegeben , kann ein Benutzer für jemanden erstellt werden, der sich mit einer anderen Gruppe oder sogar ohne anmeldet ein Login.
Der kleine rote Pfeil (oder das kleine rote x in den neueren Versionen von SSMS) steht für einen Benutzer, der nicht über die CONNECT-Berechtigung in der Datenbank verfügt (diese Berechtigung kann jedoch über eine andere Gruppe bezogen werden).
quelle
Obwohl dies eine alte Frage ist, habe ich dieses Verhalten beobachtet (in SQL Server 2014) und Folgendes festgestellt:
Angesichts des Drehbuchs
Dieses Skript erstellt zwei Tabellen mit dem Namen Test.
Der erste
CREATE TABLE
erstellt eine Tabelle mit dem Namen[MyDomain\MyAdGroupUser].[Test]
und erstellt auch dasMyDomain\MyAdGroupUser
Schema (sowie einenMyDomain\MyAdGroupUser
Datenbankbenutzer, der deaktiviert ist).Die zweite
CREATE TABLE
erstellt eine Tabelle mit dem Namen[dbo].[Test]
Der Grund dafür ist, dass die
CREATE TABLE
Befehle das Standardschema verwenden, da sie das Schema nicht explizit angeben.Da wir beim Erstellen der Benutzer kein Standardschema angegeben haben, legt SQL Server das Standardschema des Windows-Benutzers als dbo fest, legt jedoch KEIN Standardschema für den Windows-Gruppenbenutzer fest. Dies führt daher zur Erstellung des Schemas / Benutzers
quelle