Was nützen SQL Server-Schemas?

185

Ich bin kein Anfänger in der Verwendung von SQL-Datenbanken und insbesondere von SQL Server. Ich war jedoch in erster Linie ein SQL 2000-Typ und war 2005+ immer durch Schemata verwirrt. Ja, ich kenne die grundlegende Definition eines Schemas, aber wofür werden sie in einer typischen SQL Server-Bereitstellung wirklich verwendet?

Ich habe immer nur das Standardschema verwendet. Warum sollte ich spezielle Schemas erstellen wollen? Warum sollte ich eines der integrierten Schemas zuweisen?

EDIT: Zur Verdeutlichung denke ich, ich suche nach den Vorteilen von Schemata. Wenn Sie es nur als Sicherheitsschema verwenden möchten, scheinen die Datenbankrollen diese Rolle bereits ausgefüllt zu haben. Und die Verwendung eines Namespace-Spezifizierers scheint etwas gewesen zu sein, das Sie mit dem Besitz hätten tun können (dbo versus Benutzer usw.).

Ich denke, was ich vorhabe ist, was machen Schemas, die Sie mit Eigentümern und Rollen nicht machen können? Was sind ihre spezifischen Vorteile?

Erik Funkenbusch
quelle

Antworten:

164

Schemata gruppieren Tabellen, Prozeduren und Ansichten logisch zusammen. Alle mitarbeiterbezogenen Objekte im employeeSchema usw.

Sie können auch nur einem Schema Berechtigungen erteilen, sodass Benutzer nur das Schema sehen können, auf das sie Zugriff haben, und sonst nichts.

SQLMenace
quelle
21
Die Möglichkeit, einem Schema Berechtigungen zuzuweisen, lohnt sich aus administrativer Sicht.
Hakan Winther
9
Könnten Sie keine separate Datenbank verwenden?
Sam Yi
7
Diese Schemaerlaubnis klingt auf dem Papier gut ... wird aber selten richtig verwendet. Für mich ist es die Mühe nicht wert.
Sam Yi
3
Aber wenn das der Fall ist, könnten Sie das nicht auch mit Namenskonventionen erreichen? Ich schlage nicht vor, dass es keinen Anwendungsfall dafür gibt. es ist meistens eine Addition durch Subtraktion.
Sam Yi
6
@ Ajedi32, ja ... mit Schemas können Sie ein einzelnes atomares Commit in einem einzelnen Transaktionsprotokoll abrufen und alle Ihre Daten auf einmal sichern, anstatt zwei Datenbanken zu haben, die nicht synchron sind, und verteilte Transaktionen zu bekämpfen.
Matthew Whited
31

Genau wie der Namespace von C # -Codes.

Airbai
quelle
16
Leider spielen Schemas und .NET-Namespaces aus ORM-Sicht ( nämlich Entity Framework ) nicht sehr gut zusammen . Tabellen im MyDatabase.MySchemaSchema werden Entitätsklassen im MyProject.MyDatabase.MySchemaNamespace nicht auf magische Weise zugeordnet . Es ist auch erwähnenswert, dass alle .Hacks mit Punktnotation ( ) in den Tabellennamen als Unterstriche ( _) in den Klassennamen enden . Nur Essen für unglückliche Gedanken.
Dan Lugg
2
Gute Analogie für den Unterricht. Ich sehe es nicht als 100% wörtlich genommen ... (diese Vorbehalte klingen in der Praxis geringfügig)
Samantha Branham
6
Persönlich wünschte ich mir, sie wären eher .NET-Namespaces, sodass man eine beliebige Anzahl von Schemas ( wie Sie es mit Namespaces können ) für organisatorische Zwecke verschachteln könnte . Das, und ich wünschte, sie würden in EF besser abbilden.
Dan Lugg
Sie sind keine Namespaces in einer Sprache, die mir einfällt.
Tanveer Badar
29

Sie können auch eine Art Namenskollisionsschutz für Plugin-Daten bieten. Mit der neuen Funktion zum Ändern der Datenerfassung in SQL Server 2008 werden die verwendeten Tabellen beispielsweise in einem separaten CDC-Schema abgelegt. Auf diese Weise müssen sie sich keine Gedanken über einen Namenskonflikt zwischen einer CDC-Tabelle und einer in der Datenbank verwendeten realen Tabelle machen und können die Namen der realen Tabellen absichtlich schattieren.

Joel Coehoorn
quelle
17

Ich weiß, dass es ein alter Thread ist, aber ich habe mich selbst mit Schemas befasst und denke, dass Folgendes ein weiterer guter Kandidat für die Verwendung von Schemata sein könnte:

In einem Datawarehouse mit Daten aus verschiedenen Quellen können Sie für jede Quelle ein anderes Schema verwenden und dann z. B. den Zugriff basierend auf den Schemas steuern. Vermeidet auch die möglichen Namenskollisionen zwischen den verschiedenen Quellen, wie ein anderes Poster oben antwortete.

