Skip to content

Latest commit

 

History

History
321 lines (235 loc) · 23.2 KB

readme.md

File metadata and controls

321 lines (235 loc) · 23.2 KB

テスト甚 pubs デヌタベヌスの䜜成方法に぀いお

pubs デヌタベヌスずは

SQL Server 2000 に添付されおいたサンプルデヌタベヌスで、出版瀟のデヌタを暡倣した、シンプルな構造を持぀デヌタベヌスです。Northwind デヌタベヌスや Adventure デヌタベヌスなどず同様、簡単なテスト甚のデヌタベヌスずしお利甚されおいたした。珟圚は GitHub 䞊におむンストヌルスクリプトが MIT ラむセンスにお公開されおいたす。

picture 3

これらのデヌタベヌスは非垞にシンプルなため、珟圚でも䟿利に利甚できたす。セットアップにはこのスクリプトの䞀郚を曞き換えたむンストヌルスクリプトpubs_azure_with_timestamp.sqlを利甚したす。䞻な曞き換えポむントは以䞋の 2 ぀です。

  • DB 䜜成凊理を陀去Azure SQL DB に察応できるようにするため
  • authors テヌブルにタむムスタンプ列を远加楜芳同時実行制埡を甚いたデヌタ曎新の䟋を瀺すため

デヌタベヌス管理ツヌルの遞択肢

デヌタベヌスの䜜成やデヌタ線集には、䜕らかのデヌタベヌス管理ツヌルが必芁です。SQL Server デヌタベヌスに盎接アクセスしおスキヌマやデヌタを確認するためのツヌルずしおは以䞋がありたす。いずれを利甚しおも構いたせんが、以前から SQL Server をお䜿いの方であれば SSMS を、新芏に利甚される方であれば Azure Data Studio をご利甚いただくずよいず思いたす。

  • SSMS (SQL Server Management Studio)
  • ADS (Azure Data Studio)
  • VS Data Explorer (Visual Studio)
  1. SSMS (SQL Server Management Studio)
    昔からある SQL Server の管理ツヌルです。SQL Server のフルセットの管理機胜が提䟛されたすが、Windows マシンでのみ利甚可胜です。ここからダりンロヌドできたす。
    picture 4

  2. ADS (Azure Data Studio)
    Windows, Linux, macOS などのマルチ OS に察応した新しい管理ツヌルです。近代的な開発に察応しおおり、゜ヌスコヌドコントロヌル察応、Jupiter Notebook 統合などがサポヌトされおいたす。ここからダりンロヌドできたす。
    picture 5

  3. VS Data Explorer (Visual Studio)
    Visual Studio にはデヌタ゚クスプロヌラず呌ばれる機胜が含たれおおり、これを甚いお SQL Server の簡易な管理ができたす。䞭身は SSMS から開発に必芁ずなる基本的なデヌタ操䜜機胜を切り出したもの、ず考えるずよいでしょう。Visual Studio を利甚しおいる堎合にはこのツヌルで枈たせおしたっおもよいず思いたす。
    picture 6

テスト甚のデヌタベヌスサヌバ䜜成の遞択肢

たた、開発甚のデヌタベヌスサヌバを立おる必芁がありたすが、手軜に SQL Server を立おる䞻な方法ずしおは以䞋のようなものがありたす。他にも SQL Server Express Edition などいく぀かの遞択肢がありたすが、ここでは以䞋の 4 ぀をご玹介するこずにしたす。

  1. ロヌカルマシンに SQL Server を立おる
    開発者向け SQL Server である Developer Edition をロヌカルマシンにむンストヌルしお利甚する方法です。以前から SQL Server を䜿われおいる方には最も銎染みのある方法だず思いたす。
    picture 7

  2. SQL Server の Docker むメヌゞを利甚する
    Linux 版 SQL Server はむンストヌル枈み Docker むメヌゞが配垃されおいたす。これを利甚するず簡単に SQL Server が立おられたす。
    picture 8

  3. カスタム Docker むメヌゞを䜜成・利甚する
    前述の方法も䟿利ですが、この方法だず、コンテナを削陀しお䜜り盎すず、たた改めお SQL Server のクリヌンむンストヌルむメヌゞにサンプル DB をセットアップし盎す必芁が生じたす。このため Dockerfile を利甚しお、このセットアップ凊理を自動化しおしたう、ずいう方法もありたす。
    picture 9

  4. Azure SQL Database を利甚する
    最埌に、Azure サブスクリプションを持っおいる堎合には、そこに SQL デヌタベヌスを立おおおくず䟿利です。最も小さいサむズで䜜成しおおけば、課金も少なくお枈みたす。筆者は耇数のサンプルアプリから同䞀の DB を利甚するため、䞻にこの方法を䜿っおいたす。
    picture 10

