I sinonimi in SQL Server sono oggetti di database che danno un nome alternativo agli oggetti di database esistenti localmente o sul server remoto. Inoltre, forniscono un livello di astrazione per proteggere l'applicazione da eventuali modifiche nell'oggetto di base.
Negli script T-SQL, utilizziamo nomi in 3 parti per fare riferimento a oggetti di database. Il formato è:
[Database].[Schema].[Oggetto]
Ad esempio, supponiamo di avere la seguente infrastruttura di database:
- Nome database:[Azuredemodatabase]
- Schema:[SalesLT]
- Oggetto(nome tabella):Prodotto
L'istruzione SELECT con il nome in 3 parti è la seguente:
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM [Azuredemodatabase].[SalesLT].[Product]
Allo stesso modo, un server remoto utilizza la convenzione di denominazione in 4 parti. La parte aggiuntiva è [nome del server remoto]. Quindi, il formato sarà
[Nome server].[Database].[Schema].[Oggetto].
Immaginiamo di dover rinominare il [SalesLT].[Prodotto] tabella a [ProductData] .
Questa tabella è referenziata in più stored procedure, funzioni e viste. Pertanto, è necessario modificare tutti questi riferimenti nelle query o nelle applicazioni client per utilizzare l'ultimo nome della tabella.
È possibile creare un sinonimo che faccia riferimento all'oggetto del database e utilizzarlo nelle query SQL. In caso di modifiche, devi solo ricreare la definizione del sinonimo. Non sarà necessario modificare alcun riferimento all'oggetto nelle query perché stiamo usando il sinonimo.
In un caso diverso, creiamo un sinonimo che punta alla tabella [Azuredemodatabase].[SalesLT].[Product]. Quindi, rilasciamo la tabella e creiamo una vista con un nome simile. In questo caso, un sinonimo farà riferimento automaticamente alla vista perché l'associazione dell'oggetto avviene con il nome dell'oggetto.
Se sposti un oggetto in un database diverso, il sinonimo ti aiuta a ridurre al minimo gli sforzi quando apporti modifiche. Dopo aver ricreato il sinonimo, tutte le query SQL ottengono automaticamente la posizione dell'oggetto più recente.
Puoi anche usare i sinonimi per nascondere i nomi degli oggetti del database. Gli utenti possono interrogare i sinonimi per recuperare i risultati invece di interrogare la tabella di base.
È possibile definire un sinonimo in SQL Server per i seguenti oggetti:
- Tabella definita dall'utente
- Procedura memorizzata
- Visualizza
- Funzioni scalari e inline con valori di tabella
- Tabelle temporanee locali e globali
- Procedura memorizzata CLR, funzioni (con valori di tabella, aggregati, scalari)
Nota:il nome del sinonimo deve essere univoco in un database.
Dove utilizzare i sinonimi in SQL Server
Possiamo usare i sinonimi nell'istruzione T-SQL, come Seleziona, Aggiorna, Esegui, Inserisci, Elimina e sottoquery.
Tuttavia, non possiamo usare i sinonimi nelle istruzioni del linguaggio di definizione dei dati (DDL) come Create e Alter. Inoltre, i sinonimi non sono adatti per i vincoli di controllo, le colonne calcolate, le espressioni predefinite, le espressioni di regole, le viste associate allo schema e le funzioni.
Crea un sinonimo in SQL Server nel server locale
Per creare sinonimi in SQL Server, utilizziamo l'istruzione CREATE SYNONYM. La sintassi è la seguente:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO
Ad esempio, creiamo il sinonimo [MyProductCatalog] per [Azuredemodatabase].[SalesLT].[Prodotto] .
CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]
Una volta creato, puoi sostituire il nome della tabella con il sinonimo come mostrato di seguito. Fa riferimento internamente alla tabella di base a cui abbiamo fatto riferimento nell'istruzione CREATE SYNONYM.
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM MyProductCatalog
Crea un sinonimo in un database sul server remoto
Supponiamo che l'oggetto esista in un server remoto [ABC]. È possibile creare un sinonimo per evitare di specificare un nome in 4 parti nelle query. Nella query seguente, l'oggetto di base è in [MyRemoteServer]:
EXEC sp_addlinkedserver MyRemoteServer;
GO
USE tempdb;
GO
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO
Creazione di un sinonimo con SQL Server Management Studio
Per creare sinonimi, possiamo utilizzare la GUI di SQL Server Management Studio.
- Connettiti alla tua istanza SQL, espandi il database e vai alla cartella Sinonimi.
- Fai clic con il pulsante destro del mouse e scegli Nuovo sinonimo.
- Inserisci i dettagli richiesti per il nome del sinonimo, lo schema del sinonimo, il nome del database, lo schema dell'oggetto, il tipo di oggetto e il nome.
Nel nostro esempio, creiamo un sinonimo nello schema [HumanResources], lo stesso dello schema della tabella:
Fare clic su Script per ottenere uno script T-SQL equivalente come di seguito:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR
[AdventureWorks2017].[HumanResources].[Employee]
GO
Sinonimo di Funzioni definite dall'utente
Innanzitutto, crea l'UDF dbo.TestSynonym utilizzando lo script seguente:
CREATE FUNCTION dbo.TestSynonyn (@ID int)
RETURNS int
AS
BEGIN
IF @ID < 0
BEGIN
SET @ID=100
END
RETURN(@ID);
END;
GO
Quindi, crea un sinonimo con il nome dbo.UDFTest . Puoi chiamare l'UDF usando il sinonimo e recuperare i risultati della query:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;
GO
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue
Dichiarazione di aggiornamento e sinonimo
Si supponga di voler aggiornare un valore nella tabella SQL. Se hai definito un sinonimo su di esso, puoi utilizzarlo anche tu. Ad esempio, la seguente dichiarazione di aggiornamento utilizza Sinonimo [Perofmancetest] al posto del nome della tabella SQL:
Update performancetest set [Name]='Updated New value' where ID=1
Eliminazione di un sinonimo
È possibile utilizzare l'istruzione DROP SYNONYM per eliminare un sinonimo specifico nel database. La query seguente rilascia [EmpData ] in AdventureWorks2017 banca dati:
Use AdventureWorks2017
Drop Synonym EmpData
Ottenere l'elenco dei sinonimi del database in SQL Server
Si supponga di voler conoscere i sinonimi esistenti in un database insieme al loro oggetto di base. Puoi interrogare sys.synonyms vista del catalogo di sistema nel rispettivo database:
SELECT
name,
base_object_name,
type
FROM
sys.synonyms
Nell'output della query, ottieni le seguenti informazioni:
- Nome sinonimo
- L'oggetto di base (nome oggetto in 3 o 4 parti)
- Tipo di oggetto ( SN =sinonimo)
E se modifichiamo l'oggetto base del sinonimo?
Consideriamo l'impatto della modifica dell'oggetto base di un sinonimo. Abbiamo una query per eseguire diverse attività:
- Crea un sinonimo (il nome del sinonimo è [dbo].[EmpData] per l'oggetto base [AdventureWorks2017].[DBO].[Emp] )
- Rilascia l'oggetto base (tabella) [AdventureWorks2017].[DBO].[Emp]
- Crea una vista con il nome [DBO].[Emp] nel database [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
Come accennato in precedenza, il sinonimo lega un oggetto usando il suo nome. Pertanto, dovrebbe indicare la vista anziché il tavolo. In questo caso, la tabella [dbo].[Emp] non esiste.
Come mostrato di seguito, è una vista in [AdventureWorks2017] banca dati.
In alternativa, puoi utilizzare OBJECTPROPERTYEX() per verificare il tipo di base dell'oggetto del sinonimo:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;
GO
Qui, il tipo Base fa riferimento alla vista del database. Nel caso della tabella SQL, ottieni U nell'output.
I sinonimi hanno un impatto negativo sulle prestazioni delle query?
Molti professionisti del database preferiscono non utilizzare i sinonimi di utilizzo in SQL Server. Il loro punto è che SQL Server deve eseguire un passaggio aggiuntivo per risolvere la tabella di base dal sinonimo. Pertanto, potrebbe produrre un effetto negativo.
Testiamo le prestazioni della query. Recuperiamo i record dal nome della tabella e dal sinonimo:
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
Innanzitutto, controlliamo il piano di esecuzione effettivo. Entrambi i batch di query hanno lo stesso piano di esecuzione e gli stessi costi dell'operatore:
Allo stesso modo, entrambe le query hanno 41 letture logiche e un conteggio delle scansioni per il recupero dell'output desiderato.
SQL Server risolve i nomi degli oggetti di base dei sinonimi nella fase di associazione dell'esecuzione della query. Ciò avviene prima della fase di ottimizzazione della query. Pertanto, vedi un piano di esecuzione simile e nessun impatto sulle prestazioni. Di conseguenza, è possibile utilizzare i sinonimi per evitare nomi lunghi in 3 o 4 parti per gli oggetti a cui si accede di frequente. Non influisce sulle prestazioni delle query.
Non significa che crei un sinonimo per ogni oggetto come una tabella, una procedura memorizzata, funzioni, viste. Puoi usarli per gli oggetti a cui si accede più di frequente per un rapido riferimento nelle query.
Conclusione
I sinonimi in SQL Server possono essere utili. Semplificano i nomi degli oggetti del database evitando nomi lunghi in 3 o 4 parti. Puoi usarli per fare riferimento a oggetti sia locali che remoti. Non produce alcun problema di prestazioni. Pertanto, puoi esplorare il loro utilizzo per la flessibilità nella scrittura di query. Tuttavia, la cosa migliore è definire i sinonimi solo per gli oggetti utilizzati di frequente negli script SQL.