# SQL Server Container Setup

This repository contains a containerized SQL Server setup with initialization scripts and configuration options.

## Prerequisites

- Docker and Docker Compose installed on your system
- At least 2GB of available memory for SQL Server
- Port 1433 available on your host machine

## Quick Start

### Starting the Container

With environment variables:
```bash
docker-compose -f docker-compose-infra.yml up -d
```

Without environment variables (uses defaults):
```bash
ACCEPT_EULA=Y MSSQL_PID=Express SA_PASSWORD=YourStrong@Passw0rd docker-compose -f docker-compose-infra.yml up -d
```

### Building the Container

```bash
docker-compose -f docker-compose-infra.yml build
```

### Stopping and Removing the Container

Stop the container:
```bash
docker-compose -f docker-compose-infra.yml down
```

Remove container and persistent volume:
```bash
docker-compose -f docker-compose-infra.yml down -v
```

## Configuration

### Environment Variables

| Variable | Description | Default Value |
|----------|-------------|---------------|
| SA_PASSWORD | SQL Server SA user password | YourStrong@Passw0rd |
| DROP_DATABASE | Flag to drop existing database on startup | false |
| ACCEPT_EULA | Accept SQL Server EULA | Y |
| MSSQL_PID | SQL Server edition | Express |

### Ports

- **1433**: SQL Server port (mapped to host machine)

### Volumes

- **sqlserver_data**: Persistent storage for SQL Server data
- **./logs**: Container logs directory

## Setup Process

The container uses `setup.sh` as its entry point, which handles the complete initialization process:

### Startup Sequence

1. Starts SQL Server in the background
2. Waits up to 50 seconds for SQL Server to be ready
3. Performs health checks using sqlcmd
4. Handles database initialization or reset based on environment variables

### Database Management

- Checks for existing database (`st-database`)
- Drops database if DROP_DATABASE=true
- Verifies database initialization status by checking for key tables
- Runs initialization scripts only if needed

### Script Execution Order

1. Runs `init.sql` to create the database and schemas
2. Executes all SQL scripts in the `schemas` directory
3. Handles GO statements automatically with proper spacing
4. Maintains container operation after setup

### Error Handling

- Provides detailed logging for each step
- Continues despite non-critical script errors
- Exits with proper status codes for critical failures

## Database Initialization

The container automatically:

1. Initializes SQL Server
2. Creates the database 'st-database' if it doesn't exist
3. Creates the following schemas:
   - fp
   - fw
   - int
   - ob

### Database Reset

To reset the database:
```bash
DROP_DATABASE=true docker-compose -f docker-compose-infra.yml up -d
```

## Extract Scripts

The container includes several utility scripts for managing database objects:

### extract_tables.sh
- Extracts table definitions into separate files
- Usage: `./extract_tables.sh <sql_file>`
- Output directory: `sql_objects/tables`

### extract_constraints.sh
- Extracts table constraints and foreign keys
- Usage: `./extract_constraints.sh <sql_file>`
- Output directories: 
  - `sql_objects/constraints`
  - `sql_objects/foreign_keys`

### extract_indexes.sh
- Extracts index definitions
- Usage: `./extract_indexes.sh <sql_file>`
- Output directories:
  - `sql_objects/indexes/clustered`
  - `sql_objects/indexes/nonclustered`
  - `sql_objects/indexes/unique_clustered`

### extract_views.sh
- Extracts view definitions
- Usage: `./extract_views.sh <sql_file>`
- Output directory: `sql_objects/views`

### extract_procedures.sh
- Extracts stored procedure definitions
- Usage: `./extract_procedures.sh <sql_file>`
- Output directory: `sql_objects/procedures`

## Resource Limits

The container is configured with the following resource constraints:

- Memory: 2GB minimum (required for SQL Server)
- CPU: Limited to 1 core, with 0.25 core reserved

## Health Checks

The container includes a health check that:
- Runs every 10 seconds
- Verifies SQL Server connectivity
- Allows 10 retries before marking as unhealthy
- Has a 10-second startup grace period

## Troubleshooting

If the container fails to start:
1. Ensure at least 2GB of memory is available
2. Check the logs directory for detailed error messages
3. Verify the port 1433 is not in use by another service
4. Check SQL Server logs: `docker logs sql1`
5. Verify SQL Server is running: `docker exec sql1 /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P $SA_PASSWORD -Q "SELECT @@VERSION"`

The container will automatically restart unless explicitly stopped.