SQL Server

Aquí encontraras todos nuestros post relacionados con SQL Server desde cero hasta un nivel avanzado. Desde infraestructura hasta modelado de datos.

Planes de Ejecución en SQL Server

Hoy vamos a hablar de los planes de ejecución en SQL Server, uno de los temas más amplios y a la vez imprescindibles para entender el rendimiento de nuestras consultas. Entender los planes de ejecución es básico para analizar el rendimiento de las consultas y optimizarlas. Empecemos por el principio.

¿Qué son los planes de ejecución? 

Los planes de ejecución son una representación gráfica o textual de cómo SQL Server procesa una consulta. Cada consulta se divide en una serie de operadores lógicos y físicos que realizan diferentes tareas, como leer datos de una tabla, filtrar filas, ordenar resultados, etc. Además, los planes de ejecución nos muestran el orden y el coste de cada operador, así como las estadísticas de las filas procesadas y el uso de memoria y CPU. 

¿Para qué sirven los planes de ejecución? 

Los planes de ejecución nos ayudan a entender cómo SQL Server ejecuta una consulta y a identificar posibles problemas de rendimiento. Por ejemplo, podemos ver si una consulta usa índices adecuados, si hay operadores costosos o ineficientes, si hay estimaciones erróneas de cardinalidad, etc. Con esta información, podemos aplicar técnicas de optimización, como crear o modificar índices, reescribir la consulta, actualizar las estadísticas, etc. 

¿Cómo se obtienen los planes de ejecución? 

Hay varias formas de obtener los planes de ejecución en SQL Server. Una de las más sencillas es usar el Management Studio y activar la opción «Incluir plan de ejecución actual» o «Incluir plan de ejecución estimado» en el menú «Consulta». Esto nos mostrará el plan de ejecución junto con los resultados de la consulta. Otra forma es usar la instrucción SET SHOWPLAN_ON o SET SHOWPLAN_TEXT para obtener el plan de ejecución en formato textual. También podemos usar la función sys.dm_exec_query_plan para obtener el plan de ejecución en formato XML a partir del identificador de una consulta. Después, podemos usar esta web para ver gráficamente nuestros planes en XML.

¿Qué tipos de planes de ejecución hay?

Hay dos tipos principales de planes de ejecución: estimados y actuales. Los planes estimados se generan antes de ejecutar la consulta y se basan en las estadísticas disponibles y en el optimizador de consultas. Los planes actuales se generan después de ejecutar la consulta y reflejan lo que realmente ha ocurrido durante la ejecución. Nuestros planes estimados y actuales pueden ser diferentes si hay cambios en los datos, en las estadísticas o en el entorno. Por eso, es recomendable comparar ambos tipos de planes para detectar discrepancias y ajustar la consulta o las estadísticas si es necesario. 

¿Qué elementos componen un plan de ejecución? 

Un plan de ejecución se compone de varios elementos que representan los operadores lógicos y físicos que intervienen en la consulta. Cada elemento tiene un icono, un nombre y unas propiedades que describen su función y su coste. 

Algunos elementos comunes son: 
– Scan: lee todas las filas o páginas de una tabla o un índice. 
– Seek: busca una fila o un rango de filas en un índice usando una clave. 
– Join: combina filas de dos orígenes usando un criterio de unión. Hay varios tipos de join, como nested loops, merge o hash. 
– Aggregate: agrupa filas por una o más columnas y calcula funciones agregadas, como sum, count o avg. 
– Sort: ordena filas por una o más columnas. 
– Filter: elimina filas que no cumplen una condición. 
– Compute Scalar: calcula una expresión escalar, como una columna calculada o una función. 
– Stream Aggregate: agrupa filas por una o más columnas y calcula funciones agregadas usando un algoritmo eficiente que requiere que las filas estén ordenadas previamente. 
– Hash Match: realiza operaciones como join, aggregate o union usando una estructura hash para almacenar y buscar las filas. 
– Spool: almacena temporalmente las filas en el disco para reutilizarlas más adelante. 
– Top: devuelve un número fijo o porcentual de filas ordenadas por una o más columnas. 

Estos son solo algunos ejemplos, sin embargo, hay muchos más elementos que pueden aparecer en un plan de ejecución. Lo importante es entender qué hace cada elemento y cómo afecta al rendimiento de la consulta. Puedes encontrar la lista completa de operadores en la documentación oficial.

¿Cómo se interpreta un plan de ejecución? 

Para interpretar un plan de ejecución hay que tener en cuenta varios aspectos, como el orden, el coste, las estadísticas y las advertencias.
El orden indica la secuencia en la que se ejecutan los operadores. En un plan de ejecución gráfico, el orden se lee de derecha a izquierda y de arriba a abajo.
Por otro lado, el coste indica el porcentaje de recursos que consume cada operador respecto al total de la consulta y se puede ver en la barra de colores que acompaña a cada elemento. El coste es una estimación basada en las estadísticas y puede no reflejar el coste real.
Las estadísticas muestran información sobre las filas procesadas, el uso de memoria y CPU, el tiempo de ejecución, etc y se pueden ver en las propiedades de cada elemento o en el panel de detalles. Las estadísticas son datos reales que se obtienen al ejecutar la consulta.
Por último, las advertencias son mensajes que indican posibles problemas de rendimiento o de calidad de los datos. 

Advertencias

Las advertencias se pueden ver como símbolos de exclamación o de información en los elementos del plan. Como hemos visto, es importante que les prestemos atención ya que nos indican problemas en nuestras consultas.