tobi18
quelle
9

Wenn Sie Ihr Schema diskret halten, können Sie eine Anwendung skalieren, indem Sie ein bestimmtes Schema auf einem neuen DB-Server bereitstellen. (Dies setzt voraus, dass Sie über eine Anwendung oder ein System verfügen, die / das groß genug ist, um unterschiedliche Funktionen zu haben.)

Stellen Sie sich als Beispiel ein System vor, das die Protokollierung durchführt. Alle Protokollierungstabellen und SPs befinden sich im Schema [Protokollierung]. Die Protokollierung ist ein gutes Beispiel, da es selten (wenn überhaupt) vorkommt, dass andere Funktionen im System Objekte im Protokollierungsschema überlappen (dh verknüpfen).

Ein Hinweis zur Verwendung dieser Technik: Verwenden Sie für jedes Schema in Ihrer Anwendung / Ihrem System eine andere Verbindungszeichenfolge. Anschließend stellen Sie die Schemaelemente auf einem neuen Server bereit und ändern Ihre Verbindungszeichenfolge, wenn Sie skalieren müssen.

Hogan
quelle
8

Ich stimme Brent in diesem Punkt eher zu ... siehe diese Diskussion hier. http://www.brentozar.com/archive/2010/05/why-use-schemas/

Kurz gesagt ... Schemata sind nur für ganz bestimmte Anwendungsfälle besonders nützlich. Macht die Dinge chaotisch. Verwenden Sie sie nicht, wenn Sie helfen können. Und versuchen Sie, die K (eep) I (t) S (imple) S (tupid) -Regel zu befolgen.

Sam Yi
quelle
2
Ich glaube nicht, dass Brent argumentiert, dass "Schemas schlecht sind", nur dass die Verwendung von nicht standardmäßigen Schemas weitaus komplexer ist als nur die Verwendung des Standardschemas. Der Rest Ihrer Summe ist korrekt.
Joseph Daigle
"Wenn [Schemas] richtig verwendet werden, können Sie Berechtigungen nach Objektgruppen trennen." ~ brentozar.com/archive/2010/05/why-use-schemas
LL Learner
7

Ich sehe keinen Vorteil darin, Benutzer, die an Schemas gebunden sind, zu aliasen. Hier ist warum ....

Die meisten Benutzer verbinden ihre Benutzerkonten zunächst über Rollen mit Datenbanken. Sobald Sie einen Benutzer entweder dem Systemadministrator oder der Datenbankrolle db_owner in irgendeiner Form zuweisen, ist dieses Konto entweder dem Benutzerkonto "dbo" zugeordnet oder voll Berechtigungen für eine Datenbank. Sobald dies geschieht, werden diese DBO-Rechte unabhängig davon, wie Sie sich einem Schema zuweisen, das über Ihr Standardschema hinausgeht (das denselben Namen wie Ihr Benutzerkonto hat), dem Objekt zugewiesen, das Sie unter Ihrem Benutzer und Schema erstellen. Es ist irgendwie sinnlos ... und nur ein Namespace und verwirrt das wahre Eigentum an diesen Objekten. Es ist schlechtes Design, wenn Sie mich fragen ... wer auch immer es entworfen hat.

Was sie hätten tun sollen, ist, "Gruppen" zu erstellen, Schemas und Rollen wegzuwerfen und es Ihnen einfach zu ermöglichen, Gruppen von Gruppen in einer beliebigen Kombination zu schichten. Dann teilen Sie dem System auf jeder Ebene mit, ob Berechtigungen geerbt, verweigert oder mit benutzerdefinierten überschrieben werden Einsen. Dies wäre viel intuitiver gewesen und hätte es DBAs ermöglicht, besser zu kontrollieren, wer die wirklichen Eigentümer dieser Objekte sind. Im Moment ist dies in den meisten Fällen impliziert, dass der dbo-Standard-SQL Server-Benutzer diese Rechte hat ... nicht der Benutzer.

stürmisch
quelle
7

In einem ORACLE-Shop, in dem ich viele Jahre gearbeitet habe, wurden Schemata verwendet, um Prozeduren (und Pakete) zu kapseln, die für verschiedene Front-End-Anwendungen gelten. Ein anderes API-Schema für jede Anwendung war häufig sinnvoll, da die Anwendungsfälle, Benutzer und Systemanforderungen sehr unterschiedlich waren. Ein API-Schema bestand beispielsweise darin, dass eine Entwicklungs- / Konfigurationsanwendung nur von Entwicklern verwendet werden sollte. Ein weiteres API-Schema war der Zugriff auf die Clientdaten über Ansichten und Prozeduren (Suchen). Ein weiteres 'API'-Schema kapselte Code, der zum Synchronisieren von Entwicklungs- / Konfigurations- und Clientdaten mit einer Anwendung verwendet wurde, die über eine eigene Datenbank verfügte. Einige dieser 'API'-Schemata würden unter dem Deckmantel immer noch gemeinsame Prozeduren und Funktionen miteinander teilen (über andere' GEMEINSAME ').

