Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wprowadzenie do synonimów w SQL Server

Synonimy w SQL Server to obiekty bazy danych, które nadają alternatywną nazwę obiektom bazy danych istniejącym lokalnie lub na serwerze zdalnym. Ponadto zapewniają warstwę abstrakcji, która chroni aplikację przed wszelkimi zmianami w obiekcie podstawowym.

W skryptach T-SQL używamy trzyczęściowych nazw do odwoływania się do obiektów bazy danych. Format to:

[Baza danych].[Schemat].[Obiekt]

Załóżmy na przykład, że mamy następującą infrastrukturę bazy danych:

  • Nazwa bazy danych:[Azuredemodatabase]
  • Schemat:[SprzedażLT]
  • Obiekt (nazwa tabeli):Produkt

Instrukcja SELECT z 3-częściową nazwą jest następująca:

SELECT  [ProductID]
      ,[Name]
      ,[ProductNumber]
      ,[Color]
      ,[StandardCost]
      ,[ListPrice]
      ,[Size]
      ,[Weight]
      ,[ProductCategoryID]
      ,[ProductModelID]
      ,[SellStartDate]
      ,[SellEndDate]
      ,[DiscontinuedDate]
      ,[ThumbNailPhoto]
      ,[ThumbnailPhotoFileName]
      ,[rowguid]
      ,[ModifiedDate]
  FROM [Azuredemodatabase].[SalesLT].[Product]

Podobnie serwer zdalny używa czteroczęściowej konwencji nazewnictwa. Dodatkową częścią jest [nazwa serwera zdalnego]. Dlatego format będzie następujący

[Nazwa serwera].[Baza danych].[Schemat].[Obiekt].

Wyobraźmy sobie, że musisz zmienić nazwę [SalesLT].[Produkt] tabela do [DaneProduktu] .

Ta tabela jest przywoływana w wielu procedurach składowanych, funkcjach i widokach. Dlatego musisz zmodyfikować wszystkie takie odniesienia w zapytaniach lub aplikacjach klienckich, aby używały najnowszej nazwy tabeli.

Możesz utworzyć synonim odwołujący się do obiektu bazy danych i używać go w zapytaniach SQL. W przypadku jakichkolwiek zmian wystarczy odtworzyć definicję synonimu. Nie musisz zmieniać żadnych odniesień do obiektów w zapytaniach, ponieważ używamy synonimu.

W innym przypadku tworzymy synonim wskazujący na tabelę [Azuredemodatabase].[SalesLT].[Produkt]. Następnie upuszczamy tabelę i tworzymy widok o podobnej nazwie. W takim przypadku synonim automatycznie odniesie się do widoku, ponieważ wiązanie obiektu następuje z nazwą obiektu.

Jeśli przeniesiesz obiekt do innej bazy danych, Synonim pomoże Ci zminimalizować wysiłek przy wprowadzaniu zmian. Po odtworzeniu Synonimu wszystkie zapytania SQL automatycznie uzyskują najnowszą lokalizację obiektu.

Możesz także użyć Synonimów, aby ukryć nazwy obiektów bazy danych. Użytkownicy mogą pytać o synonimy w celu pobrania wyników zamiast zadawać pytania dotyczące tabeli podstawowej.

Możesz zdefiniować synonim w SQL Server dla następujących obiektów:

  • Tabela zdefiniowana przez użytkownika
  • Procedura składowana
  • Widok
  • Skalarne i wbudowane funkcje z wartościami tabelarycznymi
  • Lokalne i globalne tabele tymczasowe
  • Procedura składowana CLR, funkcje (wartości z tabeli, agregacja, skalar)

Uwaga:nazwa synonimu powinna być unikalna w bazie danych.

Gdzie używać synonimów w SQL Server

Możemy używać synonimów w instrukcji T-SQL, takich jak Select, Update, Execute, Insert, Delete i podzapytania.

Nie możemy jednak używać synonimów w instrukcjach języka definicji danych (DDL), takich jak Utwórz i Zmień. Ponadto synonimy nie nadają się do sprawdzania ograniczeń, kolumn obliczanych, wyrażeń domyślnych, wyrażeń reguł, widoków powiązanych ze schematem i funkcji.

Utwórz synonim w SQL Server na lokalnym serwerze