Algunas advertencias comunes son: 
– Missing Index: indica que la consulta podría beneficiarse de un índice que no existe. 
– Sort Warnings: indica que la operación de ordenación ha usado más memoria de la disponible y ha tenido que escribir datos en el disco. 
– Hash Warnings: indica que la operación hash ha usado más memoria de la disponible y ha tenido que escribir datos en el disco. 
– Plan Affecting Convert: indica que hay una conversión implícita o explícita de tipos de datos que puede afectar al rendimiento o a la precisión de la consulta.
– SpillToTempDb: indica que una operación ha usado más memoria de la estimada y ha tenido que escribir datos en el disco. 

Estos son solo algunos ejemplos pero, hay muchas más advertencias que pueden aparecer en un plan de ejecución. Lo importante es prestar atención a las advertencias y corregir los problemas si es posible. 

Conclusión 

Los planes de ejecución son una herramienta imprescindible para cualquier DBA que quiera optimizar el rendimiento de las consultas en SQL Server. Los planes de ejecución nos permiten ver cómo SQL Server procesa una consulta y qué recursos consume cada operador. Con esta información, podemos identificar y resolver los problemas más comunes, como el uso inadecuado o la falta de índices, las estimaciones erróneas de cardinalidad, los operadores costosos o ineficientes, etc. Espero que este artículo os haya servido para introduciros en el mundo de los planes de ejecución y os anime a usarlos en vuestro trabajo diario. 

Si queréis profundizar más en este tema, os recomiendo los siguientes recursos:
– Los libros SQL Server Execution Plans y SQL Server Query Performance Tuning de Grant Fritchey
– Los post de Paul White en SQLPerformance.com
– Los cursos de Brent Ozar

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 6 comentarios

Libro de Contabilidad: Añadiendo blockchain a SQL Server

Hoy vamos a hablar de una de las características más interesantes y novedosas de SQL Server y Azure SQL: el libro de contabilidad o Ledger. Es una forma de garantizar la integridad, la inmutabilidad y el orden cronológico de los datos almacenados en una base de datos relacional, utilizando conceptos similares a los de la tecnología blockchain.

¿Qué es el libro de contabilidad? 

El libro de contabilidad permite crear tablas especiales que registran las operaciones realizadas sobre los datos, incluyendo información sobre el usuario, la fecha y hora, el tipo de operación y un hash criptográfico que enlaza cada registro con el anterior, formando una cadena inalterable. Además, cada registro del libro de contabilidad tiene una firma digital que se genera con una clave asimétrica, lo que impide que se pueda modificar o eliminar sin dejar rastro. De esta forma, se puede auditar y verificar la historia completa de los datos, detectar cualquier intento de manipulación o fraude, y cumplir con las normativas de seguridad y privacidad más exigentes.

Es una característica disponible tanto en SQL Server como en Azure SQL, aunque con algunas diferencias. En SQL Server, requiere la edición Enterprise o Developer y la versión 2019 o superior. En Azure SQL, está disponible en todas las ediciones y versiones, pero solo para las bases de datos individuales, no para las bases de datos elásticas o los grupos de servidores administrados. Además, en Azure SQL se ofrece un servicio adicional llamado Azure SQL Ledger, que proporciona una capa adicional de seguridad y confianza al almacenar los hashes del libro de contabilidad en un servicio externo e independiente, basado en la tecnología blockchain.

¿Para qué sirve el libro de contabilidad? 

El libro de contabilidad es una solución ideal para escenarios en los que se requiere un alto nivel de confianza y transparencia en los datos, como por ejemplo:

– Contabilidad financiera: se puede llevar un registro fiable y verificable de todas las transacciones realizadas por una empresa o una entidad bancaria, evitando errores, duplicidades o fraudes.
– Gestión de inventarios: se puede controlar el movimiento y el estado de los productos o activos a lo largo de la cadena de suministro, desde su origen hasta su destino final, asegurando su trazabilidad y calidad.
– Certificación digital: se puede emitir y validar certificados digitales que acrediten la identidad, la propiedad o la autorización de una persona o una entidad, utilizando l
edger como fuente de verdad única e inmutable.
– Votación electrónica: se puede garantizar la integridad y el secreto del voto, así como el recuento y la publicación de los resultados, utilizando el ledger
como sistema de registro seguro y transparente.

¿Cómo se usa el libro de contabilidad? 

Lo primero que tenemos que hacer es habilitarlo para la tabla o la base de datos que queremos proteger. Esto se puede hacer mediante el asistente gráfico de SQL Server Management Studio o mediante instrucciones T-SQL. Por ejemplo, para habilitarlo para una tabla llamada Clientes, podemos usar el siguiente código:

Con esto, se crea una tabla de libro de contabilidad llamada Clientes_Ledger, que tendrá la misma estructura que la tabla Clientes, más dos columnas adicionales: SysStartTime y SysEndTime, que indican el inicio y el fin de la vigencia de cada registro. También se crea un índice clusterizado sobre estas dos columnas para optimizar las consultas. Una vez habilitado, cada vez que insertemos, actualicemos o eliminemos un registro en la tabla Clientes, se generará automáticamente un registro correspondiente en la tabla Clientes_Ledger, con la información y la firma digital de la operación. Para consultar el libro de contabilidad, podemos usar la cláusula FOR SYSTEM_TIME en las instrucciones SELECT. Por ejemplo, para ver el historial completo de la tabla Clientes, podemos usar el siguiente código:

Con esto, obtenemos todos los registros que han existido en la tabla Clientes desde que se habilitó el libro de contabilidad, incluyendo los actuales y los borrados. También podemos filtrar por un rango temporal específico, usando las opciones AS OF, FROM TO o BETWEEN AND. Por ejemplo, para ver los registros que existían en la tabla Clientes el 1 de enero de 2024 a las 10:00 a.m., podemos usar el siguiente código:

Libro de contabilidad a nivel base de datos