Ich werde sagen, dass es wahrscheinlich nicht das Ende der Welt ist, kein Schema zu haben, obwohl es sehr hilfreich sein kann. Wirklich, es ist das Fehlen von Paketen in SQL Server, das mir wirklich Probleme bereitet ... aber das ist ein anderes Thema.

LL Lernender
quelle
Da bei Oracle 1 Instanz = 1 Datenbank = 1 Lizenz zu zahlen ist, verwenden Benutzer Shemas, um zu vermeiden, dass eine weitere Datenbank erstellt und für eine andere Lizenz bezahlt wird. In SQl Server kann 1 Server viele Datenbanken verarbeiten.
Patrick Honorez
5

Ich denke, Schemata sind wie viele neue Funktionen (ob für SQL Server oder ein anderes Software-Tool). Sie müssen sorgfältig prüfen, ob der Vorteil des Hinzufügens zu Ihrem Entwicklungskit den Verlust an Einfachheit bei Design und Implementierung ausgleicht.

Es sieht für mich so aus, als ob Schemata in etwa optionalen Namespaces entsprechen. Wenn Sie sich in einer Situation befinden, in der Objektnamen kollidieren und die Granularität der Berechtigungen nicht ausreicht, finden Sie hier ein Tool. (Ich würde gerne sagen, dass es möglicherweise Designprobleme gibt, die zuerst auf einer grundlegenderen Ebene behandelt werden sollten.)

Das Problem kann sein, dass einige Entwickler, wenn es vorhanden ist, es gelegentlich zum kurzfristigen Nutzen verwenden. und wenn es dort drin ist, kann es zu Kudzu werden.

dkretz
quelle
3

In SQL Server 2000 wurden erstellte Objekte mit diesem bestimmten Benutzer verknüpft, z. B. wenn ein Benutzer, z. B. Sam, ein Objekt erstellt, z. B. Mitarbeiter, sieht diese Tabelle folgendermaßen aus: Sam.Employees. Was ist, wenn Sam das Unternehmen verlässt oder in einen anderen Geschäftsbereich zieht? Was würde mit der Tabelle Sam.Employees passieren, sobald Sie den Benutzer Sam löschen? Wahrscheinlich müssten Sie zuerst den Besitz von Sam.Employees in dbo.Employess ändern. Schema bietet eine Lösung, um dieses Problem zu überwinden. Sam kann sein gesamtes Objekt in einem Schema wie Emp_Schema erstellen. Wenn er nun ein Objekt Employees in Emp_Schema erstellt, wird das Objekt als Emp_Schema.Employees bezeichnet. Selbst wenn das Benutzerkonto Sam gelöscht werden muss, ist das Schema nicht betroffen.

Tariq Awan
quelle
1
Dies gilt nicht mehr, da es seit 2000 zwei neue Versionen gibt
Hogan
0

Entwicklung - Jeder unserer Entwickler erhält sein eigenes Schema als Sandbox zum Spielen.

Nick Van Brunt
quelle
29
-1 Es ist besser, Entwicklern separate ganze Kopien der Datenbank zur Verfügung zu stellen, mit denen sie auf ihrem eigenen Computer spielen können. Andernfalls könnten sie nur sicher ändern, was sich in ihrem Schema befindet. Dies erschwert die Beförderung zum Leben und die Trennung von Schemata aus anderen Gründen, die in anderen Antworten beschrieben werden.
Stephen Turner
5
Ich kann nicht für die Anwendung sprechen, an der Sie arbeiten ... aber Ihre Entwicklung sollte die Produktion so gut wie möglich widerspiegeln. Schemata in dev und nicht in prod zu haben, kann problematisch sein.
Sam Yi
0

Hier ein gutes Implementierungsbeispiel für die Verwendung von Schemas mit SQL Server. Wir hatten mehrere MS-Access-Anwendungen. Wir wollten diese in ein ASP.NET-App-Portal konvertieren. Jede MS-Access-Anwendung wird als App für dieses Portal geschrieben. Jede MS-Access-Anwendung verfügt über eigene Datenbanktabellen. Einige davon sind verwandt, wir fügen sie in das allgemeine dbo-Schema von SQL Server ein. Der Rest bekommt seine eigenen Schemata. Auf diese Weise möchten wir wissen, welche Tabellen zu einer App im ASP.NET-App-Portal gehören, die einfach navigiert, visualisiert und verwaltet werden kann.

Herman Van Der Blom
quelle