sql >> Base de Datos >  >> RDS >> Sqlserver

7 datos sobre los sinónimos de SQL Server que debe conocer

Antes de que aparecieran los sinónimos de SQL Server, todos deseaban simplificar y mejorar su experiencia con la base de datos.

Imagine que tiene una aplicación con una base de datos que hace referencia a otra base de datos del mismo servidor. Luego, una importante reorganización obliga a su equipo a transferir la otra base de datos a otro servidor.

No hay duda de que su aplicación se romperá. Pero, ¿qué harás en ese caso? ¿Vincular los 2 servidores y codificar todas las referencias (nuevamente) para apuntar al nuevo servidor?

Puede hacerlo si lo desea y olvidar si tiene solo unas pocas o una docena de referencias. Pero si ocurre otra transferencia o cambio de nombre, tendrás que repetir la misma pesadilla.

No obstante, hay una mejor manera de lidiar con esto.

Presentamos los sinónimos de SQL Server

Antes de profundizar en lo que puede hacer con los sinónimos de SQL Server, describamos qué son.

Un sinónimo en cualquier idioma hablado y escrito se refiere a una palabra o frase que tiene el mismo significado que otra palabra o frase. Entonces, la palabra hermosa es el sinónimo de hermoso y atractivo .

Similar a lo que sabemos sobre sinónimos de palabras y frases, los sinónimos de SQL Server se refieren a un nombre alternativo de un objeto de base de datos que reside en un servidor local o remoto. Lea más aquí.

Como verá en los siguientes hechos, SQL Server Synonyms puede facilitar mucho el mantenimiento de su aplicación.

Entonces, ¡comencemos!

1. Los sinónimos de SQL Server pueden simplificar su trabajo cuando los objetos base se transfieren o cambian de nombre

En primer lugar, le ahorrarán el problema de los cambios de código cuando una base de datos se mueve a otro servidor o se cambia de nombre por cualquier motivo. Vamos a referirnos al escenario que mencionamos en la apertura de esta publicación.

Una reorganización importante obliga a su equipo a cambiar una referencia a todos los objetos en mydatabase2 en prodserver2.mydatabase2.

Entonces, consulta sys.sql_modules con todas las apariciones de mydatabase2 de mibase1 .

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

Ahora, el resultado de la secuencia de comandos anterior enumerará todos los objetos que tengan referencias a mydatabase2 . Bonito, ¿eh? Y esto ayudará a definir el alcance del trabajo que se debe realizar.

Pero eso es solo el comienzo. También debe verificar si hay código en su aplicación de cliente o cualquier otro código que haga referencia al mismo fuera de su base de datos.

La cantidad de código afectado muestra qué tan grande es su nuevo problema.

Ahora, aquí hay algunos datos más sobre lo que está pasando en ese script:

  • sys.sql_modules incluir objetos SQL que son módulos definidos por SQL como vistas, procedimientos almacenados, funciones, etc.
  • El nombre columna es donde está el nombre del objeto.
  • El código SQL para el objeto está en la definición columna de sys.sql_modules .
  • sys.todos_los_objetos incluya todos los objetos en su base de datos como tablas, vistas, etc.
  • Tomamos el type_desc columna para determinar qué tipo de objeto es (vista, procedimiento almacenado, etc.)
  • El dónde La cláusula filtra la consulta para cualquier código SQL que incluya una referencia a mydatabase2 .
  • Para obtener un resultado satisfactorio con la secuencia de comandos anterior, debe tener permiso para todos los objetos. Consulte con su administrador de base de datos o alguien con un rol similar para esto. También puede consultar esto.

Ahora que sabe cómo obtener el alcance de su trabajo, es hora de arreglarlo.

Cómo arreglar este lío de código para que no vuelva a suceder

Bien. Tengo una confesión que hacer.

El uso de sinónimos de SQL Server solo reducirá sus problemas al mínimo, pero no los eliminará.