También se puede habilitar a nivel de base de datos, lo que implica que se creará una tabla de libro de contabilidad para cada tabla existente y futura en la base de datos. Una vez habilitado para una base de datos habilitado no se podrán crear en ella tablas con el libro de contabilidad deshabilitado en esa base de datos. Para activarlo, podemos usar el siguiente código:

Para deshabilitar el libro de contabilidad, tanto a nivel de tabla como de base de datos, podemos usar el mismo código pero cambiando ON por OFF. Sin embargo, hay que tener en cuenta que al deshabilitarlo se pierde todo el historial acumulado hasta ese momento, por lo que es recomendable hacer una copia de seguridad antes. 

También se puede utilizar la función sys.fn_ledger_chain_integrity para comprobar la integridad del libro de contabilidad, comparando los valores almacenados en la columna sys_lsn con los valores calculados a partir del contenido y el hash de los registros. Esta función devuelve un valor booleano que indica si está intacto o si ha sido alterado.

¿Qué ventajas tiene? 

El libro de contabilidad tiene varias ventajas frente a otros métodos tradicionales de auditoría o registro de cambios, como por ejemplo:

– Fácil de implementar y administrar, ya que no requiere crear triggers ni tablas auxiliares.
Más seguro y confiable, ya que usa criptografía y firmas digitales para garantizar la autenticidad e integridad de los datos.
– Es más eficiente y escalable, ya que usa técnicas de compresión y particionamiento para optimizar el almacenamiento y el rendimiento.
– Compatible y portable, ya que se basa en estándares abiertos y se puede usar tanto en SQL Server como en Azure SQL.

¿Qué inconvenientes tiene el libro de contabilidad?

El libro de contabilidad también tiene algunas limitaciones que hay que tener en cuenta, como por ejemplo:

– No se puede modificar o eliminar el historial del libro de contabilidad, salvo que se deshabilite la funcionalidad por completo.
– E
s incompatible con tablas que tengan FILESTREAM o columnas de tipo XML, CLR, HIERARCHYID o GEOGRAPHY.
– No se puede usar el libro de contabilidad con tablas que tengan índices espaciales, columnstore o full-text.
Es incompatible
con tablas que tengan restricciones de tipo CHECK, FOREIGN KEY o UNIQUE.
– No se puede usar el libro de contabilidad con tablas que tengan columnas calculadas o generadas.

Conclusión

El libro de contabilidad es una característica muy potente y útil que permite aprovechar las ventajas de la tecnología blockchain en el ámbito de las bases de datos relacionales, ofreciendo un nivel de integridad, inmutabilidad y transparencia de los datos sin precedentes. Espero que os haya gustado este artículo y que os animéis a probar el libro de contabilidad en vuestros proyectos. Si os han quedado dudas o queréis aportar algo podéis hacerlo en los comentarios, en Twitter o en mi mail.

Publicado por Roberto Carrancio en SQL Server, 3 comentarios

Protegiendo Datos Confidenciales en SQL Server

Estos últimos días hemos estado viendo cómo cifrar y enmascarar datos confidenciales en SQL Server y cómo clasificar los datos en función de su tipología y confidencialidad. Hemos tenido mucha teoría sobre el tema así que hoy vamos con unas aplicaciones prácticas algo distintas que no se suelen ver pero que me parecen muy interesantes. En concreto vamos a tratar de combinar los conceptos de DDM con el resultado de nuestra clasificación de datos.

Clasificación de los datos.

Data Classification es una herramienta que nos permite etiquetar los datos sensibles o confidenciales de nuestras tablas y columnas, asignándoles un nivel de sensibilidad y un tipo de información. De esta forma, podemos identificar fácilmente qué datos requieren una mayor protección y cómo gestionarlos adecuadamente.

Como ejemplo vamos a usar la base de datos AdventureWorks2022, El asistente de clasificación de datos nos ha revelado que la base de datos tiene 32 columnas confidenciales según el RGPD así que las clasificamos como tal.

Enmascarando datos confidenciales

Ya tenemos los datos clasificados, pero eso no es suficiente. También tenemos que asegurarnos de que solo las personas autorizadas puedan acceder a ello. Para ello, podemos usar dos funcionalidades muy potentes de SQL Server: Always Encrypted y el enmascaramiento dinámico de datos (DDM). DDM es una función de SQL Server que te permite ocultar o enmascarar los datos sensibles cuando los consultas, sin modificar los datos reales en la base de datos. De esta forma, puedes limitar la exposición de tus datos a usuarios no autorizados o aplicaciones externas. Vamos a usar esta para el ejemplo.

Localizando las columnas afectadas

Nuestra idea es construir una consulta SQL que genere el enmascaramiento DDM para las consultas confidenciales. Lo primero que necesitaremos será localizar las columnas que tenemos que enmascarar con una consulta SQL. Por suerte para nosotros esta consulta está directamente disponible en la documentación

Enmascarando las consultas con DDM

Con la consulta anterior, ya podremos crear una consulta dinámica para aplicar reglas de enmascaramiento a todas las columnas en función de su tipo:

Resultado

Ahora toda persona que carezca del permiso unmask no podrá ver los datos confidenciales y verá las máscaras que hemos asignado. Os dejo un ejemplo:

Auditar lecturas de datos confidenciales

Es probable que, por temas regulatorios, se nos pida llevar un control sobre los accesos a datos confidenciales. Para ello podemos combinar la auditoría de SQL Server con las columnas que hemos clasificado con el asistente de clasificación de datos. 

La auditoría nos permite crear un registro detallado de todas las operaciones que se realizan sobre los datos clasificados, incluyendo el usuario, la aplicación, la fecha, la hora, el tipo de acción y los datos afectados. Así, podemos monitorizar el uso de los datos sensibles y detectar posibles amenazas o fugas de información.

