W tym artykule wyjaśnimy, czym są schematy baz danych, jakie są ich zalety oraz jak tworzyć i używać schematów w SQL Server.
W systemie zarządzania relacyjnymi bazami danych, takim jak SQL Server, baza danych zawiera różne obiekty. Mogą to być tabele, procedury składowane, widoki i funkcje. W bazie danych schemat odwołuje się do logicznej kolekcji obiektów bazy danych. Możesz użyć schematów do segregacji obiektów w zależności od aplikacji, praw dostępu i bezpieczeństwa.
Schematy SQL Server
SQL Server udostępnia następujące wbudowane schematy logiczne:
- dbo
- sys
- gość
- INFORMATION_SCHEMA
Każdy schemat programu SQL Server musi mieć użytkownika bazy danych jako właściciela schematu. Właściciel schematu ma pełną kontrolę nad schematem. Możesz także zmienić właściciela schematu lub przenieść obiekty z jednego schematu do drugiego.
Schematy SQL Server zapewniają następujące korzyści:
- Zapewnia większą elastyczność i kontrolę nad zarządzaniem obiektami bazy danych w grupach logicznych
- Umożliwia szybkie przenoszenie obiektów między różnymi schematami
- Umożliwia zarządzanie bezpieczeństwem obiektów na poziomie schematu
- Pozwala użytkownikom zarządzać logicznymi grupami obiektów w bazie danych
- Umożliwia użytkownikom przenoszenie własności między różnymi schematami
Załóżmy, że w bazie danych Twojej organizacji chcesz pogrupować obiekty na podstawie działów. Na przykład tabele i procedury składowane dla działu HR powinny być logicznie pogrupowane w schemacie [HR]. Podobnie tabele działu finansów powinny znajdować się w schemacie [Fin]. Każdy schemat (grupa logiczna) zawiera obiekty SQL Server, takie jak tabele, procedury składowane, widoki, funkcje, indeksy, typy i synonimy.
Uwaga:schemat jest jednostką o zasięgu bazy danych. Możesz mieć ten sam schemat w różnych bazach danych instancji SQL Server.
Domyślnie SQL Server używa schematu [dbo] dla wszystkich obiektów w bazie danych. Możemy zapytać SCHEMA_NAME(), aby uzyskać domyślny schemat dla podłączonego użytkownika.
SELECT SCHEMA_NAME() AS defaultschema;
Lista wszystkich schematów baz danych w bieżącej bazie danych
Listę schematów można uzyskać za pomocą zapytania SSMS lub T-SQL. Aby to zrobić w SSMS, należy połączyć się z instancją SQL, rozwinąć bazę danych SQL i wyświetlić schematy w folderze bezpieczeństwa.
Alternatywnie możesz użyć sys.schemas, aby uzyskać listę schematów baz danych i ich właścicieli.
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;
Tworzenie schematu SQL Server za pomocą CREATE SCHEMA
Aby utworzyć nowy schemat SQL Server, używamy instrukcji t-SQL CREATE SCHEMA. Jego składnia jest pokazana poniżej.
CREATE SCHEMA <schema_name> AUTHORIZATION <owner_name>
- Schema_name:to jest schemat, który chcemy utworzyć
- Autoryzacja:to jest nazwa właściciela schematu
Skrypt do tworzenia schematów [HR], [Admin] i [Fin] z właścicielem schematu [dbo] pokazano poniżej.
CREATE SCHEMA HR AUTHORIZATION dbo; GO CREATE SCHEMA Admin AUTHORIZATION dbo; Go CREATE SCHEMA Fin AUTHORIZATION dbo; GO
Możesz odświeżyć bazę danych i wyświetlić nowo utworzony schemat, jak pokazano poniżej.
Tworzenie nowej tabeli w schemacie
Aby utworzyć obiekty takie jak tabela, musimy określić nazwę schematu, w którym obiekt zostanie utworzony. Na przykład poniższy skrypt tworzy [TableA] w różnych schematach [HR], [Admin] i [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) )
Możesz połączyć tabele systemowe sys.tables i sys.schema, aby wyświetlić nazwę tabeli z ich schematami. Na przykład poniższe zapytanie zwraca [TableA] ze swoim schematem.
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'
Jeśli nie określisz schematu podczas tworzenia obiektu, SQL Server użyje domyślnego schematu. Na przykład poniższy skrypt tworzy tabelę A w schemacie dbo.
CREATE TABLE TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
Uwaga:Możesz utworzyć tabelę o podobnej nazwie w innym schemacie bazy danych.
Musisz określić schemat tabeli, aby pobrać dane z prawidłowego schematu. Na przykład, jak pokazano powyżej, we wszystkich schematach mamy [TableA]. Dlatego jeśli wybierzesz rekordy bezpośrednio bez określania schematu, szuka obiektu w domyślnym schemacie DBO. Dlatego zawsze określaj nazwę schematu, taką jak SELECT * FROM HR.TableA do pobierania danych lub wykonywania jakichkolwiek operacji.
Tworzenie procedury składowanej w schemacie
Podobnie można tworzyć obiekty, takie jak procedury składowane, w określonych schematach. Na przykład poniższy skrypt tworzy SP w schemacie HR.
CREATE PROCEDURE HR.GetEmpData AS BEGIN SELECT * FROM [HR].[TableA] END
Przenoszenie obiektu do innego schematu
W pewnym momencie może pojawić się wymóg przeniesienia obiektu do określonego schematu. Załóżmy na przykład, że utworzyłeś nowy schemat [Organizacja] i chcesz, aby Twój schemat [HR].[TableA] został przeniesiony ze schematu [HR] do schematu [Organizacja].
W takim przypadku możesz użyć polecenia Alter SCHEMA z następującą składnią.
ALTER SCHEMA target_schema_name TRANSFER [ entity_type :: ] securable_name;
Poniższy skrypt przenosi obiekt [HR].[TableA] do schematu [Org].
CREATE SCHEMA [ORG] GO ALTER SCHEMA ORG TRANSFER HR.TableA
Teraz przenieśmy procedurę składowaną [HR].[GetEmpData] do schematu [Org].
ALTER SCHEMA ORG TRANSFER HR.GetEmpData
Po wykonaniu skryptu, pokazuje on procedurę składowaną w schemacie [Org].
Jednak wewnątrz procedury składowanej kod nadal odwołuje się do schematu [HR].[TableA].
Dlatego nie należy przenosić procedur składowanych, funkcji ani widoków za pomocą funkcji ZMIEŃ SCHEMAT, ponieważ mogą one mieć odniesienia do obiektów w definicji. Zamiast tego możesz upuścić, utworzyć lub zmienić procedurę, jak pokazano poniżej.
Upuszczanie schematu
Schemat można usunąć z bazy danych SQL Server, ale schemat nie powinien zawierać żadnych obiektów. Na przykład, jeśli próbuję usunąć schemat [Org], pojawia się błąd, że nie można usunąć schematu, ponieważ obiekt GetEmpData odwołuje się do niego.
Dlatego możesz przenieść obiekt do innego schematu lub najpierw usunąć obiekty. Na przykład usuńmy procedury składowane GetEmpData, a następnie spróbujmy usunąć schemat. Ponownie wystąpił błąd, ponieważ mamy [TableA] w schemacie [Org].
Po upuszczeniu lub przeniesieniu wszystkich obiektów w schemacie bazy danych możesz go usunąć.
Uwaga:nie można usuwać schematów systemowych, takich jak dbo, information_schema, sys.
Zalety korzystania ze schematów baz danych
- Schematy baz danych zapewniają nam elastyczność tworzenia grup obiektów logicznych w bazie danych. Jeśli wiele zespołów pracuje z tą samą bazą danych, możemy zaprojektować różne schematy, aby segregować ich obiekty.
- Schematy baz danych pomagają profesjonalistom w zarządzaniu bazami danych w zarządzaniu dostępem, ponieważ możesz kontrolować dostęp użytkowników do ich odpowiednich schematów, zamiast zapewniać dostęp do bazy danych jako całości.
- Możesz wydajniej zarządzać bazami danych, ponieważ pozwala to tym samym obiektom w wielu schematach pojawiać się jako różne grupy logiczne.
- Możesz szybko przenosić obiekty w różnych schematach.
- Własność schematu można przypisać do dowolnego podmiotu lub ról bazy danych, a prawo własności można również przenieść.
- Zapewnia dodatkową warstwę bezpieczeństwa, ponieważ musisz znać poprawny schemat obiektu, aby wysyłać zapytania lub manipulować danymi. Możesz także kontrolować dostęp do schematu i obiektów będących jego własnością.