Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

7 fatti sui sinonimi di SQL Server che dovresti conoscere

Prima della comparsa dei sinonimi di SQL Server, tutti desideravano semplificare e migliorare la propria esperienza di database.

Immagina di avere un'applicazione con un database che fa riferimento a un altro database dello stesso server. Quindi, un'importante riorganizzazione costringe il tuo team a trasferire l'altro database su un altro server.

Non c'è dubbio che la tua applicazione si romperà. Ma cosa farai in quel caso? Collega i 2 server e codifica tutti i riferimenti (di nuovo) per puntare al nuovo server?

Puoi farlo se vuoi e dimenticare se hai solo pochi o una dozzina di riferimenti ad esso. Ma se si verifica un altro trasferimento o una ridenominazione, dovrai ripetere lo stesso incubo.

Tuttavia, c'è un modo migliore per affrontare questo problema.

Introduzione ai sinonimi di SQL Server

Prima di approfondire cosa puoi fare con i sinonimi di SQL Server, descriviamo cosa sono.

Un sinonimo in qualsiasi lingua parlata e scritta si riferisce a una parola o frase che ha lo stesso significato di un'altra parola o frase. Quindi, la parola splendido è sinonimo di bello e attraente .

Analogamente a quanto sappiamo sui sinonimi di parole e frasi, i sinonimi di SQL Server si riferiscono a un nome alternativo di un oggetto di database che risiede in un server locale o remoto. Leggi di più qui.

Come vedrai nei seguenti fatti, i sinonimi di SQL Server possono semplificare notevolmente la manutenzione della tua applicazione.

Allora, cominciamo!

1. I sinonimi di SQL Server possono semplificare il tuo lavoro quando gli oggetti di base vengono trasferiti o rinominati

In primo luogo, ti salveranno dal problema delle modifiche al codice quando un database viene spostato su un altro server o rinominato per qualsiasi motivo. Facciamo riferimento allo scenario di cui abbiamo parlato in questa apertura del post.

Un'importante riorganizzazione costringe il tuo team a modificare un riferimento a tutti gli oggetti in mydatabase2 in prodserver2.mydatabase2.

Quindi, esegui una query su sys.sql_modules con tutte le occorrenze di mydatabase2 da miodatabase1 .

USE mydatabase1
GO
SELECT
 b.name
,a.definition
,b.type_desc
FROM sys.sql_modules a
INNER JOIN sys.all_objects b on a.object_id = b.object_id
WHERE a.definition like '%mydatabase2%'
GO

Ora, l'output dello script sopra elencherà tutti gli oggetti che hanno riferimenti a mydatabase2 . Bello, eh? E questo aiuterà a definire l'ambito del lavoro che deve essere svolto.

Ma questo è solo l'inizio. Devi anche verificare se è presente codice nell'app client o qualsiasi altro codice che faccia riferimento allo stesso al di fuori del tuo database.

La quantità di codice interessata mostra quanto è grande il tuo nuovo problema.

Ora, ecco alcune altre curiosità su cosa sta succedendo in quello script:

  • sys.sql_modules includere oggetti SQL che sono moduli definiti da SQL come viste, procedure memorizzate, funzioni, ecc.
  • Il nome colonna è dove si trova il nome dell'oggetto.
  • Il codice SQL per l'oggetto è nella definizione colonna di sys.sql_modules .
  • sys.all_objects includi tutti gli oggetti nel tuo database come tabelle, viste, ecc.
  • Abbiamo preso il type_desc colonna per determinare di che tipo di oggetto si tratta (vista, procedura memorizzata, ecc.)
  • Il dove La clausola filtra la query per qualsiasi codice SQL che includa un riferimento a mydatabase2 .
  • Per avere un risultato soddisfacente usando lo script sopra, devi avere l'autorizzazione per tutti gli oggetti. Verificare con l'amministratore del database o qualcuno con un ruolo simile per questo. Puoi anche dare un'occhiata.

Ora che sai come ottenere lo scopo del tuo lavoro, è tempo di risolverlo.

Come risolvere questo pasticcio di codice in modo che non si ripeta

Va bene. Ho una confessione da fare.

L'uso dei sinonimi di SQL Server ridurrà al minimo i tuoi problemi, ma non li eliminerà.