Para crear una auditoría de lecturas sobre los datos clasificados, tenemos que seguir estos pasos:

  1. Crear un grupo de auditoría en el nivel del servidor, especificando el destino donde se almacenarán los registros (un archivo, una tabla o el registro de eventos de Windows).
  2. Crear una especificación de auditoría en el nivel de la base de datos, asociándola al grupo de auditoría creado y seleccionando las tablas o columnas que queremos auditar (por ejemplo, las que tienen datos clasificados).
  3. Habilitar el grupo de auditoría y las especificaciones de auditoría creadas.

Como habrás podido notar los pasos son los mismos que para una auditoría normal, no tienes que hacer nada más. SQL Server reconocerá las columnas clasificadas como confidenciales y mostrará en la auditoría el tipo de información a la que se ha accedido de esta manera:

Conclusión

Hemos visto un par de formas de ir más allá en la protección de nuestros datos confidenciales pero no son las únicas. Podemos combinar el uso de las vistas del catálogo de datos clasificados con nuestras propias consultas para hacer todo lo que nos podamos imaginar. Podríamos crear una consulta que cree automáticamente Always Encrypted para una mayor seguridad por ejemplo. A partir de aquí el límite lo ponéis vosotros. Como siempre os digo para cualquier duda os dejo a vuestra disposición los comentarios, mi Twitter o mi mail.

Publicado por Roberto Carrancio en SQL Server, 0 comentarios

Clasificación de datos con SQL Server Data Classification

En el post de ayer vimos cómo cifrar o enmascarar los datos en SQL Server pero, ¿qué datos debemos proteger? Eso es justo lo que vamos a ver hoy, en este artículo te voy a explicar cómo funciona Data Classification, cómo puedes usarla para clasificar tus datos y cómo puedes detectar los datos clasificados en tu base de datos. El objetivo es que al final de este post seamos capaces de aumentar el nivel de protección de nuestros datos. ¡Vamos allá!

¿Qué es Data Classification?

Data Classification es una función de SQL Server que te permite asignar etiquetas de sensibilidad y confidencialidad a tus columnas de datos. Estas etiquetas te ayudan a identificar qué datos son más críticos y qué medidas de seguridad debes aplicar para protegerlos. Por ejemplo, puedes etiquetar una columna que contiene números de tarjeta de crédito como «Alta sensibilidad» y «Confidencial», o una columna que contiene nombres de clientes como «Baja sensibilidad» y «Público».

¿Para qué sirve Data Classification?

Data Classification tiene varios beneficios para tu base de datos, principalmente nos ayuda a mejorar la seguridad. Podemos aplicar políticas de acceso, encriptación, auditoría y retención basadas en las etiquetas de tus datos. Por otro lado, nos va a permitir cumplir con las normativas de protección de datos, como el RGPD, que exigen que clasifiques tus datos según su sensibilidad y confidencialidad, y que informes a tus usuarios sobre el uso que haces de sus datos. Por último, facilita el análisis y la visualización de los datos, ya que podremos filtrar, agrupar y ordenar nuestros datos según sus etiquetas.

¿Cómo clasificar tus datos con Data Classification?

Para clasificar tus datos con Data Classification, tienes que seguir estos pasos:

  1. Abre el Explorador de objetos de SQL Server Management Studio (SSMS) y conecta con tu servidor de SQL Server.
  2. Expande la carpeta Bases de datos y selecciona la base de datos que quieres clasificar.
  3. Haz clic derecho sobre la base de datos y selecciona Tareas > Clasificar datos.
  4. Se abrirá el asistente de Data Classification, que te guiará por el proceso de clasificación.
  5. En la primera página del asistente, haz clic en Siguiente.
  6. En la segunda página del asistente, verás una lista de las tablas y columnas de tu base de datos, con las recomendaciones automáticas de clasificación basadas en los tipos y nombres de los datos. Puedes aceptar las recomendaciones o modificarlas según tus criterios. Para modificar una recomendación, haz clic sobre la fila correspondiente y selecciona la sensibilidad y la confidencialidad que quieras asignar. También puedes añadir o eliminar columnas del proceso de clasificación usando los botones Agregar o Eliminar.
  7. Cuando hayas terminado de clasificar tus columnas, haz clic en Siguiente.
  8. En la tercera página del asistente, verás un resumen de la clasificación que has realizado, con el número total de columnas clasificadas y el nivel medio de sensibilidad y confidencialidad. También podrás generar un informe en formato PDF o CSV con los detalles de la clasificación. Haz clic en Finalizar para aplicar la clasificación a tu base de datos.

¿Cómo detectar los datos clasificados en tu base de datos?

Una vez que hayamos clasificado nuestros datos con Data Classification, tendremos varias opciones para detectarlos. 

Asistente de Data Classification

Si abres el asistente de Data Classification, podrás ver las columnas que ya has clasificado y modificarlas si lo deseas. También nos ofrece la posibilidad de generar un informe.

Vistas del sistema

SQL Server almacena la información sobre la clasificación en el catálogo del sistema, en las vista sys.sensitivity_classifications. Podemos consultar esta vista usando consultas para obtener los detalles sobre la clasificación.

Propiedades de las columnas

Si seleccionas una columna clasificada en el Explorador de objetos de SSMS y abres el panel Propiedades, podrás ver la sensibilidad y la confidencialidad que le has asignado en la pestaña de propiedades extendidas.

Conclusión