Ahora que está fuera del camino, estas son las buenas noticias:si tiene 10 referencias a un objeto remoto antes de usar sinónimos, modifica los 10. Pero una vez que comienza a usar un sinónimo para ese objeto remoto, en lugar de modificar 10 ocurrencias, solo cambias 1. Nada más.

Ahora, estos son los pasos para arreglar esto usando sinónimos:

  1. Cree un sinónimo para cada uno de los objetos remotos. Entonces, en lugar de prodserver2.mydatabase2.schema1.object1 puede referirse a él usando el sinónimo.
  2. Modifique las referencias a cada objeto en su sinónimo.

Más adelante, descubrirá los detalles de cómo hacerlo.

La comida para llevar:

Los sinónimos brindan una capa de abstracción para proteger las referencias a los objetos base de cualquier parte de su código, ya sea dentro de su base de datos, aplicación cliente o en cualquier otro lugar. Por lo tanto, puede alegrarse cuando se produzca otro cambio, ya sea una transferencia de objeto o un cambio de nombre.

2. Puede crear sinónimos de SQL Server para la mayoría de los objetos

A continuación, averigüemos qué objetos pueden tener sinónimos.

  • Mesas
  • Vistas
  • Procedimientos almacenados
  • Funciones

Ahora que conoce los tipos de objetos, puede tener una idea de lo que puede hacer con los sinónimos. Seamos más específicos.

3. Puede emitir comandos apropiados para el objeto Sinónimo

En tercer lugar, aquí hay algunos comandos específicos para cada tipo de objeto.

Mesas

Tanto como puede hacer SELECCIONAR, INSERTAR, ACTUALIZAR y ELIMINAR en una tabla, puede hacer lo mismo con su sinónimo.

Entonces, en lugar de:

SELECT * FROM prodserver2.mydatabase2.schema1.table1

Puedes tener una versión más corta que será resistente al próximo cambio:

SELECT * FROM synonym1

Dado que este es el caso, también puede hacer esto:

UPDATE synonym1
SET column1 = <value>

Y lo mismo ocurre con INSERTAR y ELIMINAR.

Sin embargo, tenga en cuenta lo siguiente:

  • Insertar un nuevo registro a través de un sinónimo agregará un nuevo registro a la tabla base. En nuestro caso, prodserver2.mydatabase2.schema1.table1 .
  • La actualización y la eliminación tendrán el mismo efecto.

Hasta ahora, solo hemos mostrado comandos DML. ¿Qué hay de los comandos DDL como DROP?

Desafortunadamente, no puedes realizarlos. Esta es la razón por la cual:

Descartar un sinónimo no eliminará la tabla base. Dejará caer el sinónimo. Entraré en detalles sobre esto en un momento.

Pero aquí hay una cosa más que puede hacer con los sinónimos de tablas de SQL Server:JOINs.

¿Qué tan conveniente puede ser esto? En lugar de emitir esto:

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

Puede realizar esto:

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

¿Es eso más simple? ¡Claro que sí!

Procedimientos almacenados

Un comando relevante que puede hacer con un sinónimo de un procedimiento almacenado es EXEC.

Entonces, en lugar de invocar un procedimiento remoto como este:

EXEC prodserver2.mydatabase2.schema1.spProcedure1

Puede crear un sinónimo para el procedimiento anterior. Llamémoslo synProcedure1 . E invócalo de esta manera:

EXEC synProcedure1

¿Deberíamos continuar? Puede hacer lo mismo con VIEWs y FUNCTIONs. Por supuesto, si tiene los permisos requeridos. Pero primero, analicemos cómo crear sinónimos de SQL Server.

4. Puede comenzar su búsqueda con sinónimos de SQL Server con CREATE

Hemos llegado al punto de cómo puedes crear sinónimos. Así es como podemos hacerlo usando T-SQL para una tabla:

CREATE SYNONYM synonym1 FOR prodserver2.mydatabase2.schema1.table1

Pero toma nota de esta advertencia:

Comprobando la existencia y el permiso para mydatabase2.schema1.table1 en prodserver2 se aplaza hasta el tiempo de ejecución.

Eso significa que no sabrá si:

  • los 2 servidores (prodserver1 y prodserver2 ) ya están vinculados.
  • la base de datos mydatabase2 , el esquema esquema1 y la tabla table1 existen realmente.
  • su acceso a esos recursos está permitido.

Entonces, después de crear el sinónimo, pruébelo ejecutando los comandos que espera que funcionen.

Y con los procedimientos, vistas y funciones almacenados, debe actuar de la misma manera.

Pero eso no es todo. Si podemos crear un sinónimo, también podemos eliminarlo usando:

DROP SYNONYM synonym1

Y aquí hay otra advertencia:dado que puede eliminar sinónimos en cualquier momento, las referencias a los sinónimos eliminados solo se verificarán en tiempo de ejecución.

Entonces, antes de colocar un sinónimo, verifique sys.sql_modules por si hay alguna referencia al mismo.

Uso de SQL Server Management Studio (SSMS) para crear y eliminar sinónimos

Hasta ahora, hemos usado T-SQL para crear y eliminar sinónimos de SQL Server. Es posible que prefiera usar una interfaz gráfica cuando haga lo mismo.

Hagamos rodar la pelota.

Creación de sinónimos

Si escribir los comandos no es lo tuyo, estos son los pasos a seguir cuando se trata de crear sinónimos:

  1. Ejecute SSMS e inicie sesión en su servidor SQL.
  2. Busque la base de datos en la que desea crear un sinónimo.
  3. Amplíelo.
  4. Haga clic derecho en Sinónimos carpeta y seleccione Nuevo sinónimo .
  5. Rellene el formulario con la información necesaria para los sinónimos, incluido el nombre, el esquema, etc.
  6. Haga clic en Aceptar .

A continuación se muestra una captura de pantalla del formulario en SSMS:

Dejar caer sinónimos

Hablando de preferencias, escribir los comandos para crear sinónimos es lo mío. Pero dejarlos caer a voluntad es más simple que escribir los comandos. Por supuesto, eso es sólo mi gusto. De todos modos, a continuación se muestran los pasos a seguir al colocar un sinónimo:

  1. Ejecute SSMS e inicie sesión en su servidor SQL.
  2. Busque la base de datos donde reside el sinónimo que desea eliminar.
  3. Amplíelo.
  4. Ampliar los Sinónimos carpeta.
  5. Busque el sinónimo que desea eliminar.
  6. Haga clic con el botón derecho en el sinónimo que desea eliminar y seleccione Eliminar .
  7. Haga clic en Aceptar .

Para resumir los pasos anteriores, simplemente haga clic con el botón derecho en el sinónimo para soltarlo y luego seleccione Eliminar. y finalmente, haga clic en Aceptar .

A continuación se muestra una captura de pantalla de la ventana que aparecerá antes de confirmar la eliminación:

5. Puede proteger los sinónimos de SQL Server

Usando GRANT, DENY o REVOKE, puede controlar el acceso a un sinónimo.

Para CONCEDER un permiso SELECCIONAR al sinónimo sinónimo1 a un usuario llamado testuser , haz lo siguiente:

GRANT SELECT ON synonym1 to testuser

Otros permisos que puede agregar o eliminar de un sinónimo son los siguientes:

  • CONTROL
  • EJECUTAR
  • ACTUALIZAR
  • INSERTAR
  • ELIMINAR
  • VER DEFINICIÓN
  • TOMAR PROPIEDAD

6. ¿No puede encontrar esa tabla, vista o procedimiento? Podría ser un sinónimo