Aby utworzyć synonimy w SQL Server, używamy instrukcji CREATE SYNONYM. Składnia jest następująca:

CREATE SYNONYM <synonym_name, sysname, sample_synonym>
  FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO

Na przykład utwórzmy synonim [MyProductCatalog] dla [Azuredemodatabase].[SalesLT].[Produkt] .

CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]

Po utworzeniu możesz zastąpić nazwę tabeli synonimem, jak pokazano poniżej. Wewnętrznie odwołuje się do tabeli bazowej, do której odwołujemy się w instrukcji CREATE SYNONYM.

SELECT  [ProductID]
      ,[Name]
      ,[ProductNumber]
      ,[Color]
      ,[StandardCost]
      ,[ListPrice]
      ,[Size]
      ,[Weight]
      ,[ProductCategoryID]
      ,[ProductModelID]
      ,[SellStartDate]
      ,[SellEndDate]
      ,[DiscontinuedDate]
      ,[ThumbNailPhoto]
      ,[ThumbnailPhotoFileName]
      ,[rowguid]
      ,[ModifiedDate]
  FROM MyProductCatalog

Utwórz synonim w bazie danych na zdalnym serwerze

Załóżmy, że obiekt istnieje na zdalnym serwerze [ABC]. Możesz utworzyć synonim, aby uniknąć określania 4-częściowej nazwy w zapytaniach. W poniższym zapytaniu obiekt bazowy znajduje się w [MyRemoteServer]:

EXEC sp_addlinkedserver MyRemoteServer;
GO  
USE tempdb;  
GO  
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO

Tworzenie synonimu za pomocą SQL Server Management Studio

Aby utworzyć synonimy, możemy użyć graficznego interfejsu użytkownika SQL Server Management Studio.

  • Połącz się ze swoją instancją SQL, rozwiń bazę danych i przejdź do folderu Synonimy.
  • Kliknij go prawym przyciskiem myszy i wybierz Nowy synonim.
  • Wprowadź wymagane szczegóły nazwy synonimu, schematu synonimu, nazwy bazy danych, schematu obiektu, typu obiektu i nazwy.

W naszym przykładzie tworzymy Synonim w schemacie [HumanResources], taki sam jak w schemacie tabeli:

Kliknij Skrypt aby uzyskać równoważny skrypt T-SQL, jak poniżej:

USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR 
[AdventureWorks2017].[HumanResources].[Employee]
GO

Synonim funkcji zdefiniowanych przez użytkownika

Najpierw utwórz UDF dbo.TestSynonym za pomocą poniższego skryptu:

CREATE FUNCTION dbo.TestSynonyn (@ID int)  
RETURNS int  
AS  
BEGIN  
IF @ID < 0  
BEGIN  
    SET @ID=100
END  
RETURN(@ID);  
END;  
GO

Następnie utwórz dla niego synonim o nazwie dbo.UDFTest . Możesz wywołać UDF za pomocą synonimu i pobrać wyniki zapytania:

CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;  
GO  
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue

Zaktualizuj oświadczenie i synonim

Załóżmy, że chcesz zaktualizować wartość w tabeli SQL. Jeśli zdefiniowałeś na nim Synonim, możesz go również użyć. Na przykład poniższa instrukcja aktualizacji używa synonimu [Perofmancetest] w miejsce nazwy tabeli SQL:

Update performancetest set [Name]='Updated New value' where ID=1

Upuszczanie synonimu

Możesz użyć instrukcji DROP SYNONYM, aby usunąć określony synonim z bazy danych. Poniższe zapytanie opuszcza [EmpData ] w AdventureWorks2017 baza danych:

Use AdventureWorks2017
Drop Synonym EmpData

Pobieranie listy synonimów baz danych w SQL Server

Załóżmy, że chcesz poznać istniejące synonimy w bazie danych wraz z ich obiektem podstawowym. Możesz zapytać o sys.synonimy widok katalogu systemowego w odpowiedniej bazie danych:

SELECT 
    name, 
    base_object_name, 
    type
FROM 
    sys.synonyms

W wyniku zapytania otrzymasz następujące informacje:

  • Nazwa synonimu
  • Obiekt bazowy (3-częściowa lub 4-częściowa nazwa obiektu)
  • Typ obiektu (SN =synonim)