En este artículo te he mostrado cómo puedes clasificar, detectar e integrar tus datos de SQL Server usando la función Data Classification. Esta función nos permite asignar etiquetas de sensibilidad y confidencialidad a nuestras columnas de datos. Espero que te haya resultado interesante, en el próximo artículo vamos a ver los siguientes pasos una vez que tenemos clasificados los datos. Si tienes alguna duda o comentario, puedes dejarlo abajo, en Twitter o en mi mail. ¡Hasta la próxima!

Publicado por Roberto Carrancio en SQL Server, 0 comentarios

Cifrado de datos en SQL Server

El otro día, hablando de preguntas en entrevistas de trabajo para DBA, comentamos el tema del cifrado de datos en SQL Server. Como es un tema muy interesante y que a veces genera dudas vamos a verlo en profundidad. 

Antes de empezar, una aclaración. Mi profesor de ciberseguridad siempre decía que se dice CIFRAR, la palabra ENCRIPTAR nunca ha existido en el castellano. La gente usa encriptar por una mala traducción del inglés encrypt. Aunque lo cierto es que el uso de encriptar está tan extendido que en 2022 la RAE lo incluyó en las últimas versiones del diccionario (junto a almóndiga y cocreta), la forma correcta de decirlo sigue siendo CIFRAR. Al fin y al cabo no vamos a meter nada en ninguna cripta, ¿verdad?.

¿Qué es el cifrado y que tipos existen?

El cifrado es un proceso que transforma la información en un formato ilegible para quienes no tienen la clave para descifrarla. De esta forma, podemos evitar que personas no autorizadas accedan a nuestros datos sensibles o confidenciales.

Existen dos escenarios principales donde el cifrado es importante: en tránsito y en espera. El cifrado en tránsito es la protección de los datos mientras se transmiten por la red, por ejemplo, entre el cliente y el servidor, o entre dos servidores. Sin embargo, cuando decimos cifrado en espera nos referimos a la protección de los datos mientras se almacenan, por ejemplo, en un disco duro o en la nube.

El cifrado en SQL Server

SQL Server nos ofrece varias opciones para implementar el cifrado en ambos escenarios. Veamos algunas de ellas:

TLS para cifrado en tránsito

Para el cifrado en tránsito, podemos usar el protocolo TLS (Transport Layer Security), que crea un canal seguro entre dos partes que se comunican por la red. SQL Server soporta TLS desde la versión 2005 y lo podemos habilitar mediante la configuración del servidor y del cliente. También podemos usar certificados digitales para autenticar las partes y garantizar la integridad de los datos. Los certificados son documentos electrónicos que contienen información sobre la identidad y la clave pública de una entidad. SQL Server nos permite crear, importar y administrar certificados mediante el uso de cláusulas Transact-SQL o mediante el uso de herramientas gráficas como el Administrador de configuración de SQL Server o el Explorador de objetos de SQL Server Management Studio.

TDE para cifrado en espera de bases de datos 

Para el cifrado en espera, podemos usar el TDE (Transparent Data Encryption), que cifra los archivos de datos, los logs de registro y las copias de seguridad de las bases de datos. SQL Server soporta TDE desde la versión 2008 y lo podemos habilitar mediante la creación de una clave de cifrado de base de datos y una clave maestra de base de datos. El TDE no afecta al rendimiento ni al diseño de las aplicaciones, ya que el cifrado y el descifrado se realizan de forma transparente.

TDE se puede configurar con EKM (Extensible Key Management), que nos permite usar proveedores externos para almacenar y administrar las claves de cifrado. El EKM nos ofrece mayor seguridad y flexibilidad para gestionar las claves.

Always Encrypted para cifrado en espera de columnas

Otra opción para el cifrado en espera es Always Encrypted, que nos permite cifrar los datos sensibles dentro de las columnas de las tablas, tanto en el servidor como en el cliente. SQL Server soporta Always Encrypted desde la versión 2016 y lo podemos habilitar mediante la configuración del driver del cliente y la creación de una clave maestra columnar y una clave columnar. El Always Encrypted nos permite separar las claves de los datos, lo que implica que ni siquiera nosotros como DBAs podremos ver los datos sin autorización.

Enmascaramiento de datos

Además del cifrado, otra forma de proteger nuestros datos es el enmascaramiento. SQL Server ofrece,desde la versión 2016, una opción llamada DDM (Dynamic Data Masking) que nos permite ocultar o modificar los datos sensibles cuando se muestran a los usuarios. Esta opción nunca va a alterar los datos reales almacenados en la base de datos. El DDM nos permite limitar la exposición de los datos según si el usuario tiene o no un permiso. En concreto los usuarios sysadmin o con el permiso UNMASK leerán los datos tal como están guardados en la base de datos y el resto verá los datos enmascarados

Es importante destacar que el DDM no es lo mismo que el cifrado, ya que el DDM no cambia los datos reales, sino solo su presentación. Por lo tanto, el DDM no es suficiente para garantizar la seguridad de los datos, sino que debe usarse junto con otras medidas como el cifrado o el control de acceso.

¿Cómo funciona DDM?

DDM funciona mediante la definición de máscaras o reglas que se aplican a las columnas que contienen los datos que queremos proteger. Estas máscaras pueden ser de diferentes tipos, como por ejemplo:

– Máscara parcial: oculta parte del valor original, dejando visible solo algunos caracteres. Por ejemplo, podemos mostrar solo los últimos cuatro dígitos de un número de teléfono o de una tarjeta de crédito.
– Máscara por defecto: reemplaza el valor original por un valor fijo o predeterminado. Por ejemplo, podemos mostrar un asterisco (*) en lugar del nombre completo de una persona.
– Máscara aleatoria: genera un valor aleatorio dentro de un rango especificado. Por ejemplo, podemos mostrar una fecha aleatoria entre el año 2000 y el 2020 en lugar de la fecha real de nacimiento de una persona.
– Máscara personalizada: permite definir una expresión o una función que se encarga de generar el valor enmascarado. Por ejemplo, podemos mostrar el nombre de una ciudad al azar en lugar del nombre real de la ciudad donde vive una persona.

