Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Introduction aux synonymes dans SQL Server

Les synonymes dans SQL Server sont des objets de base de données qui donnent un autre nom aux objets de base de données existant localement ou sur le serveur distant. En outre, ils fournissent une couche d'abstraction pour protéger l'application de toute modification de l'objet de base.

Dans les scripts T-SQL, nous utilisons des noms en 3 parties pour référencer les objets de base de données. Le format est :

[Base de données].[Schéma].[Objet]

Par exemple, supposons que nous ayons l'infrastructure de base de données suivante :

  • Nom de la base de données :[Azuredemodatabase]
  • Schéma :[SalesLT]
  • Objet (nom de la table) : Produit

L'instruction SELECT avec le nom en 3 parties est la suivante :

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

De même, un serveur distant utilise la convention de dénomination en 4 parties. La partie supplémentaire est [nom du serveur distant]. Par conséquent, le format sera

[Nom du serveur].[Base de données].[Schéma].[Objet].

Imaginons que vous deviez renommer le [SalesLT].[Product] table vers [ProductData] .

Cette table est référencée dans plusieurs procédures stockées, fonctions et vues. Par conséquent, vous devez modifier toutes ces références dans les requêtes ou les applications clientes pour utiliser le dernier nom de la table.

Vous pouvez créer un synonyme référençant l'objet de base de données et l'utiliser dans vos requêtes SQL. En cas de modification, il vous suffit de recréer la définition de synonyme. Vous n'aurez pas besoin de modifier les références d'objet dans les requêtes car nous utilisons Synonym.

Dans un cas différent, nous créons un synonyme qui pointe vers la table [Azuredemodatabase].[SalesLT].[Product]. Ensuite, nous supprimons la table et créons une vue avec un nom similaire. Dans ce cas, un synonyme référencera automatiquement la vue car la liaison d'objet se produit avec le nom de l'objet.

Si vous déplacez un objet vers une autre base de données, le Synonyme vous aide à minimiser les efforts lors des modifications. Une fois que vous avez recréé le synonyme, toutes les requêtes SQL obtiennent automatiquement le dernier emplacement d'objet.

Vous pouvez également utiliser des synonymes pour masquer les noms des objets de la base de données. Les utilisateurs peuvent interroger les synonymes pour récupérer les résultats au lieu d'interroger la table de base.

Vous pouvez définir un synonyme dans SQL Server pour les objets suivants :

  • Tableau défini par l'utilisateur
  • Procédure stockée
  • Afficher
  • Fonctions table scalaires et inline
  • Tables temporaires locales et globales
  • Procédure stockée CLR, fonctions (table, agrégée, scalaire)

Remarque :Le nom du synonyme doit être unique dans une base de données.

Où utiliser les synonymes dans SQL Server

Nous pouvons utiliser des synonymes dans l'instruction T-SQL, tels que Select, Update, Execute, Insert, Delete et des sous-requêtes.

Cependant, nous ne pouvons pas utiliser les synonymes dans les instructions en langage de définition de données (DDL) telles que Create et Alter. De plus, les synonymes ne conviennent pas aux contraintes de vérification, aux colonnes calculées, aux expressions par défaut, aux expressions de règle, aux vues liées au schéma et aux fonctions.

Créer un synonyme dans SQL Server sur le serveur local

Pour créer des synonymes dans SQL Server, nous utilisons l'instruction CREATE SYNONYM. La syntaxe est la suivante :

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

Par exemple, créons le synonyme [MyProductCatalog] pour [Azuredemodatabase].[SalesLT].[Produit] .

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

Une fois créé, vous pouvez remplacer le nom de la table par le synonyme comme indiqué ci-dessous. Il fait référence en interne à la table de base que nous avons référencée dans l'instruction CREATE SYNONYM.

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

Créer un synonyme dans une base de données sur le serveur distant

Supposons que l'objet existe dans un serveur distant [ABC]. Vous pouvez créer un synonyme pour éviter de spécifier un nom en 4 parties dans les requêtes. Dans la requête ci-dessous, l'objet de base se trouve dans [MyRemoteServer] :

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

Création d'un synonyme avec SQL Server Management Studio

Pour créer des synonymes, nous pouvons utiliser l'interface graphique de SQL Server Management Studio.

  • Connectez-vous à votre instance SQL, développez la base de données et accédez au dossier Synonymes.
  • Cliquez dessus avec le bouton droit de la souris et choisissez Nouveau synonyme.
  • Entrez les détails requis pour le nom du synonyme, le schéma du synonyme, le nom de la base de données, le schéma de l'objet, le type d'objet et le nom.

Dans notre exemple, nous créons un Synonyme dans le schéma [HumanResources], le même que pour le schéma de la table :

