SQLServer LocalDBにまつわる色々まとめ

# はじめに
SQLServer LocalDBを導入して開発するなかでそれを操作するためのツール、テクニック、手法などをまとめました。
LocalDBを使用することで自分のマシンに開発サーバと独立した実行環境を構築できるようになり、他に影響を与えることなく開発を進めることが可能となりました。アプリ側からは単純に接続文字列を変えるだけなのでアクセスも非常に簡単です。

# SQLServer LocalDB？
* ローカルの環境で動作する開発用DBを作成できる
* SQL Server 2012のいずれかのエディション以降使用できる
* 詳しくは[蒼の王座・裏口](http://sqlazure.jp/r/sql-server/233/)へ

# プロジェクト指向オフラインDB開発
* スキーマ情報のコード化（実態はDDLのsqlファイル）
* gitなどのバージョン管理システムでスキーマ情報の変更管理
* 定義されたスキーマ情報を様々な環境（サーバやローカル）に発行
* 詳しくは[SQL Server のプロジェクト指向オフライン データベース開発を採用してみた話](https://docs.com/kiyokura/3771)へ

# SSDT（SQLServerDataTools）
* Visual StudioのGUI上で操作可能
  * ![ssdt.PNG](https://gloops.qiita.com/files/9168e176-f04f-6097-3214-69f37403feb7.png)

* 接続されたDBに対してのクエリの実行
* 異なる環境間のDBで以下の操作が行える
  * スキーマ比較
  * データ比較

# SQLServerオブジェクトエクスプローラ
* VisualStudio上で接続されているDBの情報が確認できる
* 異なるDBサーバ間のスキーマ比較やデータ比較もここで選択したもので実行できる
* ![sqlserverobjectexplorer.PNG](https://qiita-image-store.s3.amazonaws.com/0/45885/78097fb6-7dfc-2dcc-05c3-62dc4cec1b05.png)


# SQL LocalDBインスタンスの操作
## 用意されているコマンド
|コマンド|説明|
|:-----------------|:------------------|
|create|SQL Server Express LocalDB の新しいインスタンスを作成します。 SqlLocalDB では、引数 <instance-version> で指定された SQL Server Express バイナリのバージョンを使用します。 バージョン番号は、1 桁以上の 10 進数の数値書式で指定します。 マイナー バージョン番号 (サービス パック) は省略可能です。 たとえば、11.0 と 11.0.1186 という 2 つのバージョン番号のどちらも使用できます。 指定したバージョンがコンピューターにインストールされている必要があります。 指定しなかった場合、バージョン番号は既定で SqlLocalDB ユーティリティのバージョンに設定されます。 –s を追加した場合、 LocalDBの新しいインスタンスが起動します。|
|share|指定された共有名を使用して、LocalDB の指定されたプライベート インスタンスを共有します。 ユーザー SID またはアカウント名を省略した場合、既定で現在のユーザーになります。|
|unshared|LocalDB の指定した共有インスタンスの共有を停止します。|
|delete|指定した SQL Server Express LocalDB のインスタンスを削除します。|
|start|指定した SQL Server Express LocalDB のインスタンスを起動します。 成功した場合、ステートメントから LocalDBの名前付きパイプ アドレスが返されます。|
|stop|指定した SQL Server Express LocalDB のインスタンスを停止します。 –i を追加した場合は、 NOWAIT オプション付きでインスタンスのシャットダウンを要求します。 –k を追加した場合は、インスタンス プロセスに通知することなく、そのプロセスを停止します。|
|info|現在のユーザーが所有する SQL Server Express LocalDB のすべてのインスタンスを一覧表示します。<instance-name> を指定すると、SQL Server Express LocalDB の指定したインスタンスの名前、バージョン、状態 (Running または Stopped)、および最後の起動時刻に加え、LocalDB のローカル パイプ名が返されます。|
|trace|trace on を指定すると、現在のユーザーに対して SqlLocalDB の API 呼び出しのトレースが有効になります。 trace off はトレースを無効にします。|

## ソースコードで実行する
* [SQL LocalDB Wrapper](https://www.nuget.org/packages/System.Data.SqlLocalDb/1.14.0/)

```csharp:Stopサンプル
SqlLocalDbApi.StopInstance(localDBInstanceName);
```
```csharp:Deleteサンプル
SqlLocalDbApi.DeleteInstance(localDBInstanceName, true); // 第二引数は実ファイルであるmdf、ldfなどのファイルを削除するかどうか
```
```csharp:Createサンプル
SqlLocalDbApi.CreateInstance(localDBInstanceName);
```
```csharp:Shareサンプル
SqlLocalDbApi.ShareInstance(localDBInstanceName, localDBInstanceShareName);
```
            
## コマンドラインで実行する
* [sqllocaldb.exe](https://msdn.microsoft.com/ja-jp/library/hh247716(v=sql.120).aspx)

# DBサーバへの操作
## 用意されているコマンド
|コマンド|説明|
|:-----------------|:------------------|
|Extract|ライブ SQL Server または Microsoft Azure SQL データベースからデータベース スナップショット (.dacpac) ファイルを作成します。|
|Export|SQL Server または Microsoft Azure SQL データベースのライブ データベース (データベース スキーマとユーザー データを含む) を BACPAC パッケージ (.bacpac ファイル) にエクスポートします。|
|Import|BACPAC パッケージのスキーマとテーブル データを SQL Server または Microsoft Azure SQL データベースの新しいユーザー データベースにインポートします。|
|Publish|ソース .dacpac ファイルのスキーマに合わせてデータベース スキーマの増分更新を行います。データベースがサーバーに存在しない場合は、公開操作によって作成されます。存在する場合は、既存のデータベースが更新されます。|
|DeployReport|公開操作によって行われる変更の XML レポートを作成します。|
|DriftReport|前回データベースが登録された後に、登録されたデータベースに対して行われた変更の XML レポートを作成します。|
|Script|ソースのスキーマに合わせてターゲットのスキーマを更新する、Transact-SQL の増分更新スクリプトを作成します。|

## コマンド実行による成果物
* DACPackage
  * データ層アプリケーションの定義を含む成果物の表現です。
* BACPackage
  * データ層アプリケーションの定義とデータを含む成果物の表現です。

## ソースコードで実行する
* [Microsoft.SqlServer.Dac](https://www.nuget.org/packages/Microsoft.SqlServer.Dac/1.0.0)

```csharp:Exportサンプル
var sourceDacService = new DacServices(sourceConfig.ConnectionString);
sourceDacService.ExportBacpac("sample.bacpac", sourceDatabaseName);
```
```csharp:Importサンプル
var targetDacService = new DacServices(targetConfig.ConnectionString);
var bacpacFile = BacPackage.Load("sample.bacpac");
targetDacService.ImportBacpac(bacpacFile, targetDatabaseName);
```

## コマンドラインで実行する
* [sqlpackage.exe](https://msdn.microsoft.com/ja-jp/library/hh550080(v=vs.103).aspx)

# 参考
* [蒼の王座・裏口](http://sqlazure.jp/r/sql-server/233/)
* [SQL Server のプロジェクト指向オフライン データベース開発を採用してみた話](https://docs.com/kiyokura/3771)