Para implementar el DDM en SQL Server, solo tenemos que usar la instrucción ALTER TABLE y especificar el tipo de máscara y el valor que queremos aplicar a cada columna. Por ejemplo, si tenemos una tabla llamada Clientes con las columnas Nombre, Apellido, Teléfono y Ciudad, podemos definir las siguientes máscaras:

De esta forma, cuando consultemos la tabla Clientes, veremos algo así:

Nombre Apellido Teléfono Ciudad
*AXXXXXXX XXX-12345
*BXXXXXXX XXX-56783
*CXXXXXXX XXX-90127

Conclusión

Hemos visto algunos ejemplos de los tipos de cifrado y protección que podemos usar con SQL Server. Aunque existen otras opciones como el cifrado estático de columnas son opciones antiguas que prácticamente no se usan. Como habéis podido ver, el cifrado y el DDM son herramientas muy útiles y poderosas para proteger nuestros datos y cumplir con las normativas de privacidad y seguridad. Cada opción tiene sus ventajas y desventajas, dependiendo del nivel de seguridad y rendimiento que se busque. Espero os haya gustado este post y que lo podáis poner en práctica. Como siempre dejo a vuestra disposición los comentarios, mi cuenta de Twitter y mi mail para cualquier duda.

 

Publicado por Roberto Carrancio en SQL Server, 4 comentarios
Entrevista de trabajo con Inteligencia Artificial

Entrevista de trabajo con Inteligencia Artificial

Hoy os he preparado un artículo diferente, hace tiempo que rondaba por mi cabeza la idea de prepararos un artículo con preguntas y respuestas a las que es posible que os tengáis que enfrentar si hacéis una entrevista para un puesto de DBA de SQL Server. Otra idea que lleva rondando mi cabeza desde que inicié este proyecto era hacer un artículo con IA, cada vez está más claro que es una tecnología que ha venido para quedarse y en cuanto antes empecemos a ganar soltura mejor para nosotros. Así que hoy he decidido juntar esas dos ideas en este post y vamos a dejar que la IA nos haga una entrevista de trabajo. Además vamos a dejar también que responda a las preguntas. Por mi parte os añadiré unas notas con mi opinión sobre cada una de las preguntas y respuestas. ¡Vamos a ello!

Configurando nuestra entrevista con IA

Como ya sabéis la Inteligencia Artificial pone a nuestra disposición prácticamente todo lo que le podamos pedir, eso sí, hay que saber cómo pedirlo para obtener el resultado deseado. Lo que le pedimos a una IA se llama prompt y en mi caso ha sido este.

Por un lado le he dicho a Chat GPT que actúe como entrevistador. Le he pedido que haga una entrevista técnica de 5 preguntas:

Quiero que actúes como un entrevistador de RRHH haciendo una entrevista técnica a un candidato a una vacante de DBA SQL Server. Hazme un total de 5 preguntas de una en una y yo te daré la respuesta.

Para las respuestas, vamos a pedirle a Copilot, la IA de Bing (Microsoft) que nos de las respuestas. Este ha sido nuestro prompt:

Quiero que actúes como un candidato a una posición de DBA SQL Server durante una entrevista técnica con RRHH, yo te voy a hacer las preguntas y tú me respondes.

Nuestra entrevista con IA

Teniendo ya configuradas nuestras dos IAs podemos empezar con la entrevista, Chat GPT nos hará unas preguntas que copiaremos en Copilot. Las respuestas que nos de Copilot las copiaremos en Chat GPT para continuar con la entrevista, vamos a ello.

Pregunta 1

Entrevistador (Chat GPT):

¡Claro! Comencemos con la primera pregunta:
¿Puede explicarme qué es la normalización de bases de datos y por qué es importante en el contexto de SQL Server?

Candidato (Copilot):

¡Por supuesto! La normalización de bases de datos es el proceso de organizar los datos en una base de datos para reducir la redundancia y mejorar la integridad de los datos. En SQL Server, la normalización es importante porque ayuda a evitar errores de actualización y eliminación, mejora la eficiencia de las consultas y reduce el espacio de almacenamiento.

Opinión de Roberto: Una pregunta de teoría básica de base de datos para marcar las bases de la entrevista es una muy buena opción. La respuesta es correcta, echo en falta mencionar las formas normales (por lo menos hasta la tercera) pero, he visto que nosotros en el blog tampoco hemos hablado de este tema hasta ahora. Me lo apunto para darle solución lo antes posible.

Pregunta 2

Entrevistador (Chat GPT):

Excelente explicación. Ahora pasemos a la siguiente pregunta:
¿Cuáles son las diferencias entre una clave primaria y una clave externa en una base de datos SQL Server?

Candidato (Copilot):

¡Claro! Una clave primaria es una columna o un conjunto de columnas que identifican de forma única cada fila de una tabla y garantizan la integridad de la entidad de la tabla. Por otro lado, una clave externa es una columna o un conjunto de columnas que establecen una relación entre dos tablas y garantizan la integridad referencial de los datos. En otras palabras, una clave primaria se utiliza para identificar de forma única cada fila en una tabla, mientras que una clave externa se utiliza para establecer una relación entre dos tablas.

Opinión de Roberto: Podríamos considerar esta pregunta no tanto para DBA como para usuarios de bases de datos, sin embargo en nuestro día a día deberemos responder dudas de usuarios por lo que es importante tener claros todos estos conceptos. Nosotros profundizamos mucho más sobre claves primarias.

