Docker で SQL Server を使う

参考ページ
[クイック スタート:Docker を使用して SQL Server Linux コンテナー イメージを実行する](https://learn.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-docker?view=sql-server-ver16&pivots=cs1-bash)

## Docker の設定

```bash
docker pull mcr.microsoft.com/mssql/server:2022-latest
```

```bash
sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Password1" \
   -p 1433:1433 --name sql1 --hostname sql1 \
   -d \
   mcr.microsoft.com/mssql/server:2022-latest
```

## ログイン

```bash
docker exec -it sql1 "bash"
```

## SQL Server に接続

接続スクリプト

```bash
/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Password1
```

実行例

```text
mssql@sql1:/$  /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Password1
1> select @@version
2> go
                                                                                                                                                                                                                                                                                                            
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2022 (RTM-CU11) (KB5032679) - 16.0.4105.2 (X64) 
	Nov 14 2023 18:33:19 
	Copyright (C) 2022 Microsoft Corporation
	Developer Edition (64-bit) on Linux (Ubuntu 22.04.3 LTS) <X64>                                                                                                      

(1 rows affected)
1>
```

## データベースの作成

```text
$ /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Password1
1> create database city
3> use city
4> go
Changed database context to 'city'.
1> create table cities  (id nvarchar (10) primary key,name nvarchar (20),population int ,date_mod datetime)
2> go
1> insert into cities (id,name,population,date_mod) values ('t1071',N'前橋',48517,'2001-5-24')
2> go

(1 rows affected)
1> insert into cities  (id,name,population,date_mod) values ('t1072',N'高崎',19536,'2001-3-15')
2> go

(1 rows affected)
1> insert into cities (id,name,population,date_mod) values ('t1073',N'桐生',89714,'2001-7-30')
2> go

(1 rows affected)
1> select id,name,population,date_mod from cities
2> go
id         name                 population  date_mod               
---------- -------------------- ----------- -----------------------
t1071      前橋                         48517 2001-05-24 00:00:00.000
t1072      高崎                         19536 2001-03-15 00:00:00.000
t1073      桐生                         89714 2001-07-30 00:00:00.000

(3 rows affected)
1>exit
$
```

## ベースになっている OS

```text
mssql@sql1:/$ cat /etc/os-release 
PRETTY_NAME="Ubuntu 22.04.3 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.3 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy
```

## 外部からの接続

Docker の IP アドレスを調べる

<ol>
<li>Container ID を調べる</li>

```text
$ docker ps
CONTAINER ID   IMAGE                                        COMMAND                  CREATED      STATUS          PORTS                                       NAMES
38dab9d6364d   mcr.microsoft.com/mssql/server:2022-latest   "/opt/mssql/bin/perm…"   7 days ago   Up 37 minutes   0.0.0.0:1433->1433/tcp, :::1433->1433/tcp   sql1
```

<li>CONTAINER ID が、38dab9d6364d　の IPアドレスを調べる</li>

```text
$ docker inspect 38dab9d6364d | grep IPAddress
            "SecondaryIPAddresses": null,
            "IPAddress": "172.17.0.2",
                    "IPAddress": "172.17.0.2",
```

</ol>

接続

```text
$ sqlcmd -S 172.17.0.2 -U SA -P Password1 -C
1> select * from cities
2> go
id         name                 population  date_mod               
---------- -------------------- ----------- -----------------------
t1071      前橋                         48517 2001-05-24 00:00:00.000
t1072      高崎                         19536 2001-03-15 00:00:00.000
t1073      桐生                         89714 2001-07-30 00:00:00.000

(3 rows affected)
```

-C をつけないと次のようになります。

```text
$ sqlcmd -S 172.17.0.2 -U SA -P Password1
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : SSL Provider: [error:0A000086:SSL routines::certificate verify failed:self-signed certificate].
Sqlcmd: Error: Microsoft ODBC Driver 18 for SQL Server : Client unable to establish connection.
```

## Ubuntu 23.04 に sqlcmd をインストール

```bash
sudo apt install mssql-tools18 unixodbc-dev
```

環境設定

```text:$HOME/.bashrc
（省略）
export PATH=$PATH:/opt/mssql-tools18/bin
```

## 参考情報

[sqlcmd - ユーティリティの使用](https://learn.microsoft.com/ja-jp/sql/tools/sqlcmd/sqlcmd-use-utility?view=sql-server-ver16)

```text
サーバーの証明書を信頼し、その有効性を検証しないように設定するには、
クライアント側で -C スイッチを使用します。 
このオプションは、ADO.net オプションの TRUSTSERVERCERTIFICATE = trueと同等です。
```

## SQL文

データベースの一覧

```sql
SELECT name, database_id, create_date FROM sys.databases
```