La Universidad de Alcalá (UAH) tiene contratadas licencias de Microsoft SQL Server desde 2023, utilizadas como plataforma de base de datos para aplicaciones y servicios complementarios que no corren sobre Oracle. Este escenario de coexistencia de dos grandes motores de base de datos —Oracle para los sistemas centrales como UXXI y SQL Server para aplicaciones secundarias— es habitual en grandes organizaciones públicas y universidades. La elección de SQL Server en determinados proyectos responde generalmente a criterios de integración con el ecosistema Microsoft (Active Directory, .NET, Azure), al perfil tecnológico de las aplicaciones contratadas a terceros o al menor coste de administración en ciertos entornos.
Microsoft SQL Server es el sistema gestor de bases de datos relacionales (RDBMS) de Microsoft. Al igual que Oracle Database, implementa el modelo relacional y el estándar SQL, pero con extensiones propietarias y una arquitectura diferente. SQL Server es ampliamente utilizado en entornos empresariales, especialmente en organizaciones con infraestructura Microsoft, y cuenta con integración nativa con herramientas como Visual Studio, .NET, Power BI y Azure.
Las ediciones más relevantes en el ámbito universitario y empresarial son:
Una instancia de SQL Server es una instalación independiente y completa del motor de base de datos que se ejecuta en un servidor. A diferencia de Oracle, donde una instancia se asocia a una única base de datos, SQL Server permite que una sola instalación del motor gestione múltiples bases de datos simultáneamente bajo la misma instancia.
En un mismo servidor físico o virtual pueden coexistir varias instancias de SQL Server:
SERVIDOR.SERVIDOR\NOMBRE_INSTANCIA. Permiten instalar varias versiones de SQL Server en el mismo servidor.Cada instancia tiene su propio conjunto de bases de datos, configuración, servicio de Windows y puertos de red. El puerto predeterminado de SQL Server es el 1433 TCP.
Al instalar SQL Server se crean automáticamente varias bases de datos del sistema que no deben modificarse salvo por personal experto:
#tabla_local, ##tabla_global), variables de tabla, resultados intermedios de consultas y versiones de filas para el aislamiento de transacciones. Su rendimiento es crítico para el rendimiento global de SQL Server.Una base de datos de usuario es el contenedor lógico donde residen los objetos y datos de una aplicación concreta. Cada base de datos SQL Server se compone de:
.mdf): contiene el catálogo del sistema de la base de datos y los datos del usuario. Obligatorio; solo puede existir uno..ndf): ficheros adicionales de datos opcionales, usados para distribuir los datos entre varios discos..ldf): registro de todas las transacciones y modificaciones de la base de datos. Fundamental para la recuperación y la consistencia transaccional.En SQL Server, un esquema es un contenedor de objetos (tablas, vistas, procedimientos, funciones) dentro de una base de datos, separado del concepto de usuario propietario. A diferencia de Oracle, donde usuario y esquema son inseparables, en SQL Server un usuario puede tener acceso a objetos de múltiples esquemas y un esquema puede no estar ligado a un usuario concreto. El esquema predeterminado es dbo (database owner). Esta separación permite una organización más flexible de los objetos: Academico.Matriculas, Economico.Facturas, RRHH.Empleados.
SQL Server implementa la seguridad en dos niveles:
Nivel de instancia: mediante inicios de sesión (Logins), que pueden ser:
- Autenticación de Windows (Windows Authentication): el inicio de sesión se mapea a una cuenta de Windows o Active Directory. Es el modo recomendado en entornos corporativos por su integración con las políticas de seguridad del dominio.
- Autenticación de SQL Server (SQL Server Authentication): credenciales propias almacenadas en SQL Server (usuario/contraseña). Necesario cuando el cliente no pertenece al dominio Windows.
El modo mixto permite ambos tipos de autenticación simultáneamente.
Nivel de base de datos: cada Login se mapea a un usuario de base de datos (Database User) en las bases de datos a las que debe acceder. Los permisos se gestionan mediante roles de base de datos:
db_owner: control total sobre la base de datos.db_datareader: permiso de lectura sobre todas las tablas.db_datawriter: permiso de escritura (INSERT, UPDATE, DELETE) sobre todas las tablas.db_ddladmin: puede ejecutar sentencias DDL (CREATE, ALTER, DROP).db_securityadmin: gestiona roles y permisos dentro de la base de datos.Los roles de servidor (Server Roles) gestionan los privilegios a nivel de instancia:
- sysadmin: administración total de la instancia. Equivalente al DBA de Oracle.
- securityadmin, serveradmin, setupadmin, processadmin, diskadmin, dbcreator, bulkadmin.
SQL Server Agent es el servicio de automatización y programación de tareas de SQL Server. Funciona como demonio de Windows (servicio NT) y permite definir y ejecutar tareas de mantenimiento y administración de forma automática y programada. Es el equivalente funcional al Oracle Scheduler (DBMS_SCHEDULER) en Oracle.
Sus componentes principales son:
Un Job es la unidad de trabajo automatizable en SQL Server Agent. Cada Job se compone de uno o varios pasos (Steps), donde cada paso puede ejecutar código T-SQL, un paquete SSIS, un script PowerShell, un comando del sistema operativo o un comando de replicación. El Job también define la programación (Schedule) que determina cuándo se ejecuta (una vez, periódicamente, al arrancar el agente, etc.) y las notificaciones a enviar en caso de éxito, fallo o finalización.
Usos habituales de los Jobs:
- Ejecución automatizada de backups nocturnos.
- Reconstrucción o reorganización de índices fragmentados.
- Actualización de estadísticas del optimizador.
- Purga de datos históricos o temporales.
- Transferencia o sincronización de datos entre sistemas.
- Ejecución de procesos ETL (paquetes SSIS).
Las alertas responden automáticamente a eventos de SQL Server: errores de severidad determinada, condiciones de rendimiento (uso de CPU, espacio en tempdb) o eventos WMI. Permiten notificar a operadores o ejecutar un Job en respuesta al evento.
Un operador es la definición de un destinatario de notificaciones (correo electrónico, pager, net send). SQL Server Agent utiliza el Database Mail configurado en la instancia para enviar los correos de notificación.
T-SQL (Transact-SQL) es la extensión procedural del lenguaje SQL desarrollada por Microsoft (y originalmente por Sybase) para SQL Server. Es el equivalente de PL/SQL en Oracle: añade al SQL estándar capacidades procedurales como variables, estructuras de control, manejo de errores y módulos de código reutilizables. Sin embargo, ambos lenguajes tienen diferencias sintácticas y funcionales significativas.
A diferencia de PL/SQL, T-SQL no requiere una estructura de bloque formal. Las variables se declaran con DECLARE y el código se escribe de forma más lineal:
-- Declaración de variables
DECLARE @nombre NVARCHAR(100);
DECLARE @contador INT = 0;
-- Asignación con SELECT
SELECT @nombre = nombre FROM empleados WHERE id = 1;
-- Asignación con SET
SET @contador = @contador + 1;
-- Salida
PRINT 'Nombre: ' + @nombre;
SELECT @nombre AS Nombre, @contador AS Contador;
Las variables en T-SQL se preceden siempre del símbolo @. No existe una sección DECLARE separada del cuerpo ejecutable; todo va en la misma secuencia.
-- Condicional
IF @contador > 10
BEGIN
PRINT 'Mayor que 10';
END
ELSE
BEGIN
PRINT 'Menor o igual a 10';
END
-- Bucle WHILE (T-SQL no tiene FOR LOOP nativo como PL/SQL)
WHILE @contador < 100
BEGIN
SET @contador = @contador + 1;
END
-- CASE (disponible también dentro de SELECT)
SELECT nombre,
CASE
WHEN salario < 20000 THEN 'Bajo'
WHEN salario BETWEEN 20000 AND 40000 THEN 'Medio'
ELSE 'Alto'
END AS rango_salarial
FROM empleados;
CREATE OR ALTER PROCEDURE usp_ActualizarSalario
@p_id INT,
@p_nuevo DECIMAL(10,2),
@p_anterior DECIMAL(10,2) OUTPUT
AS
BEGIN
SET NOCOUNT ON; -- Suprime el mensaje "n rows affected"
SELECT @p_anterior = salario
FROM empleados
WHERE id = @p_id;
IF @p_anterior IS NULL
BEGIN
RAISERROR('Empleado no encontrado: %d', 16, 1, @p_id);
RETURN;
END
UPDATE empleados
SET salario = @p_nuevo
WHERE id = @p_id;
END;
GO
-- Ejecución
DECLARE @sal_anterior DECIMAL(10,2);
EXEC usp_ActualizarSalario @p_id = 1, @p_nuevo = 32000, @p_anterior = @sal_anterior OUTPUT;
PRINT 'Salario anterior: ' + CAST(@sal_anterior AS NVARCHAR);
T-SQL distingue varios tipos de funciones definidas por el usuario:
CREATE OR ALTER FUNCTION fn_CalcularIRPF (@salario DECIMAL(10,2))
RETURNS DECIMAL(10,2)
AS
BEGIN
DECLARE @tipo DECIMAL(5,4);
SET @tipo = CASE
WHEN @salario < 12000 THEN 0
WHEN @salario < 20000 THEN 0.19
ELSE 0.30
END;
RETURN ROUND(@salario * @tipo, 2);
END;
GO
Los triggers en T-SQL son similares a los de PL/SQL, con algunas diferencias importantes. En lugar de las pseudovariables :OLD y :NEW de Oracle, SQL Server utiliza las tablas lógicas inserted y deleted:
inserted: contiene las filas nuevas (en INSERT) o las filas con los valores nuevos (en UPDATE).deleted: contiene las filas eliminadas (en DELETE) o las filas con los valores antiguos (en UPDATE).CREATE OR ALTER TRIGGER trg_AuditoriaSalario
ON empleados
AFTER UPDATE
AS
BEGIN
SET NOCOUNT ON;
IF UPDATE(salario) -- Solo si la columna salario fue modificada
BEGIN
INSERT INTO auditoria_salarios (empleado_id, salario_anterior, salario_nuevo, fecha_cambio, usuario)
SELECT
d.id,
d.salario,
i.salario,
GETDATE(),
SYSTEM_USER
FROM deleted d
INNER JOIN inserted i ON d.id = i.id;
END
END;
GO
Una diferencia clave respecto a Oracle: en SQL Server, el trigger no opera fila a fila por defecto; recibe el conjunto completo de filas afectadas a través de inserted y deleted, por lo que el código del trigger debe estar preparado para trabajar con conjuntos de filas, no con filas individuales.
T-SQL utiliza la estructura TRY...CATCH para el manejo de errores, diferente al bloque EXCEPTION de PL/SQL:
BEGIN TRY
BEGIN TRANSACTION;
UPDATE empleados SET salario = salario * 1.10 WHERE dpto = 10;
DELETE FROM empleados WHERE activo = 0;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION;
SELECT
ERROR_NUMBER() AS numero_error,
ERROR_SEVERITY() AS severidad,
ERROR_STATE() AS estado,
ERROR_PROCEDURE() AS procedimiento,
ERROR_LINE() AS linea,
ERROR_MESSAGE() AS mensaje;
END CATCH;
Las funciones ERROR_*() solo tienen valor dentro del bloque CATCH. RAISERROR lanza errores personalizados; THROW (disponible desde SQL Server 2012) es la forma moderna recomendada.
T-SQL soporta cursores explícitos con una sintaxis diferente a PL/SQL:
DECLARE @nombre NVARCHAR(100), @salario DECIMAL(10,2);
DECLARE cur_empleados CURSOR FOR
SELECT nombre, salario FROM empleados WHERE dpto = 10;
OPEN cur_empleados;
FETCH NEXT FROM cur_empleados INTO @nombre, @salario;
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @nombre + ': ' + CAST(@salario AS NVARCHAR);
FETCH NEXT FROM cur_empleados INTO @nombre, @salario;
END
CLOSE cur_empleados;
DEALLOCATE cur_empleados;
Al igual que en Oracle, el uso de cursores debe evitarse cuando sea posible en favor de operaciones basadas en conjuntos, que son más eficientes en bases de datos relacionales.
T-SQL ofrece dos mecanismos para almacenamiento temporal de datos:
#nombre): visibles solo en la sesión que las creó. Se almacenan en tempdb.##nombre): visibles para todas las sesiones mientras exista la sesión creadora.@nombre TABLE(...)): similares a tablas temporales pero con un alcance más limitado (el lote o procedimiento actual). No generan estadísticas del optimizador.-- Tabla temporal
CREATE TABLE #resultados_temporales (
id INT,
nombre NVARCHAR(100),
total DECIMAL(10,2)
);
-- Variable de tabla
DECLARE @resumen TABLE (
dpto INT,
total_empleados INT
);
SQL Server Management Studio (SSMS) es el entorno integrado de administración y desarrollo de Microsoft para SQL Server. Es la herramienta equivalente a TOAD en el ecosistema Oracle, aunque con la diferencia de ser gratuita y oficial de Microsoft. Se distribuye como descarga independiente y admite la administración de instancias SQL Server locales y remotas, así como Azure SQL Database y Azure Synapse Analytics.
El Explorador de objetos es el panel central de SSMS. Muestra en forma de árbol jerárquico todos los objetos de la instancia: bases de datos, tablas, vistas, procedimientos almacenados, funciones, triggers, índices, usuarios, roles, trabajos del Agente, servidores vinculados, etc. Permite realizar la mayoría de las operaciones de administración mediante menús contextuales sin necesidad de escribir código.
El editor de código T-SQL de SSMS ofrece:
- Resaltado de sintaxis y autocompletado (IntelliSense) con sugerencias de objetos y palabras clave.
- Ejecución de sentencias individuales o scripts completos (F5).
- Visualización del plan de ejecución estimado (Ctrl+L) o real (ejecutando con Ctrl+M activado).
- Ventana de resultados en formato cuadrícula o texto.
- Ventana de mensajes para PRINT y errores.
- Soporte para múltiples conexiones en diferentes ventanas.
El Monitor de actividad proporciona una vista en tiempo real del estado de la instancia: procesos activos, esperas, E/S de datos, actividad reciente de consultas costosas. Es la herramienta de diagnóstico rápido de rendimiento en SQL Server.
Biblioteca de plantillas de código T-SQL para operaciones habituales (crear base de datos, crear login, hacer backup, etc.), que el desarrollador puede personalizar mediante parámetros.
SSMS puede generar automáticamente scripts DDL de cualquier objeto de la base de datos: tablas, vistas, procedimientos, índices, usuarios, la base de datos completa, etc. Útil para documentación, control de versiones y migración entre entornos.
SSMS incluye un diseñador visual de tablas (definición de columnas, tipos de datos, claves primarias, restricciones) y un diseñador de diagramas de base de datos para visualizar las relaciones entre tablas.
Desde SSMS se gestionan de forma visual todos los Jobs, Schedules, Alerts y Operators del SQL Server Agent: creación, edición, ejecución manual, consulta del historial de ejecuciones y gestión de notificaciones.
Antes de diseñar la estrategia de backup en SQL Server, es imprescindible entender los modelos de recuperación, que determinan cómo se gestiona el log de transacciones y hasta qué punto es posible recuperar los datos:
Copia todos los datos de la base de datos en el momento del backup, incluyendo la parte del log de transacciones necesaria para que el backup sea consistente. Es la base de cualquier estrategia de recuperación; todos los demás tipos de backup dependen de él.
BACKUP DATABASE UAH_Aplicacion
TO DISK = 'D:\Backups\UAH_Aplicacion_Full.bak'
WITH FORMAT, COMPRESSION, STATS = 10,
NAME = 'Backup completo UAH_Aplicacion';
Copia únicamente los extents (páginas de datos) que han sido modificados desde el último backup completo. Es más rápido que un nuevo backup completo y requiere menos espacio. Para restaurar, se necesita el último backup completo más el último backup diferencial.
BACKUP DATABASE UAH_Aplicacion
TO DISK = 'D:\Backups\UAH_Aplicacion_Diff.bak'
WITH DIFFERENTIAL, COMPRESSION, STATS = 10;
Solo disponible en modelos FULL y BULK_LOGGED. Copia la porción activa del log de transacciones desde el último backup de log y trunca el log, liberando espacio. Permite la recuperación hasta cualquier punto en el tiempo. Deben realizarse con frecuencia (cada 15-60 minutos en producción) para limitar la pérdida máxima de datos (RPO).
BACKUP LOG UAH_Aplicacion
TO DISK = 'D:\Backups\UAH_Aplicacion_Log_' +
CONVERT(NVARCHAR, GETDATE(), 112) + '.trn'
WITH COMPRESSION, STATS = 10;
Permite hacer backup de ficheros .mdf/.ndf individuales. Útil en bases de datos muy grandes donde el backup completo lleva demasiado tiempo.
Realiza un backup completo o de log sin afectar a la cadena de backups establecida. Útil para extraer una copia de la base de datos para pruebas o desarrollo sin interferir con la estrategia de producción.
BACKUP DATABASE UAH_Aplicacion
TO DISK = 'D:\Backups\UAH_Aplicacion_CopyOnly.bak'
WITH COPY_ONLY, COMPRESSION;
La restauración en SQL Server sigue la cadena de backups en el orden correcto:
-- 1. Restaurar el backup completo (WITH NORECOVERY para seguir restaurando)
RESTORE DATABASE UAH_Aplicacion
FROM DISK = 'D:\Backups\UAH_Aplicacion_Full.bak'
WITH NORECOVERY, STATS = 10;
-- 2. Restaurar el backup diferencial más reciente (WITH NORECOVERY)
RESTORE DATABASE UAH_Aplicacion
FROM DISK = 'D:\Backups\UAH_Aplicacion_Diff.bak'
WITH NORECOVERY, STATS = 10;
-- 3. Restaurar backups de log en orden cronológico
RESTORE LOG UAH_Aplicacion
FROM DISK = 'D:\Backups\UAH_Aplicacion_Log_1.trn'
WITH NORECOVERY;
-- 4. Último paso: poner la base de datos online (WITH RECOVERY)
RESTORE DATABASE UAH_Aplicacion WITH RECOVERY;
La opción WITH NORECOVERY mantiene la base de datos en estado restoring para aplicar más backups. WITH RECOVERY aplica el roll forward/roll back final y pone la base de datos online. WITH STANDBY es una opción intermedia que permite acceso de solo lectura entre restauraciones.
Para recuperar hasta un instante exacto (modelo FULL):
RESTORE LOG UAH_Aplicacion
FROM DISK = 'D:\Backups\UAH_Aplicacion_Log_ultimo.trn'
WITH STOPAT = '2024-11-15T09:30:00', RECOVERY;
SQL Server ofrece una interfaz visual en SSMS para crear planes de mantenimiento automáticos que combinen backups, reconstrucción de índices, actualización de estadísticas y verificación de integridad mediante DBCC CHECKDB. Estos planes se implementan como Jobs del SQL Server Agent.
| Aspecto | Oracle Database | Microsoft SQL Server |
|---|---|---|
| Relación instancia/BD | Una instancia = una BD (salvo RAC) | Una instancia = múltiples BD |
| Usuario vs. esquema | Usuario y esquema son inseparables | Usuario y esquema son independientes |
| Puerto por defecto | 1521 (Listener) | 1433 (TCP) |
| Proceso de red | Oracle Listener (lsnrctl) |
SQL Server Browser + servicio TCP |
| Modo archivado | ARCHIVELOG / NOARCHIVELOG | FULL / SIMPLE / BULK_LOGGED |
| Herramienta de backup | RMAN (nativa) | SSMS / T-SQL / SQL Server Agent |
| Lenguaje procedural | PL/SQL | T-SQL |
| Herramienta de admin | TOAD (de pago), SQL Developer (gratuito) | SSMS (gratuito, oficial Microsoft) |
| Scheduler de tareas | DBMS_SCHEDULER | SQL Server Agent |
| Tablas temporales | Tablas globales temporales (GTT) | #tablas y ##tablas (tempdb) |
| Directorio de objetos | DBA_*, ALL_*, USER_*, V$* |
sys.*, INFORMATION_SCHEMA.* |
| Característica | PL/SQL (Oracle) | T-SQL (SQL Server) |
|---|---|---|
| Bloque de código | Estructura formal DECLARE/BEGIN/EXCEPTION/END | Sin estructura formal; código lineal |
| Variables | Sin prefijo (v_nombre) |
Prefijo @ obligatorio (@nombre) |
| Condicional | IF...THEN...ELSIF...ELSE...END IF |
IF...BEGIN...END...ELSE BEGIN...END |
| Bucle | LOOP, WHILE, FOR |
WHILE (no existe FOR LOOP nativo) |
| Manejo de errores | Sección EXCEPTION con WHEN ... THEN |
Bloque TRY...CATCH con funciones ERROR_*() |
| Cursores OLD/NEW | Pseudovariables :OLD y :NEW |
Tablas lógicas inserted y deleted |
| Paquetes | PACKAGE + PACKAGE BODY |
No existe el concepto de paquete |
| Compilación | Los objetos se compilan al crearse en la BD | Igual; compilación JIT en ejecución |
| Tipo booleano | BOOLEAN nativo en PL/SQL |
No existe BOOLEAN; se usa BIT (0/1) |
| Concatenación | Operador \|\| |
Operador + o función CONCAT() |
| Fecha actual | SYSDATE |
GETDATE() o SYSDATETIME() |
| Conversión de tipo | TO_CHAR(), TO_DATE(), TO_NUMBER() |
CAST(), CONVERT(), TRY_CAST() |
| Secuencias | Objeto SEQUENCE |
IDENTITY en columna o SEQUENCE (desde 2012) |
La coexistencia de ambas plataformas implica que los administradores del Servicio de Informática de la UAH deben tener competencias en los dos entornos, aunque el grado de profundidad requerida es mayor en Oracle al ser la plataforma principal.
SQL Server Profiler (heredado) y Extended Events (mecanismo moderno) permiten capturar y analizar eventos de SQL Server en tiempo real: sentencias ejecutadas, tiempos de ejecución, errores, bloqueos. Son esenciales para el diagnóstico de problemas de rendimiento y seguridad.
SSIS es la plataforma ETL (Extract, Transform, Load) de SQL Server. Permite diseñar flujos de trabajo para la integración, transformación y carga de datos entre sistemas heterogéneos. Útil en la UAH para la transferencia de datos entre SQL Server y Oracle o entre aplicaciones distintas.
SSRS es la plataforma de informes y reporting de SQL Server. Permite crear informes tabulares, gráficos y dashboards accesibles a través de un portal web.
Herramienta multiplataforma (Windows, macOS, Linux) de Microsoft para la gestión y desarrollo sobre SQL Server y Azure SQL. Más ligera que SSMS, orientada al desarrollo de consultas y notebooks SQL.
| Término | Definición rápida |
|---|---|
| SQL Server | RDBMS de Microsoft; licenciado en la UAH desde 2023 |
| Instancia SQL Server | Instalación independiente del motor; puede gestionar múltiples BD |
| Puerto 1433 | Puerto TCP por defecto de SQL Server |
| master / msdb / model / tempdb | Bases de datos del sistema de SQL Server |
| T-SQL | Extensión procedural de SQL de Microsoft/Sybase para SQL Server |
| SQL Server Agent | Servicio de automatización y programación de tareas de SQL Server |
| Job | Unidad de trabajo automatizable en SQL Server Agent |
| SSMS | SQL Server Management Studio; herramienta oficial gratuita de administración |
| Recovery Model FULL | Equivalente a ARCHIVELOG de Oracle; permite Point-in-Time Recovery |
| Recovery Model SIMPLE | Equivalente a NOARCHIVELOG de Oracle; no permite backup de log |
| Full Backup | Copia completa de la base de datos |
| Differential Backup | Cambios desde el último Full Backup |
| Log Backup | Copia del log de transacciones; solo en modelos FULL y BULK_LOGGED |
| WITH NORECOVERY | Mantiene la BD en estado restoring para aplicar más backups |
| WITH RECOVERY | Finaliza la restauración y pone la BD online |
inserted / deleted |
Tablas lógicas en triggers T-SQL (equivalente a :NEW/:OLD en Oracle) |
| dbo | Esquema predeterminado en SQL Server |
| sysadmin | Rol de servidor con privilegios totales en SQL Server |
| TRY...CATCH | Estructura de manejo de errores en T-SQL |
| tempdb | BD del sistema para almacenamiento temporal; crítica para el rendimiento |
| SSIS | SQL Server Integration Services; plataforma ETL de Microsoft |
@, TRY...CATCH en lugar de EXCEPTION, inserted/deleted en triggers en lugar de :NEW/:OLD.WITH NORECOVERY en todos los pasos previos al último.