Transacciones, Triggers, Vistas y Componentes de SQL Server: Conceptos Clave

Clasificado en Informática

Escrito el en español con un tamaño de 12,62 KB

Transacciones en SQL Server

Una transacción es una secuencia de operaciones realizadas como una sola unidad de trabajo. Son fundamentales para controlar las actualizaciones en cascada, permitiendo aceptar (commit) o rechazar (rollback) todos los cambios en conjunto. Se pueden manejar desde SQL Server (mediante procedimientos almacenados).

Propiedades ACID

Las propiedades de las transacciones se conocen como ACID:

  • Atomicidad: Una transacción debe ser una unidad atómica de trabajo; o se realiza সম্পূর্ণ (todo) o no se realiza nada.
  • Coherencia (Consistencia): La transacción debe dejar los datos en un estado coherente después de su ejecución.
  • Aislamiento (Isolation): Las modificaciones realizadas por transacciones concurrentes se tratan de forma independiente, como si cada transacción fuera el único usuario de la base de datos.
  • Durabilidad: Una vez completada la transacción (commit), sus efectos son permanentes y no hay forma de deshacerlos.

¿Cuándo son necesarias las transacciones?

Las transacciones son cruciales cuando se realizan varias tareas de actualización (inserción, eliminación o modificación) que involucran múltiples tablas. Por ejemplo, si se actualiza una tabla y luego falla la actualización de otra tabla relacionada, se puede deshacer la primera actualización (rollback) y cancelar toda la operación. Esto asegura la integridad de los datos y evita que queden datos "colgados" o inconsistentes.

Objeto Transaction

El método BeginTransaction del objeto Connection devuelve un objeto Transaction, que se utiliza para controlar la transacción.

Implementación de Transacciones

