Los sinónimos en SQL Server son objetos de base de datos que dan un nombre alternativo a los objetos de base de datos que existen localmente o en el servidor remoto. Además, proporcionan una capa de abstracción para proteger la aplicación de cualquier cambio en el objeto base.
En los scripts T-SQL, usamos nombres de 3 partes para hacer referencia a los objetos de la base de datos. El formato es:
[Base de datos].[Esquema].[Objeto]
Por ejemplo, supongamos que tenemos la siguiente infraestructura de base de datos:
- Nombre de la base de datos:[Azuredemodatabase]
- Esquema:[VentasLT]
- Objeto (nombre de la tabla):Producto
La instrucción SELECT con el nombre de 3 partes es la siguiente:
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM [Azuredemodatabase].[SalesLT].[Product]
De manera similar, un servidor remoto usa la convención de nomenclatura de 4 partes. La parte adicional es [nombre del servidor remoto]. Por lo tanto, el formato será
[Nombre del servidor].[Base de datos].[Esquema].[Objeto].
Imaginemos que necesita cambiar el nombre de [SalesLT].[Producto] tabla a [ProductData] .
Se hace referencia a esta tabla en varios procedimientos almacenados, funciones y vistas. Por lo tanto, debe modificar todas esas referencias en consultas o aplicaciones cliente para usar el último nombre de la tabla.
Puede crear un sinónimo que haga referencia al objeto de la base de datos y usarlo en sus consultas SQL. En caso de que ocurra algún cambio, solo necesita volver a crear la definición de Sinónimo. No necesitará cambiar ninguna referencia de objeto en las consultas porque estamos usando Synonym.
En un caso diferente, creamos un sinónimo que apunta a la tabla [Azuredemodatabase].[SalesLT].[Product]. Luego, soltamos la tabla y creamos una vista con un nombre similar. En este caso, un Sinónimo hará referencia automáticamente a la vista porque el enlace del objeto ocurre con el nombre del objeto.
Si mueve un objeto a una base de datos diferente, el sinónimo lo ayuda a minimizar los esfuerzos al realizar cambios. Una vez que vuelva a crear el Sinónimo, todas las consultas SQL obtendrán automáticamente la última ubicación del objeto.
También puede usar Sinónimos para ocultar los nombres de los objetos de la base de datos. Los usuarios pueden consultar Sinónimos para recuperar resultados en lugar de consultar la tabla base.
Podría definir un Sinónimo en SQL Server para los siguientes objetos:
- Tabla definida por el usuario
- Procedimiento almacenado
- Ver
- Funciones escalares y con valores de tabla en línea
- Tablas temporales locales y globales
- Procedimiento almacenado CLR, funciones (con valores de tabla, agregadas, escalares)
Nota:el nombre del sinónimo debe ser único en una base de datos.
Dónde usar sinónimos en SQL Server
Podemos usar sinónimos en la instrucción T-SQL, como Seleccionar, Actualizar, Ejecutar, Insertar, Eliminar y subconsultas.
Sin embargo, no podemos usar sinónimos en declaraciones de lenguaje de definición de datos (DDL) como Create y Alter. Además, los sinónimos no son adecuados para las restricciones de verificación, las columnas calculadas, las expresiones predeterminadas, las expresiones de reglas, las vistas vinculadas a esquemas y las funciones.
Crear un sinónimo en SQL Server en el servidor local
Para crear sinónimos en SQL Server, usamos la declaración CREATE SYNONYM. La sintaxis es la siguiente:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO
Por ejemplo, creemos el sinónimo [MyProductCatalog] para [Azuredemodatabase].[SalesLT].[Producto] .
CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]
Una vez creada, puede reemplazar el nombre de la tabla con el sinónimo como se muestra a continuación. Hace referencia internamente a la tabla base a la que hicimos referencia en la instrucción CREATE SYNONYM.
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM MyProductCatalog
Crear un sinónimo en una base de datos en el servidor remoto
Supongamos que el objeto existe en un servidor remoto [ABC]. Puede crear un sinónimo para evitar especificar un nombre de 4 partes en las consultas. En la siguiente consulta, el objeto base está en [MyRemoteServer]:
EXEC sp_addlinkedserver MyRemoteServer;
GO
USE tempdb;
GO
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO
Creación de un sinónimo con SQL Server Management Studio
Para crear sinónimos, podemos usar la GUI de SQL Server Management Studio.
- Conéctese a su instancia de SQL, expanda la base de datos y vaya a la carpeta Sinónimos.
- Haga clic derecho sobre él y seleccione Nuevo sinónimo.
- Ingrese los detalles requeridos para el nombre del sinónimo, el esquema del sinónimo, el nombre de la base de datos, el esquema del objeto, el tipo de objeto y el nombre.
En nuestro ejemplo, creamos un Sinónimo en el esquema [HumanResources], el mismo que en el esquema de la tabla:
Haga clic en Secuencia de comandos para obtener una secuencia de comandos T-SQL equivalente a la siguiente:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR
[AdventureWorks2017].[HumanResources].[Employee]
GO
Sinónimo de funciones definidas por el usuario
Primero, cree el UDF dbo.TestSynonym usando el siguiente script:
CREATE FUNCTION dbo.TestSynonyn (@ID int)
RETURNS int
AS
BEGIN
IF @ID < 0
BEGIN
SET @ID=100
END
RETURN(@ID);
END;
GO
Luego, cree un sinónimo con el nombre dbo.UDFTest . Puede llamar a la UDF usando el Sinónimo y recuperar los resultados de la consulta:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;
GO
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue
Actualizar declaración y sinónimo
Suponga que desea actualizar un valor en la tabla SQL. Si ha definido un sinónimo en él, también puede utilizarlo. Por ejemplo, la siguiente declaración de actualización usa Synonym [Perofmancetest] en lugar del nombre de la tabla SQL:
Update performancetest set [Name]='Updated New value' where ID=1
Dejar caer un sinónimo
Puede usar la declaración DROP SYNONYM para colocar un sinónimo específico en la base de datos. La siguiente consulta arroja [EmpData ] en AdventureWorks2017 base de datos:
Use AdventureWorks2017
Drop Synonym EmpData
Obtención de la lista de sinónimos de bases de datos en SQL Server
Suponga que desea conocer los sinónimos existentes en una base de datos junto con su objeto base. Puede consultar los sys.synonyms vista del catálogo del sistema en la base de datos respectiva:
SELECT
name,
base_object_name,
type
FROM
sys.synonyms
En el resultado de la consulta, obtiene la siguiente información:
- Nombre de sinónimo
- El objeto base (nombre de objeto de 3 o 4 partes)
- Tipo de objeto ( SN =Sinónimo)
¿Qué sucede si modificamos el objeto base del sinónimo?
Consideremos el impacto de modificar el objeto base de un sinónimo. Tenemos una consulta para realizar varias tareas:
- Cree un sinónimo (el nombre del sinónimo es [dbo].[EmpData] para el objeto base [AdventureWorks2017].[DBO].[Emp] )
- Soltar el objeto base (tabla) [AdventureWorks2017].[DBO].[Emp]
- Cree una vista con el nombre [DBO].[Emp] en la base de datos [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
Como se mencionó anteriormente, el Sinónimo enlaza un objeto usando su nombre. Por lo tanto, debe señalar a la vista en lugar de a la tabla. En este caso, la tabla [dbo].[Emp] no existe.
Como se muestra a continuación, es una vista en [AdventureWorks2017] base de datos.
Alternativamente, puede usar OBJECTPROPERTYEX() para comprobar el tipo base de objeto del sinónimo:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;
GO
Aquí, el tipo Base hace referencia a la vista de la base de datos. En el caso de la tabla SQL, obtienes U en la salida.
¿Los sinónimos afectan negativamente el rendimiento de las consultas?
Muchos profesionales de bases de datos prefieren no usar sinónimos en SQL Server. Su punto es que SQL Server tiene que realizar un paso adicional para resolver la tabla base del Sinónimo. Por lo tanto, podría producir un efecto negativo.
Probemos el rendimiento de la consulta. Recuperamos registros del nombre de la tabla y el Sinónimo:
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
Primero, verifiquemos el plan de ejecución real. Ambos lotes de consultas tienen el mismo plan de ejecución y costos de operador:
De manera similar, ambas consultas tienen 41 lecturas lógicas y un conteo de escaneo para recuperar el resultado deseado.
SQL Server resuelve los nombres de objetos base de sinónimos en la fase de enlace de la ejecución de la consulta. Esto sucede antes de la fase de optimización de consultas. Por lo tanto, verá un plan de ejecución similar y ningún impacto en el rendimiento. En consecuencia, puede utilizar sinónimos para evitar nombres largos de 3 o 4 partes para objetos a los que se accede con frecuencia. No afecta el rendimiento de las consultas.
No significa que cree un sinónimo para cada objeto, como una tabla, un procedimiento almacenado, funciones, vistas. Puede usarlos para los objetos a los que se accede con más frecuencia para hacer referencia a ellos rápidamente en las consultas.
Conclusión
Los sinónimos en SQL Server pueden ser beneficiosos. Simplifican los nombres de los objetos de la base de datos al evitar los nombres largos de 3 o 4 partes. Puede usarlos para hacer referencia a objetos locales y remotos. No produce ningún problema de rendimiento. Por lo tanto, puede explorar su uso para obtener flexibilidad al escribir consultas. Sin embargo, lo mejor de todo es definir sinónimos solo para los objetos de uso frecuente en los scripts SQL.