Wie kam mein Kollege zu seinem eigenen Schema?

14

Ich habe eine gespeicherte Prozedur, die:

  • prüft, ob eine Tabelle existiert und löscht sie, falls ja.
  • erstellt diese Tabelle erneut
  • dann füllt diese Tabelle mit etwa 30 Abfragen.

Wenn ich (DB-Besitzer) diesen Prozess ausführe, funktioniert alles wie beabsichtigt. Wenn mein Kollege dies tut, der über eine Rolle im Active Directory DROP / CREATE-Rechte für diese Datenbank hat, gehen verschiedene Dinge schief. Was mich verwirrt, ist Folgendes:

Bei der Erstellung der Tabelle wurde das dboSchema nicht explizit vor dem Namen angegeben. Dies führte dazu, dass eine Tabelle namens domain\cowork_id.table_name_heretable erstellt wurde. Abgesehen davon, dass diese Tabelle in seinem persönlichen Schema erstellt wurde, verfügt er jetzt auch über dieses Schema in der Datenbank (es existierte nicht vor dem Ausführen des Prozesses).

Was ist passiert? Warum erstellt SQL Server Tabellen im Benutzerschema anstatt in, dbowenn dies nicht angegeben ist?

steenbergh
quelle
2
sqlblog.org/2009/10/11/…
Aaron Bertrand

Antworten:

26

In der Regel sollten Sie explizit angebendbo Schema wenn Sie das Objekt in diesem Schema erstellen möchten.

Wie Sie sind db_owner, ist Ihr Standardschemadbo , so ist es kein Problem , wenn Sie Objekte nicht dbo - Schema geben Sie bei der Erstellung. Für andere (Windows-) Benutzer ist dies jedoch nicht dasselbe.

Ihre Benutzer sind Mitglieder, für Windows groupdie es kein Standardschema gibt. In diesem Fall werden der entsprechende Benutzer und das Schema erstellt, wenn der Benutzer ein Objekt erstellt. Die Dokumentation finden Sie hier: CREATE SCHEMA (Transact-SQL)

Implizites Schema und Benutzererstellung

In einigen Fällen kann ein Benutzer eine Datenbank verwenden, ohne über ein Datenbankbenutzerkonto zu verfügen (ein Datenbankprinzipal in der Datenbank). Dies kann in folgenden Situationen passieren:

Ein Login hat CONTROL SERVER-Berechtigungen.

Ein Windows-Benutzer verfügt nicht über ein einzelnes Datenbankbenutzerkonto (ein Datenbankprinzipal in der Datenbank), sondern greift auf eine Datenbank als Mitglied einer Windows-Gruppe zu, die über ein Datenbankbenutzerkonto (ein Datenbankprinzipal für die Windows-Gruppe) verfügt.

Wenn ein Benutzer ohne Datenbankbenutzerkonto ein Objekt erstellt, ohne ein vorhandenes Schema anzugeben, werden automatisch ein Datenbankprinzipal und ein Standardschema für diesen Benutzer in der Datenbank erstellt. Der erstellte Datenbankprinzipal und das erstellte Schema haben denselben Namen wie der Name, den der Benutzer beim Herstellen einer Verbindung mit SQL Server verwendet hat (der Anmeldename für die SQL Server-Authentifizierung oder der Windows-Benutzername).

Dieses Verhalten ist erforderlich, damit Benutzer, die auf Windows-Gruppen basieren, Objekte erstellen und besitzen können. Dies kann jedoch zur unbeabsichtigten Erstellung von Schemas und Benutzern führen. Um das implizite Erstellen von Benutzern und Schemas zu vermeiden, erstellen Sie nach Möglichkeit explizit Datenbank-Principals und weisen Sie ein Standardschema zu. Oder geben Sie explizit ein vorhandenes Schema an, wenn Sie Objekte in einer Datenbank mit zwei- oder dreiteiligen Objektnamen erstellen.

Um das Problem zu beheben, weisen Sie das dboSchema einfach default schemaallen Ihren Benutzer-Windows-Gruppen zu, oder schreiben Sie das Schema explizit, wenn Sie Objekte erstellen. Immer.

Sepupic
quelle