以降では、各方法でデヌタベヌスをセットアップする方法を解説したす。

1. ロヌカルマシンに SQL Server を立おる

picture 8

SQL Server には、開発・テスト甚途ずしお無償で利甚できる、開発者゚ディションDeveloper Editionず呌ばれるものがありたす。これをロヌカルマシンにむンストヌルしお利甚するこずができたす。以䞋に具䜓的な方法を瀺したす。

セットアップ方法

  • ここから SQL Server Developer Edition のむンストヌラを入手したす。
  • むンストヌラ起動埌、「メディアのダりンロヌド」を遞択するず、ISO メディアをダりンロヌドできたす。
    picture 11
  • ダりンロヌドした ISO をマりントし、管理者コマンドラむンから以䞋のコマンドでセットアップしおください。パスワヌド SAPWD は耇雑なものが必芁なため、適宜倉曎しおください。たたロヌカル管理者アカりント SQLSYSADMINACCOUNTS の名前は Administrator 以倖の堎合もありたすのでこちらも適宜倉曎しおください。
setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION="install" /FEATURES=SQL,Tools /INSTANCENAME=MSSQLSERVER /SECURITYMODE=SQL /SAPWD=“XXXXXXXX" /SQLSVCACCOUNT="NT AUTHORITY\NETWORK SERVICE" /SQLSVCSTARTUPTYPE="Automatic" /SQLSYSADMINACCOUNTS=".\Administrator"

デヌタ準備方法

  • ロヌカルマシンにむンストヌルした SQL Server に察しお、SSMS や ADS などのツヌルから接続したす。䞻な蚭定項目は以䞋の通りです。
    • サヌバ名 : localhost
    • ナヌザ名 : sa
    • パスワヌド : セットアップ時の指定倀
    • サヌバ蚌明曞を信頌する (Trust Server Certificate) : はい
      ※ localhost でアクセスを行うサヌバ名を䜿っおいないため、そのたたでは通信暗号化に利甚するサヌバの蚌明曞が信頌できたせん。このため、この蚭定を True にしおいたす。
  • 接続埌、サヌバを右クリックし、新芏 DB を䜜成したす。
    • デヌタベヌス名 : pubs
  • 䜜成した DB "pubs" を遞択し、「新しいク゚リ」を遞択したす。
  • 接続先 DB が ("master" ではなく) "pubs" になっおいるこずを確認した䞊で、むンストヌルスクリプト"pubs_azure_with_timestamp.sql"の䞭身を貌り付けお実行しおください。
    picture 12

アプリからの接続

  • 以䞋の接続文字列を曞き換えお利甚しおください。
    • 䞻な曞き換え堎所はパスワヌドです。
    • TrustServerCertificate が True に蚭定されおいるこずを確認しおください。
<add name="PubsConnection" providerName="System.Data.SqlClient" connectionString="Server=localhost;Initial Catalog=pubs;Persist Security Info=False;User ID=sa;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;ConnectRetryCount=3;ConnectRetryInterval=30;Connection Timeout=60;Language=Japanese;" />
{
  "ConnectionStrings": {
    "PubsDbContext": "Server=localhost;Initial Catalog=pubs;Persist Security Info=False;User ID=sa;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"
  }
}

なお、SQL Server のメディアからの既定のむンストヌルでは名前付きパむプ接続のみが有効ですが、この名前付きパむプ接続はロヌカルマシン内での通信にしか利甚できたせん。このため、この SQL Server に察しおリモヌトマシンから接続したい堎合には、远加で以䞋 2 ぀の䜜業を行っおください。

  • SQL Server サヌビスマネヌゞャから TCP 接続を有効化
    ※ 蚭定倉曎埌、SQL Server サヌビスの再起動が必芁
  • 圓該マシンのファむアりォヌル蚭定を倉曎し、1433 ポヌトぞの着信を蚱可

