Saltar a contenido

MS SQL Server

3. MS SQL Server

3.1 Crear el archivo docker-compose.yml

cat > ~/ia-lab/services/motores-bd/mssql/docker-compose.yml << 'EOF'
services:
  mssql:
    image: mcr.microsoft.com/mssql/server:2022-latest
    container_name: mssql-server
    restart: unless-stopped
    user: root
    env_file:
      - .env
    ports:
      - "0.0.0.0:1433:1433"
    volumes:
      - ../../../data/mssql:/var/opt/mssql
      - /mnt/d/academia/bd:/backups
    networks:
      - ia-lab-network
    healthcheck:
      test: ["CMD-SHELL", "/opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P $$MSSQL_SA_PASSWORD -C -Q 'SELECT 1' || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 10
      start_period: 40s

networks:
  ia-lab-network:
    external: true
EOF

Habilitar UFW y permitir el puerto 1433 (SQL Server) en el host:

sudo ufw allow 1433/tcp
sudo ufw enable
sudo ufw status

3.2 Crear el archivo .env

cat > ~/ia-lab/services/motores-bd/mssql/.env << 'EOF'
TZ=America/Bogota
ACCEPT_EULA=Y
MSSQL_SA_PASSWORD=MiNiCo57**
MSSQL_PID=Developer
EOF

MSSQL_PID no es un usuario. Es la edición de SQL Server (Developer, Express, Evaluation, etc.).

El usuario administrador que crea el contenedor siempre se llama SA (System Administrator), igual que MySQL usa root y PostgreSQL usa postgres.

Por eso en el .env van juntas dos cosas distintas:

Variable Qué es Valor
MSSQL_PID Edición / licencia del motor Developer
MSSQL_SA_PASSWORD Contraseña del usuario SA MiNiCo57**

Al conectar (sqlcmd, DBeaver) el usuario es SA, no Developer. Si pones MSSQL_PID=sa, SQL Server no reconoce esa edición y el contenedor falla.

Editar la clave del .env en clase:

cd ~/ia-lab/services/motores-bd/mssql
sudo nano .env

Cambiar:

MSSQL_SA_PASSWORD=Abc123456**
MSSQL_PID=Developer
Ctrl + o  ==>  para guardar
Ctrl + x  ==>  para salir

SQL Server exige una clave compleja para SA (mayuscula, minuscula, numero y simbolo). Si el contenedor no arranca, deja MiNiCo57** o usa Abc123456**.

3.3 Crear README.md

cat > ~/ia-lab/services/motores-bd/mssql/README.md << 'EOF'
# SQL Server 2022 - Motor de Base de Datos

> **Acceso remoto habilitado.** Puerto expuesto en `0.0.0.0:1433`.
> **Edición (MSSQL_PID):** `Developer`
> **Usuario por defecto:** `SA`
> **Password:** `MiNiCo57**`

---

## Conectar desde WSL (local)

```bash
sudo docker exec -it mssql-server /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P 'MiNiCo57**' -C

3.4 Levantar SQL Server

cd ~/ia-lab/services/motores-bd/mssql
sudo docker compose up -d

Verificar que está corriendo:

sudo docker ps | grep mssql-server
sudo docker logs mssql-server --tail 20

3.5 Instalar mssql-tools en WSL

Estos pasos instalan mssql-tools18 y unixODBC en Ubuntu 24.04 para administrar y conectarse a SQL Server ejecutado mediante Docker.

3.5.1 Actualizar e instalar los paquetes requeridos

sudo apt update && sudo apt install -y curl ca-certificates gnupg

3.5.2 Eliminar repositorios antiguos o duplicados de Microsoft

Esto evita conflictos con configuraciones anteriores de Ubuntu 22.04 (jammy) y con el método obsoleto apt-key.

sudo rm -f /etc/apt/sources.list.d/mssql-release.list
sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list

3.5.3 Descargar el repositorio oficial de Microsoft para Ubuntu 24.04

cd /tmp

curl -sSL -O https://packages.microsoft.com/config/ubuntu/24.04/packages-microsoft-prod.deb

3.5.4 Instalar el repositorio oficial de Microsoft

sudo dpkg -i packages-microsoft-prod.deb

3.5.5 Actualizar los repositorios

sudo apt update

3.5.6 Verificar el repositorio de Microsoft

grep -R "packages.microsoft.com" /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/null

3.5.7 Instalar Microsoft SQL Server Tools 18 y unixODBC

sudo ACCEPT_EULA=Y apt install -y mssql-tools18 unixodbc-dev

3.5.8 Agregar mssql-tools18 al PATH

echo 'export PATH="$PATH:/opt/mssql-tools18/bin"' >> ~/.bashrc

3.5.9 Recargar la configuración de Bash

source ~/.bashrc

3.5.10 Verificar que sqlcmd esté instalado

which sqlcmd

El resultado esperado es:

/opt/mssql-tools18/bin/sqlcmd

3.6 Conectar localmente a SQL Server

sudo docker exec -it mssql-server /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P 'MiNiCo57**' -C

COMANDOS BASICOS DENTRO DEL MOTOR: ** Solo usarlo cuando se requiera, no hacelo en instalacion **

Crear una base de datos

CREATE DATABASE nombre_bd;
GO

En clase (distinta a la base por defecto del contenedor):

CREATE DATABASE bd_clase1;
GO

Listar todas las bases de datos

SELECT name FROM sys.databases;
GO

Eliminar una base de datos

No puedes eliminar la base que estás usando. Cambia a master y luego:

USE master;
GO
DROP DATABASE nombre_bd;
GO

Entrar a una base de datos

USE nombre_bd;
GO

En clase:

USE bd_clase1;
GO

Listar las tablas

SELECT name FROM sys.tables;
GO

Listar los campos de una tabla

SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'nombre_tabla';
GO

Salir del motor

QUIT

3.7 Crear un usuario PROPIO con ACCESO REMOTO

Conectate primero como SA, luego ejecuta.

Parte explicativa. Reemplaza usuario, password y nombre_bd por tus valores:

CREATE DATABASE nombre_bd;
GO

CREATE LOGIN usuario WITH PASSWORD = 'password';
GO

USE nombre_bd;
GO
CREATE USER usuario FOR LOGIN usuario;
GO

ALTER ROLE db_owner ADD MEMBER usuario;
GO

Aplicado en clase. Copiar y pegar (Usuario: admin / Contraseña: 123456):

CREATE LOGIN admin WITH PASSWORD = '123456', CHECK_POLICY = OFF;
GO

ALTER SERVER ROLE sysadmin ADD MEMBER admin;
GO

ALTER LOGIN admin ENABLE;
GO

CHECK_POLICY = OFF desactiva la política de complejidad de SQL Server solo para este login. Por eso 123456 sí sirve para crear admin. Sin esa opción, SQL Server rechaza la clave. No aplica a SA: la clave de MSSQL_SA_PASSWORD en el .env sigue exigiendo mayúscula, minúscula, número y símbolo.

3.8 Conectar remotamente desde cualquier equipo

** Hacerlo desde DBEAVER **

Reemplaza los valores correspondientes en Host

En el terminal de wsl-ubuntu

ip a

Luego, buscar la IP a la linea de Eth0

y esa direccion colocarla en Host

  • Host: IP_SERVIDOR
  • Port: 1433
  • User: SA
  • Password: MiNiCo57**
  • Database: tecnogua
  • Authentication: SQL Server (no Windows)
  • Encrypt / Trust server certificate: activado (true)

MSSQL_PID=Developer es la edición del motor. El usuario de conexión sigue siendo SA, no Developer.

3.9 Backup de una base de datos

sudo docker exec mssql-server /opt/mssql-tools18/bin/sqlcmd -S localhost -U SA -P 'MiNiCo57**' -C -Q "BACKUP DATABASE [tecnogua] TO DISK = N'/backups/backup_tecnogua.bak' WITH INIT"

3.9 Variables clave del .env

Variable Descripcion
TZ Zona horaria
ACCEPT_EULA Acepta la licencia de SQL Server (Y)
MSSQL_SA_PASSWORD Password del usuario SA (MiNiCo57**)
MSSQL_PID Edicion de SQL Server (Developer)