Ejemplo de implementación en una capa de negocio (C#):


// Dentro de la clase en la capa de negocio
private SqlConnection objConexion;
private SqlTransaction objTransaccion;

// Dentro del método que realiza la operación con transacciones
public void MetodoConTransaccion(CabeceraDatos objCabecera, DetalleDatos objDetalle)
{
    bool transaccionExitosa = true;

    try
    {
        objConexion.Open();
        objTransaccion = objConexion.BeginTransaction();

        // Insertar la cabecera
        objCabecera.Insertar(objCabecera, objConexion, objTransaccion);

        // Insertar el detalle
        objDetalle.Insertar(objDetalle, objConexion, objTransaccion);

        // Si todo va bien, confirmar la transacción
        objTransaccion.Commit();
        transaccionExitosa = false; //Indica que se realizó el commit
    }
    catch (Exception ex)
    {
        // Si hay un error, deshacer la transacción
        if (transaccionExitosa)
        {
            objTransaccion.Rollback();
        }
        
        throw ex; //Propaga la excepción
    }
    finally
    {
        // Cerrar la conexión en cualquier caso
        objConexion.Close();
    }
}

Triggers en SQL Server

Los triggers son procedimientos almacenados especiales que se ejecutan automáticamente cuando se realiza una operación (INSERT, UPDATE, DELETE) sobre una tabla específica. No se pueden ejecutar manualmente ni se puede impedir su ejecución automática cuando ocurre el evento que los activa.

Aunque se crean sobre una tabla en particular, pueden afectar a otras tablas.

Tipos de Triggers

  • INSERT: Se disparan al agregar datos a una tabla.
  • DELETE: Se disparan al eliminar datos de una tabla.
  • UPDATE: Se disparan al actualizar datos de una tabla.

Garantía de Integridad y Reglas de Negocio

Los triggers garantizan la integridad del modelo de datos frente a las operaciones de modificación y aseguran el cumplimiento de las reglas de negocio del sistema.

Triggers DDL

Los triggers DDL (Data Definition Language) a nivel de servidor son similares a los triggers a nivel de base de datos, pero responden a eventos del servidor, no a eventos del alcance de la base de datos (como la creación o modificación de tablas).

Tablas Especiales: INSERTED y DELETED

SQL Server genera automáticamente tablas temporales especiales:

  • INSERTED: Contiene las filas nuevas o modificadas después de una operación INSERT o UPDATE. Su estructura coincide con la tabla afectada.
  • DELETED: Contiene las filas eliminadas después de una operación DELETE o las filas antiguas antes de una operación UPDATE. Su estructura coincide con la tabla afectada.

La cláusula FOR (o AFTER) indica que el trigger se ejecutará después de que la operación se haya completado con éxito. INSTEAD OF indica que el trigger se ejecutará en lugar de la operación que lo activó.

Los triggers pueden anidarse y disparar otros triggers, incluso de forma recursiva (excepto los triggers INSTEAD OF).


CREATE TRIGGER trg_librosAudit ON tblibro
AFTER UPDATE
AS
    INSERT INTO tblibros_audit
    SELECT d.*, GETDATE() FROM deleted d;

    INSERT INTO tblibros_audit
    SELECT i.*, GETDATE() FROM inserted i;
GO

Vistas en SQL Server

Una vista es una consulta SELECT con nombre que se almacena en SQL Server. Actúan como tablas virtuales y ofrecen varias ventajas:

  • Permiten a los desarrolladores ejecutar consultas frecuentes de manera consistente, asegurando que diferentes aplicaciones utilicen la misma versión de la consulta.
  • Ofrecen un mayor nivel de seguridad al proporcionar a los usuarios acceso a un subconjunto de datos contenido en las tablas base.

Vistas Actualizables

Una vista es actualizable si cumple con las siguientes condiciones:

  • La cláusula FROM afecta solo a una tabla.
  • La cláusula SELECT solo contiene nombres de atributos de la tabla y no incluye expresiones agregadas (como SUM, AVG) ni DISTINCT.
  • Cualquier atributo que no aparezca en la cláusula SELECT debe permitir valores nulos.
  • La consulta no tiene cláusulas GROUP BY ni HAVING.

Vistas Materializadas

Una vista materializada se computa y almacena físicamente. Se crea al definir un índice clúster sobre ella. Son adecuadas para consultas frecuentes sobre datos agregados de muchas filas.

Componentes de SQL Server

  • Database Engine: Es el motor principal de la base de datos. Almacena, procesa y protege los datos. Permite crear y administrar bases de datos relacionales (tablas, índices, vistas, procedimientos almacenados, etc.). Proporciona acceso controlado y procesamiento rápido de transacciones.
  • Analysis Services – Datos multidimensionales: Permite diseñar, crear y administrar estructuras multidimensionales (cubos OLAP) con datos de diversas fuentes, unificándolos en un solo modelo lógico.
  • Analysis Services – Minería de datos: Proporciona algoritmos de minería de datos para detectar tendencias, patrones, establecer predicciones y tomar decisiones.
  • Integration Services: Permite extraer, transformar y cargar (ETL) datos de diversas fuentes.
  • Replicación: Tecnologías para copiar, distribuir y sincronizar datos entre bases de datos.
  • Service Broker: Facilita la comunicación entre bases de datos para crear funciones de mensajería complejas. Garantiza la coherencia de la información mediante transacciones.
  • Reporting Services: Herramientas y servicios para crear, implementar y administrar informes a partir de diversas fuentes de datos.

XML en SQL Server

XML (Extensible Markup Language) es un metalenguaje que permite definir lenguajes de marcado para propósitos específicos.

  • Representa información estructurada de forma compatible con diferentes aplicaciones y dispositivos.
  • Permite crear etiquetas y atributos personalizados.
  • Utiliza un formato de texto plano con marcas intercaladas.

Aplicaciones de XML

  • Representación y distribución de documentos textuales.
  • Intercambio de datos e información estructurada.
  • Integración de datos de fuentes heterogéneas.

Objetivos de XML

  • Explicitar la estructura y el contenido de un documento.
  • Separar la estructura/contenido de su presentación.
  • Crear documentos portables para sistemas heterogéneos.

Estructura de un Documento XML

  • Prólogo: Declaración XML y de tipo de documento (DTD o esquema).
  • Instancia del documento: Contenido del documento.

Integración con .NET

ADO.NET y el XmlDocument (DOM) representan un documento XML en memoria.


'Ejemplo de importación de datos desde XML
Public Sub importarDiscos(ByVal nombreArchivo As String, ByRef cantidadRepetidos As Integer, ByRef cantidadInsertados As Integer)
    ' ... (código omitido para brevedad) ...
End Sub

'Ejemplo de exportación de datos a XML
Public Sub exportarDiscos(ByVal path As String, ByRef cantReg As Integer)
    ' ... (código omitido para brevedad) ...
End Sub

SET TRANSACTION ISOLATION LEVEL

La instrucción SET TRANSACTION ISOLATION LEVEL controla cómo los bloqueos afectan a las transacciones. Define cómo la transacción interpreta los bloqueos existentes y cómo genera nuevos bloqueos en sus operaciones de lectura/escritura.

Sintaxis:

SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE | SNAPSHOT }
  • READ COMMITTED: (Predeterminado en SQL Server) La transacción no puede leer datos modificados por otras transacciones que aún no se hayan confirmado (committed). Otras transacciones *pueden* modificar los datos leídos por la transacción actual *después* de que se hayan leído.
  • READ UNCOMMITTED: La transacción *puede* leer datos modificados por otras transacciones, incluso si aún no se han confirmado. Este es el nivel de aislamiento más bajo y puede dar lugar a "lecturas sucias" (dirty reads).
  • REPEATABLE READ: La transacción no puede leer datos modificados por otras transacciones, y otras transacciones *no pueden* modificar los datos que ha leído la transacción actual hasta que ésta finalice. Sin embargo, otras transacciones *pueden* insertar nuevas filas que coincidan con los criterios de búsqueda de la transacción actual (lo que se conoce como "lecturas fantasma" o phantom reads).
  • SERIALIZABLE: El nivel de aislamiento más alto. Las instrucciones no pueden leer datos modificados pero no confirmados por otras transacciones. Ninguna otra transacción puede modificar los datos leídos por la transacción actual, *ni insertar filas nuevas* que coincidan con los criterios de búsqueda, hasta que la transacción actual finalice. Esto evita lecturas sucias, lecturas no repetibles y lecturas fantasma.
  • SNAPSHOT: Activa el versionado de filas. Las instrucciones de la transacción no ven las modificaciones realizadas por otras transacciones; en su lugar, reciben una "copia coherente" de los datos tal como estaban al *comienzo* de la transacción (o de la instrucción, dependiendo de la configuración). Requiere que la base de datos tenga habilitada la opción ALLOW_SNAPSHOT_ISOLATION.

Concurrencia y Tipos de Bloqueo

Cuando múltiples usuarios o transacciones intentan acceder a los mismos datos simultáneamente, SQL Server utiliza bloqueos para garantizar la coherencia de la base de datos. Los bloqueos pueden ser a nivel de fila, página o tabla.

Tipos de bloqueo:

  • Compartidos (Shared): Permiten la lectura concurrente de los datos, pero impiden que otras transacciones modifiquen los datos bloqueados.
  • Exclusivos (Exclusive): Impiden que otras transacciones lean o modifiquen los datos bloqueados. Se utilizan para operaciones de escritura (INSERT, UPDATE, DELETE).
  • De actualización (Update): Una combinación de bloqueos compartidos y exclusivos. Se utilizan durante la fase inicial de una operación de actualización para evitar interbloqueos (deadlocks).

Entradas relacionadas: