Sinonimi (Motore di database)

Si applica a: SQL ServerDatabase SQL di AzureIstanza gestita di SQL Azure

Un sinonimo è un oggetto di database che viene utilizzato per gli scopi seguenti:

  • Fornisce un nome alternativo per un altro oggetto di database, definito oggetto di base, presente su un server locale o remoto.

  • Fornisce un livello di astrazione che consente di proteggere un'applicazione client dalle modifiche apportate al nome o alla posizione dell'oggetto di base.

Si consideri ad esempio la tabella Employee di Adventure Works, che si trova su un server denominato Server1. Per farvi riferimento da un altro server, Server2, un'applicazione client dovrebbe usare il nome composto da quattro parti Server1.AdventureWorks.Person.Employee. Inoltre, se la tabella venisse spostata in un altro server, sarebbe necessario modificare l'applicazione client in modo da riflettere la modifica della posizione.

Per risolvere entrambi questi problemi, è possibile creare un sinonimo, EmpTable in uno schema dedicato o esistente, RemoteObjects, su Server2 per la tabella Employee su Server1. L'applicazione client dovrà quindi usare unicamente il nome composto da sue parti, RemoteObjects.EmpTable, per fare riferimento alla tabella Employee Server1. Se la posizione della tabella Employee viene modificata, sarà necessario modificare il sinonimo, EmpTable, per puntare alla nuova posizione della tabella Employee . Poiché non esiste un'istruzione ALTER SYNONYM, è necessario prima eliminare il sinonimo, RemoteObjects.EmpTable, quindi ricrearlo con lo stesso nome, ma ora puntando alla nuova posizione della tabella Employee.

Un sinonimo appartiene a uno schema e, come gli altri oggetti di uno schema, deve avere un nome univoco. È possibile creare sinonimi per gli oggetti di database seguenti:

Stored procedure assembly (CLR)

Funzione scalare assembly (CLR)

Procedura di filtro della replica

Funzione scalare SQL

Funzione con valori di tabella inline SQL

Visualizza

Funzione con valori di tabella assembly (CLR)

Funzioni di aggregazione assembly (CLR)

Funzione con valori di tabella SQL

Stored procedure SQL