Pregunta 3

Entrevistador (Chat GPT):

Muy bien explicado. Ahora, avanzando a la tercera pregunta:
¿Cómo optimizaría el rendimiento de una consulta que está ejecutando lentamente en una base de datos SQL Server?

Candidato (Copilot):

Para optimizar el rendimiento de una consulta que se está ejecutando lentamente en una base de datos SQL Server, se pueden seguir algunas prácticas recomendadas. Primero, se puede identificar la consulta lenta y analizar su plan de ejecución para detectar cuellos de botella y posibles mejoras. Luego, se pueden crear índices adecuados para mejorar la velocidad de búsqueda y reducir el tiempo de respuesta. Además, se pueden ajustar las opciones de configuración del servidor y la base de datos para mejorar el rendimiento general.

Opinión de Roberto: Una pregunta sencilla que da mucho juego. Es muy probable que en nuestras entrevistas nos encontremos con esta pregunta o una muy parecida. Por esto mismo, tendremos que prepararnos muy bien la respuesta. Es una pregunta donde nos podremos extender y demostrar lo que sabemos, es muy abierta y con poca información por eso mismo. Quizá yo empezaria la respuesta preguntando, ¿cómo sabemos que va lenta? ¿iba bien antes pero se ha degradado el rendimiento o siempre ha tardado mucho y deseamos mejorar los tiempos? ¿tenemos habilitado Query Store para consultar los distintos planes de ejecución? A partir de aquí ya toca meterse a mirar el plan de ejecución, ver que componentes consumen más recursos y como se puede optimizar la consulta y los índices para mejorar. También miraremos el estado del servidor y el consumo de los principales recursos (CPU,RAM y Disco).

Pregunta 4

Entrevistador (Chat GPT):

Muy acertado. Ahora, pasemos a la cuarta pregunta:
¿Qué estrategias utilizaría para realizar copias de seguridad y restauración en SQL Server?

Candidato (Copilot):

Para realizar copias de seguridad y restauración en SQL Server, se pueden seguir algunas estrategias recomendadas. Primero, es importante identificar los datos críticos que deben ser respaldados y establecer un plan de copia de seguridad adecuado. Luego, se pueden programar copias de seguridad regulares y almacenarlas en un lugar seguro y fuera del sitio. Además, se pueden realizar pruebas de restauración periódicas para garantizar que los datos se puedan recuperar en caso de una falla del sistema. En cuanto a la restauración, se pueden utilizar las herramientas de restauración integradas de SQL Server para restaurar una base de datos a un estado anterior.

Opinión de Roberto: Nos encontramos, de nuevo, con una de las preguntas más frecuentes en las entrevistas de trabajo para DBA. No es casualidad, es una de las tareas diarias de todo DBA como comentamos aquí. No me voy a extender más pues ya tenemos en el blog un artículo dedicado a las copias de seguridad y sus restauraciones.

Pregunta 5

Entrevistador (Chat GPT):

Excelente enfoque. Ahora, para la última pregunta:
¿Cómo gestionaría la seguridad en una base de datos SQL Server, asegurando que solo usuarios autorizados tengan acceso a ciertos datos y funciones?

Candidato (Copilot):

Para gestionar la seguridad en una base de datos SQL Server y asegurarse de que solo los usuarios autorizados tengan acceso a ciertos datos y funciones, se pueden seguir algunas prácticas recomendadas. Primero, se puede establecer un plan de seguridad por capas que aproveche varias funcionalidades de seguridad destinadas a distintos ámbitos de seguridad. Luego, se pueden configurar los permisos de usuario y las entidades de seguridad para reducir el área expuesta de SQL Server. Además, se pueden cifrar los datos en reposo y a través de la conexión con Always Encrypted y Cifrado de datos transparente. Por último, se pueden programar auditorías y alertas para detectar y responder a posibles amenazas de seguridad

Opinión de Roberto: Para finalizar, la IA nos hace otra de esas preguntas que nunca faltan en una entrevista de trabajo. Gestionar la seguridad de los usuarios es clave para el cumplimiento de la normativa básica de seguridad de todas las empresas y, en entornos regulados, hasta la legislación. Vemos como la segunda IA da una respuesta muy completa, hace referencia a permisos por objeto como vimos cuando hablamos de las vistas. Nos habla también de distintas opciones de cifrado de datos que veremos en profundidad más adelante y finaliza con auditorías para vigilar y monitorizar el cumplimiento de las políticas de seguridad.

Conclusión

Ha sido un experimento divertido, hemos visto que las IAs han acertado en gran medida dentro del rol que les habíamos asignado y nos han dado gran variedad de temas a tratar en los próximos días. Lejos está aún el día que predicen que las IA serán capaces de quitarnos el trabajo (aunque es posible que llegue), lo que sí que ha llegado es el día de aprender a usarlas. Tenemos a golpe de click y de manera gratuita un universo infinito de posibilidades que nos puede ayudar como hemos visto desde para preparar una entrevista de trabajo como en el día a día. Tened claro que al blog han venido para quedarse y que más adelante hablaremos más de este tipo de herramientas. ¿Qué os parece a vosotros? ¿Os ha gustado este artículo diferente? Dejadme vuestro feedback aquí abajo, en Twitter o por mail.

Publicado por Roberto Carrancio en SQL Server, 3 comentarios

Combinando soluciones de Alta Disponibilidad (HA Parte 7)

Bienvenidos a otra entrada mas de esta serie sobre Alta Disponibilidad en SQL Server, ya la última. Durante estos últimos días hemos podido ver una a una las soluciones que nos propone SQL Server para garantizar la continuidad de nuestro servicio y replicar los datos en segundas ubicaciones. Cada una de las soluciones que hemos visto tenía sus ventajas y sus inconvenientes y en ocasiones vamos a necesitar combinar varias de estas soluciones para cubrir los requisitos de nuestros clientes. 