Ora che è fuori mano, ecco la buona notizia:se hai 10 riferimenti a un oggetto remoto prima di usare i sinonimi, ne modifichi tutti e 10. Ma una volta che inizi a usare un sinonimo per quell'oggetto remoto, invece di modificare 10 occorrenze, cambi solo 1. Niente di più.

Ora, ecco i passaggi per risolvere questo problema utilizzando i sinonimi:

  1. Crea un sinonimo per ciascuno degli oggetti remoti. Quindi, invece di prodserver2.mydatabase2.schema1.object1 puoi farvi riferimento usando il sinonimo.
  2. Modifica i riferimenti a ciascun oggetto nel suo sinonimo.

Più avanti, scoprirai i dettagli su come farlo.

Il cibo da asporto:

I sinonimi forniscono un livello di astrazione per proteggere i riferimenti agli oggetti di base da qualsiasi parte del codice, all'interno del database, dell'app client o in qualsiasi altro luogo. Quindi, puoi gioire quando si verifica un altro cambiamento, che si tratti di un trasferimento di oggetti o di una ridenominazione.

2. Puoi creare sinonimi di SQL Server per la maggior parte degli oggetti

Quindi, scopriamo quali oggetti possono avere sinonimi?

  • Tabelle
  • Viste
  • Procedure archiviate
  • Funzioni

Ora che conosci i tipi di oggetto, potresti avere un'idea di cosa puoi fare con i sinonimi. Entriamo più nello specifico.

3. Puoi emettere comandi appropriati per il sinonimo di oggetto

Terzo, ecco alcuni comandi specifici per ogni tipo di oggetto.

Tabelle

Per quanto tu possa fare SELECT, INSERT, UPDATE ed DELETE su una tabella, puoi fare lo stesso con il suo sinonimo.

Quindi, invece di:

SELECT * FROM prodserver2.mydatabase2.schema1.table1

Puoi avere una versione più breve che sarà resistente alla prossima modifica:

SELECT * FROM synonym1

Poiché questo è il caso, puoi anche farlo:

UPDATE synonym1
SET column1 = <value>

E lo stesso vale per INSERT e DELETE.

Tuttavia, tieni presente quanto segue:

  • L'inserimento di un nuovo record tramite un sinonimo aggiungerà un nuovo record alla tabella di base. Nel nostro caso, prodserver2.mydatabase2.schema1.table1 .
  • L'aggiornamento e l'eliminazione avranno lo stesso effetto.

Finora abbiamo mostrato solo i comandi DML. Che ne dici di comandi DDL come DROP?

Sfortunatamente, non puoi eseguirli. Ecco il motivo:

L'eliminazione di un sinonimo non eliminerà la tabella di base. Lascerà cadere il sinonimo. Entrerò nel dettaglio di questo in un momento.

Ma ecco un'altra cosa che puoi fare per SQL Server Sinonimi di tabelle:JOIN.

Quanto può essere conveniente? Invece di emettere questo:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN prodserver2.mydatabase2.schema1.table1 b on a.id = b.id

Puoi eseguire questo:

SELECT
 a.column1
,b.column1
FROM table3 a
INNER JOIN synonym1 b on a.id = b.id

È più semplice? Certo!

Procedure archiviate

Un comando rilevante che puoi eseguire con un sinonimo di una procedura memorizzata è EXEC.

Quindi, invece di invocare una procedura remota come questa:

EXEC prodserver2.mydatabase2.schema1.spProcedure1

È possibile creare un sinonimo per la procedura sopra. Chiamiamola synProcedure1 . E invocalo in questo modo:

EXEC synProcedure1

Continuiamo? Puoi fare più o meno lo stesso con le VISUALIZZAZIONI e le FUNZIONI. Naturalmente, se si dispone dei permessi richiesti. Ma prima, discutiamo di come creare sinonimi di SQL Server.

4. Puoi iniziare la tua ricerca con i sinonimi di SQL Server con CREATE

Abbiamo raggiunto il punto in cui puoi creare sinonimi. Ecco come possiamo farlo usando T-SQL per una tabella:

CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1

Ma prendi nota di questo avvertimento:

Verifica dell'esistenza e dell'autorizzazione per mydatabase2.schema1.table1 in prodserver2 è posticipato fino al runtime.

Ciò significa che non saprai se:

  • i 2 server (prodserver1 e prodserver2 ) sono già collegati.
  • il database mydatabase2 , lo schema schema1 e la tabella tabella1 effettivamente esistono.
  • Il tuo accesso a tali risorse è consentito.

Quindi, dopo aver creato il sinonimo, testalo eseguendo i comandi che prevedi funzionino.

E con stored procedure, viste e funzioni, dovresti agire allo stesso modo.

Ma non è tutto. Se possiamo creare un sinonimo, possiamo anche eliminarlo utilizzando:

DROP SYNONYM synonym1

Ed ecco un altro avvertimento:poiché puoi eliminare i sinonimi in qualsiasi momento, i riferimenti ai sinonimi eliminati verranno controllati solo in fase di esecuzione.

Quindi, prima di eliminare un sinonimo, controlla sys.sql_modules per se ci sono riferimenti ad esso.

Utilizzo di SQL Server Management Studio (SSMS) per creare ed eliminare sinonimi

Finora, abbiamo utilizzato T-SQL per creare ed eliminare i sinonimi di SQL Server. Potresti preferire utilizzare un'interfaccia grafica quando fai lo stesso.

Facciamo girare la palla.

Creazione di sinonimi

Se digitare i comandi non fa per te, ecco i passaggi da seguire quando si tratta di creare sinonimi:

  1. Esegui SSMS e accedi al tuo SQL Server.
  2. Cerca il database in cui desideri creare un sinonimo.
  3. Espandilo.
  4. Fai clic con il pulsante destro del mouse sui Sinonimi cartella e seleziona Nuovo sinonimo .
  5. Compila il modulo con le informazioni richieste per i sinonimi, incluso il nome, lo schema, ecc.
  6. Fai clic su OK .

Di seguito è riportato uno screenshot del modulo in SSMS:

Eliminazione dei sinonimi

A proposito di preferenze, digitare i comandi per creare sinonimi è il mio genere di cose. Ma rilasciarli a piacimento è più semplice che digitare i comandi. Certo, è solo il mio gusto. Ad ogni modo, di seguito sono riportati i passaggi da seguire quando si elimina un sinonimo:

  1. Esegui SSMS e accedi al tuo SQL Server.
  2. Cerca il database in cui risiede il sinonimo che desideri eliminare.
  3. Espandilo.
  4. Espandi i sinonimi cartella.
  5. Cerca il sinonimo che desideri eliminare.
  6. Fai clic con il pulsante destro del mouse sul sinonimo che desideri eliminare e seleziona Elimina .
  7. Fai clic su OK .

Per riassumere i passaggi precedenti, fai semplicemente clic con il pulsante destro del mouse sul sinonimo da eliminare, quindi seleziona Elimina e infine, fai clic su OK .

Di seguito è riportato uno screenshot della finestra che apparirà prima di confermare l'eliminazione:

5. È possibile proteggere i sinonimi di SQL Server

Utilizzando GRANT, DENY o REVOKE, puoi controllare l'accesso a un sinonimo.

CONCEDERE un'autorizzazione SELECT al sinonimo sinonimo1 a un utente denominato testuser , fai come segue:

GRANT SELECT ON synonym1 to testuser

Altre autorizzazioni che puoi aggiungere o rimuovere da un sinonimo sono le seguenti:

  • CONTROLLO
  • ESEGUI
  • AGGIORNAMENTO
  • INSERIRE
  • ELIMINA
  • VISUALIZZA DEFINIZIONE
  • PRENDI LA PROPRIETÀ

6. Non riesci a trovare quella tabella, vista o procedura? Potrebbe essere un sinonimo

Uno dei problemi che potrebbe incontrare un nuovo arrivato nella tua squadra è una tabella, una vista, una procedura o una funzione "mancanti". Naturalmente, se SELECT viene emesso su un oggetto, potrebbe essere una tabella o una vista. Ma non riesce a trovarlo nell'elenco delle tabelle o nell'elenco delle visualizzazioni. E se non ha utilizzato prima i sinonimi di SQL Server, questo è un problema aggiuntivo.