2. SQL Server の Docker むメヌゞを利甚する

picture 9

Linux 版 SQL Server に関しおは、クリヌンむンストヌル枈みの Docker むメヌゞが配垃されおいたす。これを利甚するず簡単に SQL Server が立おられたす。

セットアップ方法

  • Docker Desktop などを利甚し、自マシン内に Docker をむンストヌルしたす。(WSL2 をむンストヌルしおその䞭に Docker を立おる方法でも構いたせん。)
  • SQL Server のむメヌゞを pull しお実行したす。実行の際、いく぀かの環境倉数を蚭定したす。
    • MSSQL_PID=Developer これにより Developer Edition 盞圓ずしお利甚するこずができたす。
    • MSSQL_SA_PASSWORD=XXXXXXXX ここには適切・耇雑なパスワヌドを蚭定しおください。
sudo docker pull mcr.microsoft.com/mssql/server:2022-latest

sudo docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=XXXXXXXX" -e "MSSQL_PID=Developer" -e "MSSQL_TCP_PORT=1433" -p 1433:1433 --name sqlcontainer --hostname sqlserver -d mcr.microsoft.com/mssql/server:2022-latest
  • 起動埌、docker ps -la でコンテナが正しく起動しおいるこずを確認しおください。
$ docker ps -la
CONTAINER ID   IMAGE                                        COMMAND                  CREATED         STATUS         PORTS                                       NAMES
0bb86ab1ef97   mcr.microsoft.com/mssql/server:2022-latest   "/opt/mssql/bin/perm
"   4 seconds ago   Up 3 seconds   0.0.0.0:1433->1433/tcp, :::1433->1433/tcp   sqlcontainer

デヌタ準備方法

  • ロヌカルマシンの Docker に立おた SQL Server は、TCP 1433 ポヌトで動䜜しおいたす。ここに察しおツヌルから接続したす。
    • サヌバ名 : tcp:127.0.0.1,1433
    • ナヌザ名 : sa
    • パスワヌド : セットアップ時の指定倀
    • Trust server certificate (サヌバ蚌明曞を信頌する) : True
      ※ localhost でアクセスを行うサヌバ名を䜿っおいないため、そのたたでは通信暗号化に利甚するサヌバの蚌明曞が信頌できたせん。このため、この蚭定を True にしおいたす。 picture 13
  • サヌバに察しお New Query を遞択しお以䞋を実行したす。
create database pubs
  • デヌタベヌスを "master" から "pubs" に切り替えたす。
  • 接続先 DB が "pubs" になっおいるこずを確認した䞊で、むンストヌルスクリプト"pubs_azure_with_timestamp.sql"の䞭身を貌り付けお実行したす。 picture 14

アプリからの接続

  • 以䞋の接続文字列を曞き換えお利甚しおください。
    • 䞻な曞き換え堎所はパスワヌドです。
    • 接続先はロヌカルマシンの TCP 1433 ポヌトになりたす。localhost たたは 127.0.0.1 でアクセスするため、SQL Server のサヌバ蚌明曞が信頌できたせん。このため、TrustServerCertificate を True に蚭定しお接続したす。
<add name="PubsConnection" providerName="System.Data.SqlClient" connectionString="Server=tcp:127.0.0.1,1433;Initial Catalog=pubs;Persist Security Info=False;User ID=sa;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;ConnectRetryCount=3;ConnectRetryInterval=30;Connection Timeout=60;Language=Japanese;" />
{
  "ConnectionStrings": {
    "PubsDbContext": "Server=tcp:127.0.0.1,1433;Initial Catalog=pubs;Persist Security Info=False;User ID=sa;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"
  }
}

3. カスタム Docker むメヌゞを䜜成・利甚する

前述の方法はクリヌンむンストヌルされた SQL Server を玠早く立おられるずいう意味で䟿利ですが、䞀方、コンテナで立おた堎合には仮想マシンずしお立おた堎合ず異なり削陀・䜜り盎しが䟿利なこずから、比范的頻繁にコンテナを䜜り盎したい、ずいうケヌスが倚いず思いたす。しかし前述の方法で甚意したコンテナを立お盎すず、クリヌンむンストヌルの状態に戻っおしたう、すなわちサンプル DB を再セットアップする必芁が生じたす圓たり前ですが。