Cliquez sur Script pour obtenir un script T-SQL équivalent comme ci-dessous :

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

Synonyme de fonctions définies par l'utilisateur

Tout d'abord, créez le UDF dbo.TestSynonym en utilisant le script ci-dessous :

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

Ensuite, créez un synonyme avec le nom dbo.UDFTest . Vous pouvez appeler la FDU à l'aide du Synonyme et récupérer les résultats de la requête :

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

Mettre à jour la déclaration et le synonyme

Supposons que vous souhaitiez mettre à jour une valeur dans la table SQL. Si vous avez défini un synonyme dessus, vous pouvez également l'utiliser. Par exemple, la déclaration de mise à jour ci-dessous utilise Synonyme [Perofmancetest] à la place du nom de la table SQL :

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

Supprimer un synonyme

Vous pouvez utiliser l'instruction DROP SYNONYM pour supprimer un synonyme spécifique dans la base de données. La requête ci-dessous supprime [EmpData ] dans AdventureWorks2017 base de données :

Use AdventureWorks2017
Drop Synonym EmpData

Obtenir la liste des synonymes de base de données dans SQL Server

Supposons que vous souhaitiez connaître les synonymes existants dans une base de données avec leur objet de base. Vous pouvez interroger les sys.synonyms vue du catalogue système dans la base de données respective :

SELECT 
    name, 
    base_object_name, 
    type
FROM 
    sys.synonyms

Dans le résultat de la requête, vous obtenez les informations suivantes :

  • Nom de synonyme
  • L'objet de base (nom d'objet en 3 ou 4 parties)
  • Type d'objet ( SN =Synonyme)

Et si nous modifions l'objet de base du synonyme ?

Considérons l'impact de la modification de l'objet de base d'un synonyme. Nous avons une requête pour effectuer plusieurs tâches :

  • Créez un synonyme (le nom du synonyme est [dbo].[EmpData] pour l'objet de base [AdventureWorks2017].[DBO].[Emp] )
  • Déposez l'objet de base (table) [AdventureWorks2017].[DBO].[Emp]
  • Créez une vue avec le nom [DBO].[Emp] dans la base de données [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

Comme mentionné précédemment, le synonyme lie un objet à l'aide de son nom. Ainsi, il devrait indiquer la vue au lieu de la table. Dans ce cas, la table [dbo].[Emp] n'existe pas.

Comme indiqué ci-dessous, il s'agit d'une vue dans [AdventureWorks2017] base de données.

Alternativement, vous pouvez utiliser OBJECTPROPERTYEX() pour vérifier le type de base d'objet du synonyme :

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

Ici, le type Base fait référence à la vue de la base de données. Dans le cas de la table SQL, vous obtenez U dans la sortie.

Les synonymes ont-ils un impact négatif sur les performances des requêtes ?

De nombreux professionnels des bases de données préfèrent ne pas utiliser de synonymes dans SQL Server. Leur point est que SQL Server doit effectuer une étape supplémentaire dans la résolution de la table de base à partir du synonyme. Ainsi, cela pourrait produire un effet négatif.

Testons les performances de la requête. Nous récupérons les enregistrements à partir du nom de la table et du Synonyme :

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

Tout d'abord, vérifions le plan d'exécution réel. Les deux lots de requêtes ont le même plan d'exécution et les mêmes coûts d'opérateur :

De même, les deux requêtes ont 41 lectures logiques et un nombre d'analyses pour récupérer la sortie souhaitée.

SQL Server résout les noms d'objets de base synonymes dans la phase de liaison de l'exécution de la requête. Cela se produit avant la phase d'optimisation de la requête. Par conséquent, vous voyez un plan d'exécution similaire et aucun impact sur les performances. Par conséquent, vous pouvez utiliser des synonymes pour éviter les noms longs en 3 ou 4 parties pour les objets fréquemment consultés. Cela n'affecte pas les performances des requêtes.

Cela ne signifie pas que vous créez un synonyme pour chaque objet tel qu'une table, une procédure stockée, des fonctions, des vues. Vous pouvez les utiliser pour les objets les plus fréquemment consultés afin de les référencer rapidement dans les requêtes.

Conclusion

Les synonymes dans SQL Server peuvent être bénéfiques. Ils simplifient les noms d'objets de la base de données en évitant les noms longs en 3 ou 4 parties. Vous pouvez les utiliser pour référencer des objets locaux et distants. Il ne produit aucun problème de performances. Par conséquent, vous pouvez explorer leur utilisation pour plus de flexibilité dans l'écriture des requêtes. Cependant, le mieux est de définir des synonymes uniquement pour les objets fréquemment utilisés dans les scripts SQL.