La mancanza di orientamento, una lacuna nella documentazione o una lacuna negli standard possono essere messi in ordine. Ecco uno script elegante che ti aiuterà a presentare l'elenco dei sinonimi e il relativo oggetto di base al tuo nuovo membro del team:

SELECT
 a.[name]
,a.[base_object_name]
,OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType') as BaseType
,b.type_desc
FROM sys.synonyms a
INNER JOIN (SELECT DISTINCT type, type_desc from sys.all_objects) b on 
           CONVERT(varchar(2),OBJECTPROPERTYEX(OBJECT_ID(a.[name]), 'BaseType')) = b.type

Un oggetto “mancante”? Non più se è sinonimo.

Ma prima di divertirti a eseguire questo script, ecco alcune altre cose che dovresti prendere in considerazione:

  • sys.synonyms è dove tutti i sinonimi di SQL Server sono definiti nel database corrente.
  • Abbiamo preso i tipi e le descrizioni dei tipi (tipo e type_desc rispettivamente) in sys.all_objects . Se hai un'idea migliore oltre a unirti a loro con una sottoquery, faccelo sapere.
  • OBJECTPROPERTYEX viene utilizzato per ottenere il tipo dell'oggetto di base se è una tabella, una procedura memorizzata o altro.
  • Infine, se non hai l'autorizzazione minima richiesta per eseguire questo script e ottenere l'output desiderato, è ora di fare amicizia con il tuo DBA o qualcuno con un ruolo simile :)

Ma ti starai chiedendo, perché fare tutto questo se non funzionerà bene?

7. I sinonimi di SQL Server influiranno sulle prestazioni?

Questa è una preoccupazione comune. E per approfondire cosa sta succedendo dietro le quinte, diamo un'occhiata al riepilogo di ciò che accadrà nel piano di esecuzione:

  1. Quando si esegue il codice più semplice con un sinonimo (ad es. SELECT * da sinonimo1), SQL Server entrerà in una fase di associazione in cui l'oggetto di base sostituirà il sinonimo.
  2. In seguito, qualunque sia il miglior piano di ottimizzazione disponibile per eseguire un comando sull'oggetto base, sarà lo stesso.

Ecco alcune domande e risposte relative alle 2 affermazioni di cui sopra:

  1. Per quanto tempo SQL Server esegue la fase di associazione? RISPOSTA:Non ci vuole molto. Di solito accade in un batter d'occhio.
  2. Se il passaggio successivo utilizza lo stesso miglior piano di ottimizzazione con l'oggetto base e la query all'oggetto base è "abbastanza veloce", sarà più lenta? RISPOSTA:No, perché utilizzerà lo stesso piano di esecuzione.
  3. Che ne dici dell'autenticazione dal nuovo server? RISPOSTA:Se si verificano dei lievi ritardi causati dal trasferimento di un database su un nuovo server, non sono causati dal sinonimo. Eseguire query sulle prestazioni della chiamata utilizzando un sinonimo o l'hardcoding di server.database.schema.object dovrebbe essere lo stesso perché il sinonimo è solo un nome alternativo per l'oggetto di base. Risolvi il rallentamento delle prestazioni dell'oggetto base.

Ma non credermi sulla parola. Dovresti verificarlo personalmente con il tuo piano di esecuzione delle query e le prestazioni effettive.

Conclusione

Tutto sommato, abbiamo trattato praticamente molte informazioni sui sinonimi di SQL Server, quindi ricapitoliamo.

In primo luogo, un sinonimo è semplicemente un nome alternativo che ti salverà dalle modifiche e dai trasferimenti del nome dell'oggetto. In secondo luogo, buoni candidati per i sinonimi sono tabelle, viste, stored procedure e funzioni. Successivamente, puoi eseguire comandi appropriati al suo oggetto di base da un sinonimo. Puoi proteggerlo anche tu. Quindi, se hai bisogno di vedere l'elenco dei sinonimi, hai sys.synonyms per aiutarti. Infine, le prestazioni non dovrebbero essere un grosso problema se non ci sono problemi di prestazioni con l'oggetto di base.

Allora perché non provarlo oggi?

Cosa ne pensi? Fatecelo sapere nei commenti.