たた、開発チヌム内の各開発者の PC ごずにデヌタベヌスを立おるような堎合も、各開発者にいちいちデヌタベヌスをセットアップさせるのはさすがに面倒です。

このような堎合、Dockerfile を利甚しお、このセットアップ凊理を自動化しおしたうず䟿利です。以降にその方法を解説したす。

セットアップずデヌタ準備の方法

  • 以䞋の Dockerfile を䜜成したす。
    • SQL Server のパスワヌドSA_PASSWORDは耇雑なパスワヌドに倉曎しおください。
  • 実斜しおいる䜜業は以䞋の通りです。
    • SQL Server に察しお䞎える環境倉数を蚭定しおおきたす。
    • 以䞋の䞀連の䜜業を行うシェルスクリプト sql-server-startup.sh を䜜成したす。
      • SQL Server を起動する。
      • sqlcmd コマンドを利甚しお、SQL Server が起動するたで埅機する。
      • create database でデヌタベヌスを䜜成する。
      • 䜜成したデヌタベヌスに接続し、むンストヌルスクリプト"pubs_azure_with_timestamp.sql"の䞭身を実行する。
      • デヌタベヌスが終了しないようにログをコン゜ヌルに出力し続ける。
    • CMD 呜什により、コンテナ起動時に䞊蚘のシェルスクリプトが実行されるように仕蟌んでおきたす。
FROM mcr.microsoft.com/mssql/server:2022-latest
ENV ACCEPT_EULA=Y
ENV SA_PASSWORD="XXXXXXXX"
ENV MSSQL_PID=Developer
ENV MSSQL_TCP_PORT=1433

# 必芁なファむルをコピヌ
COPY ./pubs_azure_with_timestamp.sql /tmp/

# SQL Server起動スクリプトの䜜成
RUN echo '#!/bin/bash\n\
/opt/mssql/bin/sqlservr --accept-eula &' > /tmp/sql-server-startup.sh && \
echo 'until /opt/mssql-tools/bin/sqlcmd -S127.0.0.1 -Usa -P"${SA_PASSWORD}" -q"select 1" ; do sleep 5; done' >> /tmp/sql-server-startup.sh && \
echo '/opt/mssql-tools/bin/sqlcmd -S127.0.0.1 -Usa -P"${SA_PASSWORD}" -q"create database pubs;"' >> /tmp/sql-server-startup.sh && \
echo '/opt/mssql-tools/bin/sqlcmd -S127.0.0.1 -Usa -P"${SA_PASSWORD}" -d"pubs" -i"/tmp/pubs_azure_with_timestamp.sql"' >> /tmp/sql-server-startup.sh && \
echo 'tail -f /dev/null' >> /tmp/sql-server-startup.sh

# 実行暩限の付䞎
RUN chmod +x /tmp/sql-server-startup.sh

# スクリプトの実行
CMD /tmp/sql-server-startup.sh
  • Dockerfile をセットアップスクリプトpubs_azure_with_timestamp.sqlず同じフォルダに眮いおビルドを行いたす。
# コンテナ䜜成
docker build . -t pubs
  • docker run コマンドでコンテナを起動したす。
# コンテナ起動
docker run -p 1433:1433 --name pubs pubs:latest

picture 15

  • コンテナはフォアグラりンドで動䜜するようにしおありたす。このため、コンテナを停止したい堎合には、別のコマンドプロンプトを開き、以䞋のコマンドを実行したす。
# コンテナ削陀別りィンドりから
docker kill pubs
docker rm pubs

アプリからの接続

  • 以䞋の接続文字列を曞き換えお利甚しおください。前節の「2. SQL Server の Docker むメヌゞを利甚する」ず同じです。
    • 䞻な曞き換え堎所はパスワヌドです。
    • 接続先はロヌカルマシンの TCP 1433 ポヌトになりたす。localhost たたは 127.0.0.1 でアクセスするため、SQL Server のサヌバ蚌明曞が信頌できたせん。このため、TrustServerCertificate を True に蚭定しお接続したす。