Uno de los problemas que puede experimentar un recién llegado a su equipo es una tabla, vista, procedimiento o función "faltante". Por supuesto, si se emite SELECT en un objeto, podría ser una tabla o una vista. Pero no puede encontrarlo en la lista de tablas o en la lista de vistas. Y si no usó SQL Server Synonyms antes, ese es un problema adicional.

La falta de orientación, un vacío en la documentación o un vacío en sus estándares se pueden poner en orden. Aquí hay una secuencia de comandos ingeniosa que lo ayudará a presentar la lista de sinónimos y su objeto base a su nuevo miembro del equipo:

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 objeto “perdido”? Ya no si es un sinónimo.

Pero antes de que se entusiasme al ejecutar este script, aquí hay algunas cosas más que debe tener en cuenta:

  • sys.sinónimos es donde se definen todos los sinónimos de SQL Server en la base de datos actual.
  • Tomamos los tipos y las descripciones de tipos (type y type_desc respectivamente) en sys.all_objects . Si tiene una idea mejor que unirlos con una subconsulta, hágamelo saber.
  • OBJECTPROPERTYEX se utiliza para obtener el tipo del objeto base si es una tabla, un procedimiento almacenado o de otro modo.
  • Finalmente, si no tiene el permiso mínimo requerido para ejecutar este script y obtener el resultado deseado, es hora de hacerse amigo de su DBA o alguien con un rol similar:)

Pero puede que se pregunte, ¿por qué hacer todo esto si no funciona bien?

7. ¿Los sinónimos de SQL Server afectarán el rendimiento?

Esta es una preocupación común. Y para profundizar en lo que sucede detrás de escena, echemos un vistazo al resumen de lo que sucederá en el plan de ejecución:

  1. Al ejecutar el código más simple con un sinónimo (p. ej., SELECT * de sinónimo1), SQL Server entrará en una fase de vinculación en la que el objeto base reemplazará al sinónimo.
  2. Luego, cualquiera que sea el mejor plan de optimización que exista para ejecutar un comando en el objeto base, será el mismo.

Aquí hay algunas preguntas y respuestas con respecto a las 2 afirmaciones anteriores:

  1. ¿Durante cuánto tiempo realiza SQL Server la fase de vinculación? RESPUESTA:No toma mucho tiempo. Por lo general, sucede en un abrir y cerrar de ojos.
  2. Si el siguiente paso utiliza el mismo mejor plan de optimización con el objeto base y la consulta al objeto base es "lo suficientemente rápida", ¿será más lenta? RESPUESTA:No, porque usará el mismo plan de ejecución.
  3. ¿Qué hay de la autenticación del nuevo servidor? RESPUESTA:Si hay algunos ligeros retrasos causados ​​por la transferencia de una base de datos a un nuevo servidor, no son causados ​​por el sinónimo. Consulta el rendimiento de llamarlo usando un sinónimo o codificando el server.database.schema.object debería ser el mismo porque el sinónimo es solo un nombre alternativo para el objeto base. Resuelva el rendimiento lento del objeto base.

Pero no confíes en mi palabra. Debe verificarlo usted mismo con su plan de ejecución de consultas y el rendimiento real.

Conclusión

En general, cubrimos bastante información sobre los sinónimos de SQL Server, así que recapitulemos.

En primer lugar, un sinónimo es simplemente un nombre alternativo que lo salvará de cambios y transferencias de nombres de objetos. En segundo lugar, buenos candidatos para sinónimos son tablas, vistas, procedimientos almacenados y funciones. A continuación, puede ejecutar comandos apropiados para su objeto base a partir de un sinónimo. También puedes asegurarlo. Luego, si necesita ver la lista de sinónimos, tiene sys.synonyms para ayudarte. Finalmente, el rendimiento no debería ser un gran problema si no hay problemas de rendimiento con el objeto base.

Entonces, ¿por qué no probarlo hoy?

¿Qué piensas? Háganos saber en los comentarios.