SQL 2008 R2 erstellt Benutzer / Schema, wenn Windows-Benutzer Tabellen erstellen

9

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:

  1. 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.
  2. Erstellt ein 'DOMAIN \ User1'-Schema in AppDb.
  3. Erstellt diese Tabellen mit dem neuen Schema 'DOMAIN \ User1'.

Ich bin völlig verblüfft über diese Ergebnisse. Hier sind meine Fragen:

  1. 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?
  2. Warum erstellt der Server kein 'DOMAIN \ AppUsers'-Schema und fügt die neuen Tabellen zu diesem Schema hinzu, wenn Schemas hinzugefügt werden sollen?
  3. Wie verwendet die Datenbank ein Login, das nicht unter SSMS \ Security \ Logins angezeigt wird?
  4. 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.

Flipdoubt
quelle
Sie können das Standardschema {dbo zum Beispiel} für Domänenbenutzer definieren, jedoch nicht für Domänengruppen.

Antworten:

9

Dies war schon immer bei SQL Server 2000 der
Fall. Woher weiß SQL Server, dass Sie es ohne Schema in das dboSchema einfügen möchten ?

Die einzige Möglichkeit, ein Standardschema anzugeben, besteht darin:

  • Verwenden Sie SQL-Anmeldungen (nicht Windows)
  • als "sysadmin" ausführen

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:

  • Tabellen in Data
  • andere Tabellen in Archive, Stagingusw.
  • Code in Schemata pro Client - Berechtigungen: Desktop, WebGUIetc

Die Verwendung des dbo-Schemas ist also letztes Jahrtausend :-) Links:

gbn
quelle
Ich gehe davon aus, dass wir den Code aktualisieren sollten, um neuen Tabellen das Schema voranzustellen, oder? Bedeutet dies, dass häufig neue Benutzer unter dem Sicherheitsknoten angezeigt werden?
Flipdoubt
@flipdoubt: ja zu beiden. Sobald Sie sich darauf
einlassen
Eine letzte Frage. Wie können Sie dem neuen Schema Rechte erteilen, bevor der automatisch erstellte Benutzer einen Fehler beim Abfragen eines Objekts im neuen Schema erstellt, wenn es üblich ist, Benutzer automatisch hinzuzufügen und während der Objekterstellung Schemas anzugeben? Anhand des Beispiels, das ich zu 'DOMAIN \ User1' gepostet habe, kann ich dem Konto 'DOMAIN \ AppUsers' Zugriff zuweisen. Verwenden Abfragen jedoch die Zugriffsrechte für 'DOMAIN \ User1' oder 'DOMAIN \ AppUsers'? Es ist nur so hinterhältig, dass der Server den Benutzer erstellt, sobald das Objekt erstellt wird.
Flipdoubt
Die Berechtigungen gelten standardmäßig für den Schemabesitzer user1. Dies ist wie DB_OWNER für Schema
gbn
2

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.

Gemeinschaft
quelle
Wir haben die App geschrieben.
Flipdoubt
2

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).

  1. 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.

  2. 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.

  3. 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.

  4. 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).

Razvan Socol
quelle
0

Obwohl dies eine alte Frage ist, habe ich dieses Verhalten beobachtet (in SQL Server 2014) und Folgendes festgestellt:

Angesichts des Drehbuchs

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
)

Dieses Skript erstellt zwei Tabellen mit dem Namen Test.

Der erste CREATE TABLEerstellt eine Tabelle mit dem Namen [MyDomain\MyAdGroupUser].[Test]und erstellt auch das MyDomain\MyAdGroupUserSchema (sowie einen MyDomain\MyAdGroupUserDatenbankbenutzer, der deaktiviert ist).

Die zweite CREATE TABLEerstellt eine Tabelle mit dem Namen[dbo].[Test]

Der Grund dafür ist, dass die CREATE TABLEBefehle 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

SEarle1986
quelle