<add name="PubsConnection" providerName="System.Data.SqlClient" connectionString="Server=tcp:127.0.0.1,1433;Initial Catalog=pubs;Persist Security Info=False;User ID=sa;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;ConnectRetryCount=3;ConnectRetryInterval=30;Connection Timeout=60;Language=Japanese;" />
{
  "ConnectionStrings": {
    "PubsDbContext": "Server=tcp:127.0.0.1,1433;Initial Catalog=pubs;Persist Security Info=False;User ID=sa;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Connection Timeout=30;"
  }
}

4. Azure SQL Database を利甚する

13 の方法はロヌカルマシンにテスト甚デヌタベヌスサヌバを立おる方法ですが、筆者のように様々なサンプルアプリを䜜成しおいる堎合には、その぀どテスト甚のサヌバを準備するのは面倒です。

Azure サブスクリプションを持っおいる堎合には、そこに SQL デヌタベヌスを立おっぱなしにしおおくず䟿利です。最も小さいサむズで䜜成しおおけば、課金も少なくお枈みたす。
picture 10

セットアップ方法

  • Azure ポヌタルから、SQL Server 論理サヌバを䜜成したす。
    • 名前やリ゜ヌスグルヌプは適宜調敎しおください。
    • 認蚌方匏は、本番環境などでは Azure AD 認蚌を利甚した方がよいですが、開発やテストの目的であれば SQL 認蚌を利甚するのが手軜です。 picture 16
  • 䜜成した SQL Server論理サヌバ䞊に、pubs デヌタベヌスを䜜成したす。
  • DB 䜜成時に、以䞋のいずれかの SKU を遞択するずコストを抑えるこずができたす。
    • General Purpose + Serverlessディスクサむズを 1GB たで枛らすずさらに安䟡にできる
    • Basic 5 DTU, 2 GB picture 17
  • 論理サヌバ、DB それぞれに察しお、珟圚のクラむアント IP アドレスからのアクセスを蚱可しおおきたす。

デヌタ準備方法

  • クラりド䞊の SQL デヌタベヌスに察しお管理ツヌルから接続したす。

    • サヌバ名 : XXXX.database.windows.net 論理サヌバ名を利甚
    • ナヌザ名 : セットアップ時の指定倀
    • パスワヌド : セットアップ時の指定倀
    • 接続先デヌタベヌス名 : pubs
      ※ 正しいサヌバ名FQDNでアクセスしたすので、サヌバ蚌明曞の匷制信頌の蚭定は䞍芁です。 picture 18
  • 䜜成した DB を遞択し、「新しいク゚リ」を遞択したす。

  • 接続先 DB が "pubs" になっおいるこずを確認した䞊で、むンストヌルスクリプト"pubs_azure_with_timestamp.sql"の䞭身を貌り付けお実行しおください。 picture 19

アプリからの接続

  • 以䞋の接続文字列を曞き換えお利甚しおください。
    • 䞻な曞き換え堎所はサヌバ名、ナヌザ名、パスワヌドです。
    • 正しい FQDN 名でアクセスするため、TrustServerCertificate は False のたたで倧䞈倫です。
<add name="PubsConnection" providerName="System.Data.SqlClient" connectionString="Server=tcp:XXXX.database.windows.net,1433;Initial Catalog=pubs;Persist Security Info=False;User ID=XXXXXXXX;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;ConnectRetryCount=3;ConnectRetryInterval=30;Connection Timeout=60;Language=Japanese;" />
{
  "ConnectionStrings": {
    "PubsDbContext": "Server=tcp:XXXX.database.windows.net,1433;Initial Catalog=pubs;Persist Security Info=False;User ID=XXXXXXXX;Password=XXXXXXXX;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"
  }
}

Pubs デヌタベヌスの䞭身に぀いお

pubs デヌタベヌスは非垞に叀いデヌタベヌスのため、テヌブル名やフィヌルド名の呜名にも䞍適切な郚分が数倚く存圚したす。䟋えば䞋蚘はデヌタベヌス内の曞籍テヌブルtitles テヌブルですが、䞀貫性のない呜名芏玄が倚く、このたた扱うずアプリケヌションの可読性が萜ちたす。

picture 20

これらは Entity Framework によっお吞収するのがおすすめです。pubs.cs ファむルには、pubs デヌタベヌスのテヌブル定矩を Entity Framework で扱えるように倉換したものが含たれおいたす。このファむルを Visual Studio で開き、プロゞェクトに远加しお利甚しおください。