Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwenden von Datenbankschemas in SQL Server

In diesem Artikel wird erläutert, was Datenbankschemata sind, welche Vorteile sie haben und wie Schemata in SQL Server erstellt und verwendet werden.

In einem Verwaltungssystem für relationale Datenbanken wie SQL Server enthält die Datenbank verschiedene Objekte. Dies können Tabellen, gespeicherte Prozeduren, Ansichten und Funktionen sein. In einer Datenbank bezieht sich das Schema auf die logische Sammlung von Datenbankobjekten. Sie können Schemas verwenden, um Objekte je nach Anwendung, Zugriffsrechten und Sicherheit zu trennen.

SQL Server-Schemas

SQL Server stellt die folgenden integrierten logischen Schemas bereit:

  • dbo
  • sys
  • Gast
  • INFORMATION_SCHEMA

Jedes SQL Server-Schema muss einen Datenbankbenutzer als Schemabesitzer haben. Der Schemaeigentümer hat die volle Kontrolle über das Schema. Sie können auch den Schemaeigentümer ändern oder Objekte von einem Schema in ein anderes verschieben.

SQL Server-Schemas bieten die folgenden Vorteile:

  • Bietet mehr Flexibilität und Kontrolle für die Verwaltung von Datenbankobjekten in logischen Gruppen
  • Ermöglicht das schnelle Verschieben von Objekten zwischen verschiedenen Schemas
  • Ermöglicht es Ihnen, die Objektsicherheit auf Schemaebene zu verwalten
  • Ermöglicht Benutzern, logische Gruppen von Objekten innerhalb einer Datenbank zu verwalten
  • Ermöglicht Benutzern, Eigentumsrechte zwischen verschiedenen Schemas zu übertragen

Angenommen, Sie möchten für die Datenbank Ihrer Organisation Objekte nach Abteilungen gruppieren. Beispielsweise sollten die Tabellen und gespeicherten Prozeduren für die Personalabteilung logisch im Schema [HR] gruppiert werden. Ebenso sollten sich Finanzabteilungstabellen im [Fin]-Schema befinden. Jedes Schema (logische Gruppe) enthält SQL Server-Objekte wie Tabellen, gespeicherte Prozeduren, Ansichten, Funktionen, Indizes, Typen und Synonyme.

Hinweis:Das Schema ist eine datenbankweite Entität. Sie können dasselbe Schema in verschiedenen Datenbanken einer SQL Server-Instanz haben.

Standardmäßig verwendet SQL Server das Schema [dbo] für alle Objekte in einer Datenbank. Wir können SCHEMA_NAME() abfragen, um das Standardschema für den verbundenen Benutzer zu erhalten.

SELECT SCHEMA_NAME() AS defaultschema;

Alle Datenbankschemata in der aktuellen Datenbank auflisten

Sie können eine Liste der Schemas mit einer SSMS- oder T-SQL-Abfrage abrufen. Um dies in SSMS zu tun, würden Sie eine Verbindung zur SQL-Instanz herstellen, die SQL-Datenbank erweitern und die Schemas im Sicherheitsordner anzeigen.

Alternativ könnten Sie sys.schemas verwenden, um eine Liste der Datenbankschemas und ihrer jeweiligen Eigentümer zu erhalten.

SELECT s.name AS schema_name,
u.name AS schema_owner
FROM sys.schemas s
INNER JOIN sys.sysusers u ON u.uid = s.principal_id
ORDER BY s.name;

Erstellen eines SQL Server-Schemas mit CREATE SCHEMA

Um ein neues SQL Server-Schema zu erstellen, verwenden wir die CREATE SCHEMA t-SQL-Anweisung. Seine Syntax ist unten gezeigt.

CREATE SCHEMA <schema_name>
AUTHORIZATION <owner_name>
  • Schema_name:Dies ist das Schema, das wir erstellen möchten
  • Autorisierung:Dies ist der Name des Schemaeigentümers

Das Skript zum Erstellen der Schemata [HR], [Admin] und [Fin] mit [dbo]-Schemaeigentümer wird unten gezeigt.

CREATE SCHEMA HR AUTHORIZATION dbo;

GO

CREATE SCHEMA Admin AUTHORIZATION dbo;

Go

CREATE SCHEMA Fin AUTHORIZATION dbo;

GO

Sie können die Datenbank aktualisieren und das neu erstellte Schema wie unten gezeigt anzeigen.

Erstellen einer neuen Tabelle innerhalb eines Schemas

Um Objekte wie eine Tabelle zu erstellen, müssen wir den Schemanamen angeben, in dem das Objekt erstellt wird. Das folgende Skript erstellt beispielsweise [TableA] in verschiedenen Schemas [HR], [Admin] und [Fin].

CREATE TABLE HR.TableA
(
ID int identity(1,1) PRIMARY KEY,
[Name] varchar(100)
)
CREATE TABLE [Admin].TableA
(
ID int identity(1,1) PRIMARY KEY,
[Name] varchar(100)
)
CREATE TABLE [Fin].TableA
(
ID int identity(1,1) PRIMARY KEY,
[Name] varchar(100)
)

Sie können sys.tables- und sys.schema-Systemtabellen verknüpfen, um den Tabellennamen mit ihren Schemas aufzulisten. Die folgende Abfrage gibt beispielsweise [TableA] mit seinem Schema zurück.