A co, jeśli zmodyfikujemy podstawowy obiekt synonimu?

Rozważmy wpływ modyfikacji obiektu bazowego synonimu. Mamy zapytanie do wykonania kilku zadań:

  • Utwórz synonim (nazwa synonimu to [dbo].[EmpData] dla obiektu podstawowego [AdventureWorks2017].[DBO].[Emp] )
  • Upuść obiekt bazowy (tabela) [AdventureWorks2017].[DBO].[Emp]
  • Utwórz widok o nazwie [DBO].[Emp] w bazie danych [AdventureWorks2017].
USE [AdventureWorks2017]
GO
CREATE SYNONYM [dbo].[EmpData] FOR [AdventureWorks2017].[DBO].[Emp]
GO
Drop table [AdventureWorks2017].[DBO].[Emp]
Go
Create view [DBO].[Emp]
as 
Select * from dbo.Employee
go

Jak wspomniano wcześniej, Synonim wiąże obiekt przy użyciu jego nazwy. Dlatego warto zwrócić uwagę na widok zamiast na tabelę. W tym przypadku tabela [dbo].[Emp] nie istnieje.

Jak pokazano poniżej, jest to widok w [AdventureWorks2017] baza danych.

Alternatywnie możesz użyć OBJECTPROPERTYEX() aby sprawdzić typ bazowy obiektu synonimu:

SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;  
GO

W tym przypadku typ podstawowy odwołuje się do widoku bazy danych. W przypadku tabeli SQL otrzymujesz U na wyjściu.

Czy synonimy wpływają negatywnie na wydajność zapytań?

Wielu specjalistów od baz danych woli nie używać synonimów w SQL Server. Chodzi o to, że SQL Server musi wykonać dodatkowy krok w rozwiązywaniu tabeli bazowej z Synonimu. W związku z tym może to mieć negatywny wpływ.

Przetestujmy wydajność zapytań. Pobieramy rekordy z nazwy tabeli i synonimu:

Create table TestTable
(
    ID int,
    [Name] varchar(20)
)
Insert into TestTable values (1, 'Temporary Data')
GO 10000

Create synonym performancetest for TestTable
SET STATISTICS IO ON;
Select * from TestTable 
Go
Select * from performancetest

Najpierw sprawdźmy rzeczywisty plan wykonania. Obie partie zapytań mają ten sam plan wykonania i koszty operatora:

Podobnie, oba zapytania mają 41 odczytów logicznych i jedną liczbę skanów do pobrania żądanych danych wyjściowych.

SQL Server rozpoznaje nazwy obiektów bazowych synonimów w fazie wiązania wykonywania zapytania. Dzieje się to przed fazą optymalizacji zapytania. Dlatego widzisz podobny plan wykonania i brak wpływu na wydajność. W związku z tym można używać synonimów, aby uniknąć długich 3-częściowych lub 4-częściowych nazw dla często używanych obiektów. Nie wpływa to na wydajność zapytań.

Nie oznacza to, że tworzysz synonim dla każdego obiektu, takiego jak tabela, procedura składowana, funkcje, widoki. Możesz ich używać do najczęściej używanych obiektów, aby szybko odwoływać się do nich w zapytaniach.

Wniosek

Synonimy w SQL Server mogą być korzystne. Upraszczają nazwy obiektów bazy danych, unikając długich nazw składających się z trzech lub czterech części. Możesz ich używać do odwoływania się zarówno do obiektów lokalnych, jak i zdalnych. Nie powoduje żadnych problemów z wydajnością. Dlatego możesz zbadać ich użycie, aby uzyskać elastyczność w pisaniu zapytań. Jednak najlepsze jest zdefiniowanie synonimów tylko dla często używanych obiektów w skryptach SQL.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak określić inny numer portu w SQL Management Studio?

  2. 3 sposoby na uzyskanie nazwy dnia z daty w SQL Server (T-SQL)

  3. Jak przywrócić bazę danych z C#

  4. Jak wdrożyć aplikację z bazą danych serwera sql na klientach

  5. Co powinieneś wiedzieć o funkcji NOCHECK podczas włączania ograniczenia CHECK w SQL Server