Esto es justo en lo que nos vamos a centrar hoy, combinaciones de soluciones de alta disponibilidad para, en la medida de lo posible, limitar los inconvenientes que nos podamos encontrar y garantizar la mayor disponibilidad posible.

Always On distribuidos

Como empezamos esta serie hablando de los Always On, hoy también vamos a empezar por esta solución. No es en sí una combinación de distintas soluciones de alta disponibilidad sino más bien una misma solución anidada como vamos a ver.

Gracias a los Always On distribuidos vamos a poder tener dos o más grupos de disponibilidad (AG) replicados entre sí, de forma que cada AG actúa como una réplica secundaria del otro. Podemos usar Always On distribuidos para escenarios de recuperación ante desastres, ya que podemos tener los AG en diferentes centros de datos o regiones geográficas.

Combinaciones con Instancias de conmutación por error

Cuando hablamos de las FCI vimos que era una solución que nos garantiza alta disponibilidad con un único punto de conexión (el nombre del servidor SQL no varía aunque balancee el servicio). Sin embargo, uno de sus grandes inconvenientes es que no nos permite acceso de solo lectura a las réplicas. También, tiene un gran SPO en el almacenamiento compartido lo que puede hacer que no encaje en todos los escenarios. Para solucionar estos inconvenientes podemos optar por combinar esta solución de alta disponibilidad con otras.

FCI + Always On

Esta es quizá una de mis soluciones preferidas de alta disponibilidad ya que nos permite tener un clúster de conmutación por error (FCI) con dos o más nodos que comparten un almacenamiento compartido y nos brindan alta disponibilidad a bajo coste. Este FCI será, a su vez, uno de los nodos de un Always On con otro servidor o FCI. Además es escalable añadiendo al Always On más nodos o FCI en cualquier momento. 

De esta forma, podemos tener alta disponibilidad a nivel de instancia gracias al FCI y a nivel de base de datos gracias al Always On. También  nos beneficiamos de las características de los Always On como el acceso de solo lectura a los datos o la duplicidad de los datos en varias ubicaciones. 

El FCI nos garantiza el failover automático en caso de que uno de los nodos falle, y el AG nos permite tener copias sincrónicas o asíncronas de las bases de datos, con la posibilidad de leer desde las réplicas secundarias. Esta solución es ideal para entornos locales o híbridos, donde tenemos control sobre el almacenamiento compartido.

FCI + Database Mirroring

Es una combinación similar a la anterior, pero en lugar de usar grupos de disponibilidad, usamos el espejo de bases de datos (Mirroring). El Database Mirroring es una característica que nos permite tener una copia sincrónica o asíncrona de una base de datos en otra instancia de SQL Server, con la opción de tener un testigo que facilite el failover automático. Al combinar estas dos soluciones, podemos tener alta disponibilidad tanto a nivel de instancia como a nivel de base de datos, pero con algunas limitaciones respecto a los Always On, como la ausencia de compresión y cifrado de los datos, y la imposibilidad de leer desde la réplica secundaria. Esta solución es adecuada para versiones anteriores a SQL Server 2012, donde los Always On no estaban disponibles.

FCI + Log Shipping

Es otra combinación que nos permite tener FCI con dos o más nodos que comparten un almacenamiento compartido, y enviar los logs de transacciones a una o más instancias secundarias. De esta forma, podemos tener copias casi en tiempo real de las bases de datos, y usarlas para fines de consulta o reporte. El FCI nos garantiza el failover automático en caso de que uno de los nodos falle, y el Log Shipping nos permite restaurar manualmente las bases de datos en caso de que la instancia primaria falle. Esta solución es útil para entornos donde queremos tener copias adicionales de las bases de datos para solo lectura y de paso, tener una copia actualizada de los datos para una recuperación rápida.

Otras soluciones no oficiales

Cuando hablamos de Log Shipping os comenté que, aunque no es una solución oficial, se puede combinar con Always On. Es un procedimiento que requiere modificar manualmente los jobs del Log Shipping y recrearlos en el nodo secundario con un paso extra para validar si es o no servidor primario antes de ejecutarse. Al igual que las soluciones anteriores, nos permite expandir las posibilidades de estas soluciones de alta disponibilidad. En concreto podríamos usar esta solución para tener copias de solo lectura de nuestras bases de datos en un servidor fuera del cluster de Always On sin tener que pagar el extra de licenciamiento para hacer accesible el nodo secundario del AG. En este caso el Always On nos daría la capacidad de balanceo automático mientras que el Log Shipping nos dará copias casi en tiempo real de las bases de datos para usarlas para fines de consulta o reporte.

Es importante, no usar este tipo de soluciones en entornos de producción o críticos ya que, como hemos comentado, es una solución no soportada por Microsoft por lo que no tendremos soporte en caso de incidente.

Conclusión

Como hemos podido ver, existen variedad de soluciones de alta disponibilidad en SQL Server, y cada una tiene sus ventajas e inconvenientes. Además podemos combinarlas entre ellas para agregar funcionalidades extra o suplir alguno de sus inconvenientes. Lo importante es analizar las necesidades y los requisitos de nuestro sistema, y elegir la solución que mejor se adapte a nuestro caso. 

Espero que esta serie os haya resultado útil e interesante. Ya sabéis que podéis dejarme aquí abajo vuestras dudas o comentarios y que también tenemos a vuestra disposición nuestro Twitter o mi mail.¡Hasta la próxima!

Publicado por Roberto Carrancio en Alta Disponibilidad, SQL Server, 0 comentarios