SELECT
s.name AS SchemaName,
t.name AS TableName
FROM sys.tables t
INNER JOIN sys.schemas s
ON t.schema_id = s.schema_id
WHERE t.name ='TableA'

Wenn Sie beim Erstellen des Objekts kein Schema angeben, verwendet SQL Server das Standardschema. Beispielsweise erstellt das folgende Skript eine TableA im dbo-Schema.

CREATE TABLE TableA
(
ID int identity(1,1) PRIMARY KEY,
[Name] varchar(100)
)

Hinweis:Sie können eine Tabelle mit einem ähnlichen Namen in einem anderen Schema einer Datenbank erstellen.

Sie müssen das Tabellenschema angeben, um Daten aus dem richtigen Schema abzurufen. Wie oben gezeigt, haben wir beispielsweise [TableA] in allen Schemas. Wenn Sie Datensätze direkt auswählen, ohne das Schema anzugeben, wird daher nach einem Objekt im Standard-DBO-Schema gesucht. Geben Sie daher immer den Schemanamen an, z. B. SELECT * FROM HR.TableA, um Daten abzurufen oder Operationen durchzuführen.

Erstellen einer gespeicherten Prozedur innerhalb eines Schemas

Ebenso können Sie Objekte wie gespeicherte Prozeduren in bestimmten Schemas erstellen. Beispielsweise erstellt das folgende Skript einen SP im HR-Schema.

CREATE PROCEDURE HR.GetEmpData
AS
BEGIN
SELECT * FROM [HR].[TableA]
END

Übertragen des Objekts in ein anderes Schema

Irgendwann erhalten Sie möglicherweise die Anforderung, das Objekt in ein bestimmtes Schema zu verschieben. Angenommen, Sie haben ein neues Schema [Org] erstellt und möchten, dass Ihr Schema [HR].[TableA] vom Schema [HR] zum Schema [Org] verschoben wird.

In diesem Fall können Sie den Alter SCHEMA-Befehl mit der folgenden Syntax verwenden.

ALTER SCHEMA target_schema_name
TRANSFER [ entity_type :: ] securable_name;

Das folgende Skript überträgt Objekt [HR].[TableA] an das [Org]-Schema.

CREATE SCHEMA [ORG]
GO
ALTER SCHEMA ORG TRANSFER HR.TableA

Lassen Sie uns nun die gespeicherte Prozedur [HR].[GetEmpData] in das [Org]-Schema übertragen.

ALTER SCHEMA ORG TRANSFER HR.GetEmpData

Sobald Sie das Skript ausführen, zeigt es die gespeicherte Prozedur im [Org]-Schema.

Innerhalb der gespeicherten Prozedur verweist der Code jedoch immer noch auf das Schema [HR].[TableA].

Daher sollten Sie gespeicherte Prozeduren, Funktionen oder Ansichten nicht mit der Funktion ALTER SCHEMA verschieben, da diese möglicherweise Verweise auf die Objekte in der Definition enthält. Stattdessen können Sie die Prozedur wie unten gezeigt löschen, erstellen oder ändern.

Löschen eines Schemas

Sie können ein Schema in einer SQL Server-Datenbank löschen, aber das Schema sollte keine Objekte enthalten. Wenn ich zum Beispiel versuche, das [Org]-Schema zu löschen, gibt es eine Fehlermeldung, dass Sie das Schema nicht löschen können, weil das Objekt GetEmpData darauf verweist.

Daher können Sie das Objekt entweder in ein anderes Schema übertragen oder die Objekte zuerst löschen. Lassen Sie uns beispielsweise gespeicherte GetEmpData-Prozeduren löschen und dann versuchen, das Schema zu löschen. Wir haben erneut einen Fehler erhalten, weil wir [TableA] im [Org]-Schema haben.

Sobald wir alle Objekte im Datenbankschema gelöscht oder verschoben haben, können Sie das Schema löschen.

Hinweis:Systemschemas wie dbo, information_schema, sys.

können nicht gelöscht werden

Vorteile der Verwendung von Datenbankschemata

  • Datenbankschemata bieten uns die Flexibilität, logische Objektgruppen in einer Datenbank zu erstellen. Wenn mehrere Teams mit derselben Datenbank arbeiten, können wir verschiedene Schemas entwerfen, um ihre Objekte zu trennen.
  • Datenbankschemas helfen Datenbankfachleuten bei der Zugriffsverwaltung, da Sie den Zugriff für Benutzer auf ihre jeweiligen Schemas steuern können, anstatt Zugriff auf die Datenbank als Ganzes zu gewähren.
  • Sie können Datenbanken effizienter verwalten, da dieselben Objekte in mehreren Schemas als unterschiedliche logische Gruppe erscheinen können.
  • Sie können Objekte innerhalb verschiedener Schemas schnell verschieben.
  • Der Schemabesitz kann jedem Datenbankprinzipal oder jeder Rolle zugewiesen werden, und der Besitz kann auch übertragen werden.
  • Es bietet eine zusätzliche Sicherheitsebene, da Sie das richtige Objektschema kennen müssen, um Daten abzufragen oder zu manipulieren. Sie können auch den Zugriff auf Schema- und Schema-eigene Objekte steuern.