---
id: database-sqlserver
title: "SQL Server"
shortTitle: "SQL Server"
track: database
trackTitle: "Database"
order: 3
level: important
status: published
estimatedMinutes: 35
prerequisites:
  - database-mongo
next: database-cassandra
reviewedAgainst: 2026-10-12
sources:
  - title: "SQL Server on Linux containers"
    url: https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-docker-container-deployment?view=sql-server-ver17
  - title: "Environment variables for SQL Server on Linux"
    url: https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver17
---

# SQL Server

SQL Server gặp trên hệ .NET và trên Azure SQL. Cách vận hành giống bài PostgreSQL: login riêng, không dùng `sa` cho app, và có backup. Lab dùng container, cần khoảng 2 GB RAM. Máy không đủ thì đọc lệnh và bỏ qua `docker run`.

## Để làm gì

Chạy một instance lab, tạo login cho app, và viết được lệnh backup mà không để password trong lịch sử shell lâu dài.

## Gồm những gì

- `ACCEPT_EULA` và `MSSQL_SA_PASSWORD`.
- Login và user trong database.
- `BACKUP DATABASE` ra file trong container.

Không gồm Always On, hay Agent job. Không cần bản Enterprise.

## Dùng khi nào

App đang dùng `System.Data.SqlClient` hoặc một database Azure SQL. Bài PostgreSQL không thay được cú pháp backup và tên login của SQL Server.

Đừng đưa password `sa` vào connection string của app. `sa` tắt được cả server. App dùng login chỉ có quyền trên một database.

## Kiến thức cốt lõi

Image chính thức là `mcr.microsoft.com/mssql/server`. Container cần `ACCEPT_EULA=Y`. Password của `sa` đặt bằng `MSSQL_SA_PASSWORD`. Biến `SA_PASSWORD` đã bị Microsoft đánh deprecated. Password ít nhất 8 ký tự và đủ ba trong bốn nhóm: chữ hoa, chữ thường, số, ký tự đặc biệt.

Login là account của instance. User là principal trong một database. Tạo login rồi `CREATE USER ... FOR LOGIN` trong database đó. App nối bằng login này.

Port mặc định 1433. Không mở port đó ra Internet. Backup là file `.bak` trong instance. Copy ra khỏi container nếu bạn cần giữ sau `docker rm`.

## Lệnh và code mẫu

```bash
docker run -d --name lab-mssql -p 1433:1433 \
  -e ACCEPT_EULA=Y \
  -e MSSQL_SA_PASSWORD='Lab-Passw0rd' \
  mcr.microsoft.com/mssql/server:2022-latest
```

Đợi instance sẵn, rồi trong container:

```bash
docker exec -it lab-mssql /opt/mssql-tools18/bin/sqlcmd -S localhost -U sa -P "Lab-Passw0rd" -C -Q "SELECT @@VERSION"
```

Image 2022 có lúc để tool ở `/opt/mssql-tools/bin/sqlcmd` thay vì `mssql-tools18`. Nếu đường dẫn đầu báo không có file, dùng đường dẫn còn lại.

Tạo login, chỉ chạy trên lab:

```sql
CREATE LOGIN app WITH PASSWORD = 'Lab-App-Passw0rd';
CREATE DATABASE appdb;
USE appdb;
CREATE USER app FOR LOGIN app;
```

Dọn:

```bash
docker rm -f lab-mssql
```

## Thực hành

1. Nếu máy còn khoảng 2 GB RAM trống, chạy container và `SELECT @@VERSION`.
2. Không đủ RAM thì đọc biến môi trường và câu `CREATE LOGIN`, không kéo image.
3. Xóa container. Password trong bài chỉ dùng cho lab này.

## Kết quả mong đợi

`@@VERSION` in một dòng Microsoft SQL Server. Hoặc bạn chủ động bỏ lab và vẫn chỉ ra được biến `MSSQL_SA_PASSWORD`.

## Checklist

- [ ] App không dùng login `sa`.
- [ ] Port 1433 không có rule ra Internet.
- [ ] File backup được copy ra khỏi đĩa của riêng container.

## Lỗi thường gặp

**Container thoát ngay.** Password yếu hoặc thiếu `ACCEPT_EULA`. `docker logs lab-mssql` nói rõ. Đổi password cho đủ policy, không tắt policy.

**`sqlcmd` không có trong PATH.** Gọi đúng file dưới `/opt/mssql-tools18/bin` hoặc `/opt/mssql-tools/bin`. Đừng cài thêm một bản SQL Server trên máy host chỉ để có client.

## Nguồn

1. [SQL Server containers](https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-docker-container-deployment?view=sql-server-ver17) — image và cổng.
2. [Environment variables](https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-configure-environment-variables?view=sql-server-ver17) — `ACCEPT_EULA`, `MSSQL_SA_PASSWORD`.

## Tiếp theo

[Cassandra](./04-cassandra.md)
