Microsoft。Data.SqlClient 接続文字列は、セミコロンで区切られたkeyword=valueペアのリストです。
SqlConnectionかSqlConnectionStringBuilderにパスしてください:
Server=tcp:sql.example.com,1433;Database=Orders;Integrated Security=true;Encrypt=Strict
接続文字列では、次の 4 つの点がわかります。
- アプリケーションはどのサーバーとデータベースを使っていますか?
- アプリケーションはどのアイデンティティで動作しますか?
- クライアントはどのようにしてサーバー証明書を検証するのでしょうか?
- ワークロードに必要な接続動作は何でしょうか?
この記事では、その選択とドライバーがテキストを読む際に使うルールについて説明します。 各キーワード、その同義語、および既定値については 接続オプション を参照してください。 コード内で接続文字列を作成・変更するには 、接続文字列ビルダーを参照してください。
認証パターンを選択する
配属に合ったパターンを使いましょう。
<server>などの各プレースホルダーを自分の値に置き換えます。
| 環境 | パターン | 接続文字列 |
|---|---|---|
| ドメインまたはローカルWindowsアイデンティティを持つWindows上のSQL Server | Windows 統合認証 | Server=<server>;Database=<database>;Integrated Security=true;Encrypt=true |
| AzureでホストされたアプリケーションとAzure SQL接続 | Microsoft Entra ID のマネージド ID | Server=tcp:<server>.database.windows.net,1433;Database=<database>;Authentication=Active Directory Managed Identity;Encrypt=Strict |
| Azure SQL に接続する開発者ワークステーション | Microsoft Entra ID デフォルト認証チェーン | Server=tcp:<server>.database.windows.net,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict |
| 開発者ワークステーションがMicrosoft FabricのSQLデータベースに接続 | Microsoft Entra ID デフォルト認証チェーン | Server=tcp:<server>,1433;Database=<database>;Authentication=Active Directory Default;Encrypt=Strict |
| Azure SQL に接続する対話型デスクトップ ツール | Microsoft Entra ID インタラクティブ認証 | Server=tcp:<server>.database.windows.net,1433;Database=<database>;Authentication=Active Directory Interactive;Encrypt=Strict |
| SQL認証を必要とする環境 | シークレットストアからのユーザー名とパスワード | Server=<server>;Database=<database>;User ID=<user>;Password=<password>;Encrypt=true |
Windowsの統合認証はプロセスの ID として接続します。 デスクトップやコンソールアプリケーションの場合、通常はサインインしているユーザーです。 ウェブアプリケーションやWindowsサービスの場合は、アプリケーションプールやサービスアカウントです。 なりすましは身元を変えることがあります。 アプリケーションが実際に使っているアイデンティティにログインとデータベース権限を付与します。
これら3つのWindows統合認証形式は同等です:
Server=sql.example.com;Database=Orders;Integrated Security=true;Encrypt=true
Server=sql.example.com;Database=Orders;Integrated Security=SSPI;Encrypt=true
Server=sql.example.com;Database=Orders;Trusted_Connection=yes;Encrypt=true
文字列がIntegrated Security=trueを設定し、User IDとPasswordも設定した場合、ドライバーはWindows 認証を使い、ユーザー名とパスワードを無視します。
Microsoft.Data.SqlClient 7.0以降のバージョンでは、ドライバーが提供するMicrosoft Entra ID認証方法に対してバージョンマッチドMicrosoft.Data.SqlClient.Extensions.Azureパッケージが必要です。 アプリケーションコードがアクセストークンやアクセストークンコールバックを提供する場合は、そのパッケージは必要ありません。
受け入れられた Authentication 値については 、認証オプションをご覧ください。 認証にはデータベースユーザー、権限、サーバー上のアイデンティティ設定も必要です。 設定手順については、Microsoft Entra ID認証およびSQL Server認証を参照してください。
サーバーとデータベースを指定する
Server そして Database は最も読みやすいキーワード名です。 ビルダーはそれらを標準的な対価物、 Data Source と Initial Catalogとして記述します。 4つの名前はすべて接続文字列(接続文字列)で動作します。
Serverを以下のいずれかの形式に設定してください:
| Form | Example | Use |
|---|---|---|
| ホスト名 | Server=sql.example.com |
ポート1433のデフォルトインスタンスです。 |
| ホスト名とポート | Server=tcp:sql.example.com,1433 |
特定のTCPポートです。 ポートはコロンではなくコンマで区切ってください。 |
| 名前付きインスタンス | Server=sql.example.com\SALES |
名前付きのインスタンス。 ドライバーはUDPポート1434のSQL Serverブラウザサービスにポートを要求します。 |
| ローカルサーバー |
Server=(local) または Server=. |
ローカルコンピュータのデフォルトインスタンスです。 |
| LocalDB | Server=(localdb)\MSSQLLocalDB |
SQL Server Express LocalDBを Windows で使用します。 接続は暗号化されておらず、 Encrypt=Mandatoryを使っていても Encrypt=Strict 失敗します。 |
| 名前付きパイプ | Server=np:\\sql.example.com\pipe\sql\query |
Windowsの名前付きパイプ接続です。 |
本番環境では、接続文字列、完全修飾ホスト名、および明示的なポートを使用してください。 IPアドレスではなく、サーバー証明書と一致するDNS名を使用してください。なぜなら、証明書検証は接続文字列内のサーバー名と証明書の名前を比較するからです。
SQL認証とuser@servernameフォームのユーザー名でAzure SQL Databaseに接続する場合、servername部分はServerのサーバーと一致しなければなりません。
可用性グループ リスナーまたはフェールオーバー クラスター インスタンスについても、Multi Subnet Failoverのを確認してください。
暗号化と証明書検証の設定
Encryptキーワードは、いずれの場合も以下の値を受け入れます。
| 価値 | ビルダーバリュー | Meaning |
|---|---|---|
Strict |
Strict |
TDS 8.0を使用しています。 ログイン前に接続を暗号化し、常にサーバー証明書を検証します。 |
Mandatory、true、yes |
True |
接続を暗号化します。 この値が既定値です。 |
Optional、false、no |
False |
サーバーが暗号化を必要とする場合にのみ接続全体を暗号化します。 サーバーが暗号化をサポートしているが必須でない場合、ログインパケットのみを暗号化します。 |
サーバーが TDS 8.0 をサポートしており、かつ、クライアントが検証できる証明書を備えている場合は、Strict を使用します。 Azure SQL DatabaseおよびMicrosoft FabricのSQLデータベースはこれをサポートしています。 LocalDBの接続は暗号化されておらず、Mandatoryを使っていてもStrictも失敗します。
Encrypt値とTrust Server Certificate値は以下のように組み合わさります。
| 暗号化する | サーバー証明書を信頼する | Result |
|---|---|---|
Optional |
false |
サーバーが暗号化を必要とする場合、接続全体が暗号化され、サーバー証明書が検証されなければなりません。 そうしないと、接続に失敗します。 サーバーが暗号化をサポートしているが必須ではない場合、ログイン パケットのみが暗号化され、接続で AccessToken または AccessTokenCallback を使用する場合を除き、ドライバーはサーバー証明書を検証しません。 サーバーが暗号化をサポートしていない場合、何も暗号化されません。 |
Optional |
true |
サーバーが暗号化を必要とする場合、接続全体が暗号化されます。 サーバーが暗号化をサポートしているが必須でない場合、暗号化されるのはログインパケットのみです。 ドライバーはサーバー証明書を検証しません。 |
Mandatory |
false |
暗号化はサーバー証明書が有効であることが確認された場合にのみ行われます。 そうしないと、接続に失敗します。 |
Mandatory |
true |
暗号化は常に行われますが、ドライバーはサーバー証明書の検証を行いません。 |
Strict |
無視 | 暗号化は常に行われ、サーバー証明書は検証されなければなりません。 そうでない場合、接続に失敗します。 |
本番環境での接続エラーを修正するために Trust Server Certificate=true を設定しないでください。 チャネルを暗号化しますが、サーバーの身元は確認しません。 信頼できる証明書が存在しない開発環境に限定してください。
Data Source内のサーバー名が証明書と一致しない場合は、Host Name In Certificateを証明書の名前に設定してください。 SqlClientはサーバー名と一致しない時だけチェックし、証明書のピン留めもしません。 特定の証明書を1つだけ受け入れるには、「Server Certificate」にPEM、DER、またはCERファイルのパスを設定します。
Server=tcp:sql.example.com,1433;Encrypt=Strict;Host Name In Certificate=sqlhost.example.com
Server=tcp:sql.example.com,1433;Encrypt=Strict;Server Certificate=C:\certificates\server.cer
検証ルールの詳細については、「暗号化および証明書の検証」を参照してください。
接続プーリングを使用する
プーリングはデフォルトでオンになっています。 SqlConnectionを開くと、ドライバーはその接続設定に一致するプールから物理的な接続を取得します。 接続を閉じたり破棄したりすると、物理的な接続は閉じるのではなくプールに戻ってきます。 プールされたオープンはネットワーク接続、TLSハンドシェイク、ログインをスキップします。
次の規則に従います。
必要な直前に接続を開け、終わったらすぐに破棄し、
usingまたはawait usingを使用してください。 廃棄されていない接続はチェックアウトのままで、プールが尽きることもあります。起動時に一度接続文字列を作成し、それを再利用してください。 プールキーには接続文字列の正確なテキストが含まれているため、異なるキーワードの順序、同義語、またはリクエストIDやユーザー名などのリクエストごとの値が別個のプールを形成します。 ビルダーは一つの正準形を出力します。 詳細については、「Keep one canonical 接続文字列」を参照してください。
統合認証のもとで各Windowsアイデンティティ、各SqlCredentialインスタンス、各AccessToken値ごとに別々のプールが用意されることを期待してください。 各接続にAccessTokenCallbackを設定するのではなく、ドライバーが提供する
AccessTokenメソッドや再利用されたAuthenticationを使うのが良いでしょう。Max Pool Sizeの値を増やす前に、まだ破棄されていない接続を探してください。Max Pool Sizeはデフォルトで 100 に設定されています。 プール内のすべての接続が使用中の場合、Openは最大Connect Timeoutまで待ち、その後 InvalidOperationExceptionを投げます:Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.すべてのプールのサーバー容量を計画しましょう。 .NETフレームワーク上の各プロセス、または各アプリケーションドメインは独自のプールを持っています。 サーバーへの接続は、各プロセスのプール数とアプリケーションインスタンス数を
Max Pool Sizeに掛け合わせた数に達する可能性があります。Pooling=falseを、プールの問題の回避策として設定しないでください。 開くたびに、完全なログインが実行されます。
長くアイドル状態のプール接続を閉じるには、「 接続アイドル時間の制限」を参照してください。 プールキー、サイズ設定、クリアリング、トランザクションについては、SQL Server接続プーリングを参照してください。
接続設定とコマンド設定を別々に
接続文字列は接続の確立とセッションの動作を制御します。 コマンドは1つのSQL操作を制御します。
| 要件 | 構成対象 |
|---|---|
| 接続を確立するか、プールから取得するまでの許容時間 |
Connect Timeout キーワード |
| 接続上のコマンドのデフォルトタイムアウト |
Command Timeout キーワード |
| 1つのコマンドのタイムアウト | CommandTimeout |
| 電話主からのキャンセル |
CancellationToken 非同期メソッドに渡されました |
| 接続を開くかコマンドを実行するためのリトライポリシー |
SqlConnectionで設定可能な再試行ロジックSqlCommand |
タイムアウトが長くなるのはリトライ ロジックではありません。 タイムアウトは待機時間の制限です。 再試行すると次の試みが始まり、その再挑戦は上限が定められており、安全に繰り返せなければなりません。
アプリケーション ID を報告する
Application Name サーバーが APP_NAME()を通じて報告する名前を設定します。 デプロイされた各ワークロードに対して1つの安定名を使いましょう。 アプリケーション用に接続を開くフレームワークやツールも、接続文字列キーワードを持たないこのRegisteredApplicationプロパティを通じて自己報告できます。 詳細については、「アプリケーション ID を報告する」をご覧ください。
接続ストリングを安全に作る
コードが値を追加・変更するときには SqlConnectionStringBuilder を使いましょう。 信頼できないテキストを接続文字列に結合しないでください。なぜなら、そのテキストのセミコロンがキーワードを追加または置き換えることがあるからです。 ビルダーは値を検証し、同義語を標準キーワードにマッピングし、各値を引用符で囲み、その値がキーワードを追加できないようにします。 例については「接続文字列ビルダー」を参照してください。
コード外での接続情報の保存
アプリケーションの設定システムから接続文字列を読み込みます。 .NETアプリケーションは一般的に環境変数、ローカル開発のためのユーザーシークレット、Azure App Configuration、Azure Key Vaultを使用します。
次の規則に従います。
- パスワード、クライアントシークレット、アクセストークン、本番接続文字列はコミットしないでください。
- 接続文字列にパスワードを含める必要がない認証方法を使用してください。
- 設定ソースへのアクセスを制限してください。
- 保存されたシークレットをローテーションし、それらをキャッシュしているアプリケーションを再起動または再読み込みします。
- ログ、例外、トレース、テレメトリに接続文字列を書かないでください。
- デフォルトの
Persist Security Info=falseのままにしておくと、開かれた接続のConnectionStringプロパティを介してパスワードが公開されないようにできます。
.NET 設定プロバイダーについては、「.NET 内の構成」を参照してください。 その他のコントロールについては、接続情報の保護をご覧ください。
構文解析ルール
ドライバーは以下のルールを適用します:
- キーワードでは大文字と小文字は区別されません。
DATABASE、Database、databaseは同じキーワードです。 - 多くのキーワードには同義語があります。
ServerとData Sourceは同じ値を設定します。 Connectionオプションの記事には、各キーワードの同義語が記載されています。 - キーワードが複数回現れた場合、最後の値が優先されます。 同義語は同じキーワードとしてカウントされます。
- ドライバーはキーワードや引用符なしの値の周りのスペースを無視します。
- 末尾のセミコロンは任意です。
- ドライバーが認識できないキーワードは、メッセージArgumentExceptionを含む
Keyword not supportedをスローします。
値はキーワードによって大文字と小文字を区別することがあります。 パスワードは大文字と小文字が区別されます。
Encrypt=STRICT と Encrypt=strict は同じです。
このプログラムは、ビルダーがどのようにキーワードを正規化し、重複を解決し、特殊文字を引用するかを示します。 .NET Framework タブでは C# 7.3 を使用しています。 サンプルを実行するプロジェクトを作成するには、「 プロジェクトを作成」をご覧ください。
using Microsoft.Data.SqlClient;
// Synonyms and keyword case are normalized to canonical keywords.
var parsed = new SqlConnectionStringBuilder(
"server=tcp:sql.example.com,1433;DATABASE=Orders;uid=app_user;encrypt=yes;timeout=30");
Console.WriteLine(parsed.ConnectionString);
// When a keyword repeats, the last value wins.
var duplicate = new SqlConnectionStringBuilder(
"Server=sql.example.com;Database=Orders;Database=Archive");
Console.WriteLine($"InitialCatalog: {duplicate.InitialCatalog}");
// The builder quotes values that contain delimiters.
var quoted = new SqlConnectionStringBuilder
{
DataSource = "sql.example.com",
UserID = "app_user",
Password = "a;b'c\"d",
};
Console.WriteLine(quoted.ConnectionString);
Console.WriteLine($"Round trip: {new SqlConnectionStringBuilder(quoted.ConnectionString).Password == quoted.Password}");
出力は次のとおりです。
Data Source=tcp:sql.example.com,1433;Initial Catalog=Orders;User ID=app_user;Connect Timeout=30;Encrypt=True
InitialCatalog: Archive
Data Source=sql.example.com;User ID=app_user;Password="a;b'c""d"
Round trip: True
最初の行は各同義語を標準的なキーワードに置き換えたものを示しています: server → Data Source、 DATABASE → Initial Catalog、 uid → User ID、 timeout → Connect Timeout。
値を引用符で囲む
セミコロン、スペースで始まるか終わる値、または引用符で始まるか終わる値がある場合、二重引用符(")または単一引用符(')で囲みます。 引用符で囲まれた値の中では、囲む引用符を2回書きます。
| 価値 | 接続文字列形式 |
|---|---|
a;b |
Password="a;b" |
abc' |
Password="abc'" |
say "hi" |
Password='say "hi"' |
a;b'c"d |
Password="a;b'c""d" |
ルールを引用するのは間違えやすいものです。
ブール値を指定してください
ブール値を取るキーワードは、大文字小文字を問わず、true、false、yes、および no を受け入れます。
Integrated Security また、 sspiも受け入れ、つまり trueを意味します。 ビルダーは True または False と書きます。
他のドライバーのキーワードを使う
Microsoft.Data.SqlClientはDriverやProviderなどのODBCやOLE DBキーワードを受け入れていません。 他のドライバーから接続文字列を移動する際には、これらのキーワードを削除してください。
System.Data.SqlClient接続文字列は Microsoft.Data.SqlClient で動作します。以下の違いがあります:
-
Encryptの既定値は Microsoft.Data.SqlClient ではMandatoryです。 信頼できる証明書を持たないサーバーは証明書検証に失敗します。 サーバーに信頼できる証明書をインストールしてください。 - .NETでは、
Network Library、Connection Reset、Transparent Network IP Resolutionはサポートされていません。 削除してください。 -
Context Connection=trueはサポートされていません。 -
Asynchronous Processingはサポートされているキーワードではなく、ArgumentExceptionをスローします。 削除します。 非同期メソッドはそれなしでも動作します。 -
Type System Version=SQL Server 2000はサポートされていません。 接続を作成するとArgumentExceptionがスローされます。Latest、SQL Server 2012、SQL Server 2008、またはSQL Server 2005を使ってください。