Tabella* (definita dall'utente)

*Include tabelle temporanee globali e locali

Nota

I nomi composti da quattro parti non sono supportati per gli oggetti funzione di base.

Un sinonimo non può essere l'oggetto di base di un altro sinonimo e non può fare riferimento a una funzione di aggregazione definita dall'utente.

L'associazione tra un sinonimo e il relativo oggetto di base avviene unicamente in base al nome. Tutti i controlli relativi all'esistenza, al tipo e alle autorizzazioni per l'oggetto di base sono rimandati alla fase di esecuzione. L'oggetto di base può pertanto essere modificato, eliminato o eliminato e sostituito da un altro oggetto con lo stesso nome dell'oggetto di base originale. Si consideri ad esempio il sinonimo dbo.MyContacts fa riferimento alla tabella Person.Contact di Adventure Works. Se la tabella Contact viene eliminata e sostituita da una vista denominata Person.Contact, il sinonimo MyContacts farà riferimento alla vista Person.Contact .

I riferimenti a sinonimi non sono associati a schemi e pertanto è possibile eliminare un sinonimo in qualsiasi momento. Se si elimina un sinonimo, si corre tuttavia il rischio di lasciare riferimenti inesatti al sinonimo eliminato, che verranno trovati solo in fase di esecuzione.

Sinonimi e schemi

Se è disponibile uno schema predefinito di cui non si è proprietari e si desidera creare un sinonimo, è necessario qualificare il nome del sinonimo con il nome dello schema di cui si è proprietari. Se ad esempio si è proprietari di uno schema S1, ma lo schema predefinito è S2 e si usa l'istruzione CREATE SYNONYM, è necessario anteporre al nome del sinonimo lo schema S1, anziché assegnare al sinonimo un nome composto da una parte. Per altre informazioni sulla creazione dei sinonimi, vedere CREATE SYNONYM (Transact-SQL).

Concessione delle autorizzazioni per un sinonimo

Le autorizzazioni per un sinonimo possono essere concesse unicamente dai proprietari del sinonimo, membri di db_ownero di db_ddladmin .

È possibile usare GRANT, DENY e REVOKE per concedere, negare o revocare tutte o una qualsiasi delle autorizzazioni seguenti per un sinonimo:

CONTROL

EXECUTE

SELECT

UPDATE

DELETE

INSERT

TAKE OWNERSHIP

VIEW DEFINITION

Uso dei sinonimi

In diverse istruzioni SQL e contesti di espressione è possibile utilizzare sinonimi in sostituzione dell'oggetto di base a cui viene fatto riferimento. Le colonne seguenti contengono un elenco di queste istruzioni e contesti di espressione:

SELECT

UPDATE

EXECUTE

INSERT

DELETE

Sub-SELECT

Quando si utilizzano i sinonimi nei contesti citati, l'istruzione viene eseguita sull'oggetto di base. Ad esempio, se un sinonimo fa riferimento a un oggetto di base che è una tabella e si inserisce una riga nel sinonimo, la riga verrà inserita nella tabella referenziata.

Nota

Non è possibile fare riferimento a un sinonimo che si trova in un server collegato.

È possibile utilizzare un sinonimo come parametro per la funzione OBJECT_ID. Tuttavia, la funzione restituisce l'ID oggetto del sinonimo, anziché l'oggetto di base.

Non è possibile fare riferimento a un sinonimo in un'istruzione DDL. Ad esempio, le istruzioni seguenti, che fanno riferimento a un sinonimo denominato dbo.MyProduct, generano errori:

ALTER TABLE dbo.MyProduct  
   ADD NewFlag int null;  
EXEC ('ALTER TABLE dbo.MyProduct  
   ADD NewFlag int null');  

Le istruzioni di autorizzazione seguenti sono associate solo al sinonimo e non all'oggetto di base:

GRANT

REVOKE

DENY

I sinonimi non sono associati a uno schema, pertanto non è possibile farvi riferimento con i seguenti contesti di espressione associati a schema:

vincoli CHECK

Espressioni predefinite

Viste associate a schema

Colonne calcolate

Espressioni di regole

Funzioni associate a schema

Per altre informazioni sulle funzioni associate a schema, vedere Creare funzioni definite dall'utente (Motore di database).

Recupero di informazioni sui sinonimi

La vista del catalogo sys.synonyms contiene una voce per ogni sinonimo incluso in un database specifico. La vista del catalogo espone i metadati dei sinonimi, ad esempio il nome del sinonimo e il nome dell'oggetto di base. Per altre informazioni, vedere sys.synonyms (Transact-SQL).

Utilizzando proprietà estese, è possibile aggiungere istruzioni o descrizioni, maschere di input e regole di formattazione come proprietà di un sinonimo. Poiché la proprietà viene archiviata nel database, tutte le applicazioni che leggono la proprietà possono valutare l'oggetto nello stesso modo. Per altre informazioni, vedere sp_addextendedproperty (Transact-SQL).

Per trovare il tipo di base dell'oggetto di base di un sinonimo, utilizzare la funzione OBJECTPROPERTYEX. Per altre informazioni, vedere OBJECTPROPERTYEX (Transact-SQL).

Esempi

Nell'esempio seguente viene restituito il tipo di base dell'oggetto di base di un sinonimo che rappresenta un oggetto locale.

USE tempdb;  
GO
CREATE SCHEMA SynSchema
GO  
CREATE SYNONYM SynSchema.MyEmployee   
FOR AdventureWorks2022.HumanResources.Employee;  
GO  
SELECT OBJECTPROPERTYEX(OBJECT_ID('SynSchema.MyEmployee'), 'BaseType') AS BaseType;  

Nell'esempio seguente viene restituito il tipo di base dell'oggetto di base di un sinonimo che rappresenta un oggetto remoto in un server denominato Server1.

EXECUTE sp_addlinkedserver Server1;  
GO  
CREATE SYNONYM SynSchema.MyRemoteEmployee  
FOR Server1.AdventureWorks2022.HumanResources.Employee;  
GO  
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyRemoteEmployee'), 'BaseType') AS BaseType;  
GO  

Creare sinonimi
CREATE SYNONYM (Transact-SQL)
DROP SYNONYM (Transact-SQL)