Oracle Databaseへの接続
Oracle Data Provider for .NETは、ユーザー名とパスワード、Windowsネイティブ認証、KerberosおよびTransport Layer Security/Secure Sockets Layerなど様々な方法でOracle Databaseに接続できます。この項では、OracleConnection
プロバイダ固有の機能について説明します。内容は次のとおりです。
Oracle Database Cloud Serviceへの接続
ODP.NETコア、管理対象ドライバおよび管理対象外ドライバはすべて、Oracle Autonomous Databaseを含むOracle Database Cloudサービスとの接続をサポートします。
設定手順
Oracle Database Cloud Servicesへの接続時には、使用可能な最新のODP.NETバージョンを使用することをお薦めします。ODP.NETおよびOracle Developer Tools for Visual Studioのダウンロード、インストールおよび構成方法に関する手順が示されます。
Oracle Autonomous Database: https://www.oracle.com/technetwork/topics/dotnet/tech-info/default-5032178.html
Oracle Database as a Service: https://www.oracle.com/technetwork/topics/dotnet/dotnetdbaas-3208838.html
接続文字列属性
表3-2は、サポートされている接続文字列属性のリストです。
表3-2 サポートされている接続文字列属性
接続文字列属性 | 説明 | デフォルト値 |
---|---|---|
|
データベース・セッションが切断され、リカバリ可能なエラーになった場合に、トランザクションおよび非トランザクション操作を、データベース・リクエストで自動的に非破壊的かつ迅速にリプレイできます。 ODP.NET管理対象ドライバおよびODP.NET Coreでは使用できません |
|
|
接続の最小存続時間(秒)。 |
|
|
接続タイムアウト・エラーが発生する前に、新しい接続または接続プールからのアイドル接続を待機する時間(秒)。 |
|
|
.NETストアド・プロシージャでのみサポートされています。 |
|
|
接続するデータベースを識別するOracle Netサービス名、接続記述子または簡易接続ネーミング。 |
空の文字列 |
|
管理者権限: |
空の文字列 |
|
未使用の確立済接続量が過剰となり、クローズされる接続数。 |
|
|
COM+トランザクションまたは |
|
|
ODP.NET接続プールを使用して、Oracleデータベース・サービス、サービス・メンバー、インスタンスまたはノードの停止時に、プールから接続を事前に削除できます。Oracle RAC、Data Guard、GoldenGateなどの単一インスタンスへのデプロイを含め、Oracle Global Data Servicesを扱います。 |
|
|
ODP.NET接続プールを使用して、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、Oracleデータベース・インスタンス間の作業要求のバランスを調整できます。Oracle RAC、Active Data Guard、GoldenGateなどを含め、Oracle Global Data Servicesを扱います。 |
|
|
プール内のすべての接続が使用された場合に作成される新しい接続の数。 |
|
|
プール内の接続の最大数。 |
|
|
メタデータ情報をキャッシュします。 |
|
|
プール内の接続の最小数。 |
|
|
|
空の文字列 |
|
接続文字列でのパスワード検索。 |
|
|
接続プーリング。 |
|
|
トランザクションがその存続中にローカルまたは分散かどうかを示します。 |
promotable |
|
プロキシ・ユーザーのユーザー名。 |
空の文字列 |
|
プロキシ・ユーザーのパスワード。 |
空の文字列 |
|
接続の自動チューニングを有効化または無効化します。 |
|
|
接続がプールに戻るときの文キャッシュの消去。 |
|
|
文キャッシングの有効化と、キャッシュ・サイズ、つまりキャッシュ可能な文の最大数。 |
|
|
Oracleユーザー名。 |
空の文字列 |
|
プールから発生した接続の検証。 |
|
次の例は、Oracle Databaseへの接続に接続文字列属性を使用します。
// C# using System; using Oracle.DataAccess.Client; class ConnectionSample { static void Main() { OracleConnection con = new OracleConnection(); //using connection string attributes to connect to Oracle Database con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
関連項目:
-
接続文字列の詳細は、OracleConnectionプロパティを参照してください。
-
文キャッシングの詳細は、OracleCommandオブジェクトを参照してください。
接続文字列ビルダー
OracleConnectionStringBuilder
クラスでは、エラーを起こしにくく、管理しやすい接続文字列を作成します。
このクラスを使用することによって、開発者は設定ファイルを使用した接続文字列の提供およびキー/値ペアによる動的な値の設定が可能です。設定ファイル・エントリの例は次のとおりです。
<configuration> <connectionStrings> <add name="Publications" providerName="Oracle.DataAccess.Client" connectionString="User Id=scott;Password=tiger;Data Source=inst1" /> </connectionStrings> </configuration>
接続文字列情報は、接続文字列名を指定して取得できます。この例ではPublications
です。次に、providerName
に基づいて、そのプロバイダ用の適切なファクトリを取得できます。これにより、接続文字列を簡単に管理および変更できます。さらに、これによって接続文字列への文字列注入に対してより優れたセキュリティを提供します。
データ・ソース属性の指定
この項では、データ・ソース属性を指定する複数の方法について説明します。
次の例は、tnsnames.ora
ファイル内のsales
というTNS別名にマップされた接続記述子を示しています。
sales= (DESCRIPTION= (ADDRESS= (PROTOCOL=tcp)(HOST=sales-server)(PORT=1521)) (CONNECT_DATA= (SERVICE_NAME=sales.us.acme.com)))
接続プールは別名の完全ディスクリプタを保持しているので、同じ接続文字列を使用するそれ以降の接続要求については、その別名を再度解決する必要がなくなります。これは、tnsnames.ora
、.NET構成データ・ソースおよびLDAP別名に当てはまります。接続プールのキャッシュで保持されている完全ディスクリプタを消去するには、OracleDataSourceEnumerator.GetDataSources()
を呼び出し、その後にOracleConnection.ClearPool()
またはOracleConnection.ClearAllPools()
を呼び出します。
接続プーリングが使用されていない場合は、別名を解決して完全ディスクリプタを得る処理を要求のたびに行う必要があります。LDAPの場合は、LDAPサーバーへの問合せが接続要求のたびに発生します。
TNS別名の使用
TNS別名を使用してscott/tiger
として接続するには、有効な接続は次のようになります。
"user id=scott;password=tiger;data source=sales";
接続記述子の使用
ODP.NETでは、アプリケーションはtnsnames.ora
ファイルを使用せずに接続することもできます。そのためには、接続記述子全体を"data
source"
として使用できます。
接続文字列は次のようになります。
"user id=scott;password=tiger;data source=" + "(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" + "(HOST=sales-server)(PORT=1521))(CONNECT_DATA="+ "(SERVICE_NAME=sales.us.acme.com)))"
簡易接続および簡易接続プラスのネーミング・メソッド
簡易接続および簡易接続のプラス・ネーミング・メソッドを使用すると、クライアントは構成を行わずにデータベースに接続できます。
簡易接続ネーミング・メソッドを使用するには、sqlnet.ora
ファイルのNAMES.DIRECTORY_PATH
パラメータにより、EZCONNECT
が次のように指定されていることを確認します。
NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)
これが有効になっていると、ODP.NETにより、アプリケーションではData Source
属性を次の書式で指定できます。
//host:[port]/[service_name]
同じ例を使用して、有効な接続文字列を次に示します。
"user id=scott;password=tiger;data source=//sales-server:1521/sales.us.acme.com" "user id=scott;password=tiger;data source=//sales-server/sales.us.acme.com" "user id=scott;password=tiger;data source=sales-server/sales.us.acme.com"
ポート番号が指定されていない場合、デフォルトで1521が使用されます。
簡易接続は、クラスタ・データベースやクラウド・データベースなど、より広範なアプリケーションをサポートするために、また使いやすいように、ODP.NET 19cで拡張されました。今回改善された機能を簡易接続プラスと言い、その機能は次のとおりです。
-
SSL/TLS付きTCP/IP/
-
任意のSQL*Net記述レベル・パラメータを使用可能
-
複数のホストおよびポート
-
名前/値ペアのわかりやすい書式
この構文では、疑問符記号?
を使用して名前/値ペアの開始を示し、アンパサンド記号&
を使用してそれぞれの名前/値ペアを区切ります。接続文字列全体を単一の文字列として指定する必要があります。パラメータ値では、先頭と末尾の空白は無視されます。値の一部として空白が必要な場合は、二重引用符内に配置する必要があります。
簡易接続プラスの構文:
[[protocol:]//]host1{,host12}[:port1]{,host2:port2}[/service_name][:server][/instance_name][?parameter_name=value{¶meter_name=value}]
簡易接続プラスのサンプル:
tcps://salesserver1:1521/sales.us.example.com
salesserver1:1521,salesserver2,salesserver3:1522/sales.us.example.com
tcps://salesserver1:1521/sales.us.example.com?wallet_location=D:/oracle
tcps://salesserver1:1521/sales.us.example.com?ssl_server_cert_dn=cn=sales,cn=OracleContext,dc=us,dc=example,dc=com
tcps://salesserver1:1521/sales.us.example.com?https_proxy=www-proxy.mycompany.com&https_proxy_port=80
salesserver1:1521/sales.us.example.com?connect_timeout=60&transport_connect_timeout=30&retry_count=3
関連項目:
簡易接続ネーミング・メソッドの使用の項に関する詳細および要件は、『Oracle Database Net Services管理者ガイド』を参照
LDAPの使用
ODP.NETは、Oracle Internet DirectoryやMicrosoft Active DirectoryなどのLDAP準拠ディレクトリ・サーバーに含まれる接続記述子にマップされる接続識別子で接続できます。
ODP.NET管理対象外ドライバのLDAPを構成するには、Oracle Database Net Services管理者ガイドで、ディレクトリ・ネーミング・メソッドの構成に関する項の手順に従ってください。
ODP.NET管理対象ドライバのLDAPを構成するには、settingsセクションとLDAPsettingsセクションの手順に従ってください。
Oracle Databaseリリース18c、バージョン18.1からは、組織は一元管理されたユーザー (CMU)をActive Directoryで使用できます。この機能は、一元的なID管理ソリューションとしてActive Directoryを使用することを望む組織のために設計されています。組織は、CMUおよびActive DirectoryでKerberos、PKIまたはパスワード認証を使用できます。
関連項目:
Using LDAPを使用するセクションの詳細と要件は、Oracle Database Net Services管理者ガイドとOracle Databaseセキュリティ・ガイドを参照してください。
Transport Layer SecurityとSecure Sockets Layerの使用
Transport Layer Security (TLS)とその前身であるSecure Sockets Layer (SSL)は、ネットワーク接続を保護する業界標準プロトコルです。管理対象および管理対象外のODP.NETはどちらも、データベースとトランスポートの認証でSSLに対応しています。
Secure Sockets LayerとTransport Layer Securityの差異
SSLは最初にNetscape社によって開発されましたが、Internet Engineering Task Force (IETF)がその開発を引き継ぎ、名前をTransport Layer Security (TLS)に変更しました。
基本的には、TLSはSSLバージョン3.0に段階的改善を加えるものです。
ODP.NET管理対象ドライバは、SSL 3.0と、TLS 1.0、1.1および1.2をサポートします。ODP.NET管理対象外ドライバは、それが認証されているバージョンのOracle Database Clientと同じバージョンのSSLとTLSをサポートします。
SSL/TLSクライアントでは、接続しようとしているデータベース・サーバーの識別名(DN)が正しいことを保証できます。DN一致の原ラメは、SSL_SERVER_DN_MATCH
(sqlnet.ora
)とSSL_SERVER_CERT_DN
(tnsnames.ora
)で、これは.NET構成ファイルでも定義できます。
DN一致を有効にするには、SSL_SERVER_DN_MATCH
をTrue
(またはOn
、Yes
)に設定します。SSL_SERVER_CERT_DN
はオプションです。管理者が、一致させたいDNを正確に指定できます。SSL_SERVER_CERT_DN
が設定されていない場合、SERVICE_NAME
値と、サーバー証明書のDNの共通名(CN)部分とを比較して一致が実行されます。
関連項目:
-
IETF Webサイトの次の場所にあるTLSプロトコル・バージョン1.0(RFC 2246)
-
settingsセクションの
SSL_VERSION
。
注意:
SSLが最も広く認識されている用語であるため、SSLでもTLSでも該当する場合、この項では説明を簡単にするためにSSLという用語を使用します。ただし、これらのプロトコルの使用方法または構成方法に違いがある場合、この項では、記述内容がSSLに該当するか、TLSに該当するかを明記します。
ODP.NET Secure Sockets Layerの構成
Secure Sockets Layerをクライアントで構成する場合、ウォレットが作成されていることを確認して、SSL付きTCP/IPをクライアントで使用してください。オプションで、追加のステップを実行して構成を強化できます。
SSL構成に関するトピック:
ステップ1: クライアント・ウォレット作成の確認
次のステップに進む前に、クライアントでウォレットが作成されていることと、クライアントに有効な証明書があることを確認する必要があります。
ODP.NET管理対象ドライバはファイルおよびMicrosoft Certificate Store (MCS)ベースのウォレットをサポートします。
-
ファイルベース・ウォレットでは、Oracle Wallet Managerを使用して、ウォレットが作成されていることを確認します。ウォレットの確認の詳細は、『Oracle Databaseセキュリティ・ガイド』のステップ1A: サーバーでのウォレット作成の確認に関する項を参照してください。
-
MCSでは、Windowsドメイン資格証明がクライアント資格証明に使用されます。そのため、ODP.NETアプリケーションの実行時には、有効なドメイン・ログオンを使用する必要があります。ODP.NET管理対象ドライバは自分のまたは個人的な証明書ストアから資格証明を取得します。MCSウォレットを使用するには、サーバーも構成する必要があります。MCSのサーバーの設定詳細は、『Oracle Databaseプラットフォーム・ガイドfor Microsoft Windows』のMicrosoft Certificate Servicesに関する項を参照してください。
ステップ2: クライアントでのSSL付きTCP/IPの使用
ODP.NETデータ・ソースはSSLを使用するように変更する必要があります。特に、トランスポート・プロトコルはSSL付きTCP/IPまたはOracleで言うところの"tcps"を使用するように変更する必要があります。SSLとともに使用するODP.NETデータ・ソースの例は次のようになります。
finance = (DESCRIPTION= (ADDRESS = (PROTOCOL=tcps) (HOST=finance_server) (PORT=1575) ) (CONNECT_DATA = (SERVICE_NAME=Finance.us.example.com) ) )
ステップ3: 必要なクライアントSSL構成の指定(ウォレット・ロケーション)
ウォレット・ロケーションを指定するために、sqlnet.ora
または.NETアプリケーション構成を編集します。
-
ファイル・ベース・ウォレットのSSLウォレット・ロケーションを設定する例です。ここで、
<wallet_location>
は、指定したロケーションでクライアント・ウォレットが格納されます。wallet_location = (SOURCE=(METHOD= File) (METHOD_DATA=(DIRECTORY=<wallet_location>)))
-
MCSベース・ウォレットのSSLウォレット・ロケーションを設定する例は次のようになります。
wallet_location = (SOURCE=(METHOD= MCS))
ステップ4: 必要なSSLバージョンのクライアントでの設定(オプション)
SSL_VERSION
パラメータは、sqlnet.ora
または.NETのapplication.config
、web.config
またはmachine.config
ファイルを介して設定できます。通常、このパラメータを設定する必要はありません。このパラメータのデフォルト設定はany
で、データベース・サーバーがあらゆる必要な制限を認証されているSSLバージョンに適用できるようにします。次にsqlnet.ora
の設定例を示します。
SSL_VERSION=3.0
ステップ5: クライアントにおける認証サービスとしてのSSLの設定(オプション)
sqlnet.ora
またはapplication.config
、web.config
またはmachine.config
のファイルにSQLNET.AUTHENTICATION_SERVICES
パラメータを設定し、SSLがデータベース外部認証方法で使用できるようにします。
SSLはトランスポート暗号化媒体として使用できます。そのため、この設定の「オプション」指定です。
データベース外部認証サービスとしてSSLを使用する場合、クライアント証明書とマッチングするデータベースの外部認証ユーザーを作成する必要があります。
次にsqlnet.ora
でのSSL外部認証を可能にする設定例を示します。
SQLNET.AUTHENTICATION_SERVICES = (TCPS)
注意:
ODAC 12cリリース4より前のリリースでは、ODP.NET管理対象ドライバSSL接続はデータベース・サーバー・マシンの動的(エフェメラル)ポートにリダイレクトされていました。ODAC 12cリリース4以降では、管理対象ODP.NET SSL接続は、Oracle Listenerに対する元のソケット接続を続けるようになりました。したがって、ファイアウォールで必要なのはOracle Listenerのポート(例:1521)に対するアクセスのみです。
関連項目:
-
TLS/SSLと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でSecure Sockets Layerの有効化に関する項を参照してください。
-
外部で識別されるデータベース・ユーザーの作成の詳細は、『Oracle Databaseセキュリティ・ガイド』の外部認証されるユーザーの作成に関する項を参照してください。
TLS/SSL設定のトラブルシューティング
この項では、よく発生する問題点と、それを解決する一般的なステップについて説明します。
TLS/SSLウォレットの一般的なエラー
Microsoft Windowsでは現在、ウォレットがMD5アルゴリズムを使用することは制限されています。Oracle Public Key Infrastructure(orapki
)ユーティリティ12.1以下ではデフォルトのオプションだったため、Oracleウォレットはこのアルゴリズムで生成された可能性があります。
orapkiは、orapki.exe
を参照します。このユーティリティは、Oracleクライアント(管理者)の完全インストールの一部です。Oracle Instant Clientには含まれていません。ユーティリティが必要なのはウォレットを設定するときだけで、ウォレットと一緒にユーティリティを配布する必要はありません。
TLS/SSLの設定時に、0x80004005コードを伴う「ORA-0052: SSLハンドシェイク中に失敗しました」エラーが発生し、最初の内部例外が「SSPI呼出しに失敗」、2番目の内部例外が「関数に送信されたトークンが無効」の場合、MD5が使用されているときなど、Microsoft Security Support Provider Interface (SSPI)でOracleウォレットが拒否された可能性が高いと考えられます。これは、ハンドシェイク時のエラーです。このエラーは、かわりにSHA-2アルゴリズムを使用して解決できます。
2番目の内部例外が「パッケージに指定された資格証明は認識されませんでした」の場合は、ユーザー証明書が認証局(CA)なしに生成されました。このエラーは、orapki
を使用してCA/ルート証明書を生成したうえで、ユーザー・ウォレット/証明書を再生成し、この新しいCA/ルート証明書を示すことで解決できます。
次のステップでは、orapki
とSHA-2を使用してOracleウォレットを生成します。この手順に従ってウォレットを生成するときには、任意のバージョンのorapki
を使用できます。
-
ルート・ウォレット、たとえばCAウォレットを作成します。
orapki wallet create -wallet ./root -pwd <password>
-
自己署名証明書(CA証明書)をルート・ウォレットに追加します。
orapki wallet add -wallet ./root -dn 'CN=<my root>' -keysize 1024 -self_signed -validity 3650 -pwd <password> -sign_alg sha512
-
自己署名済証明書をウォレットからエクスポートします。
orapki wallet export -wallet ./root -dn 'CN=<my root>' -cert ./root/b64certificate.txt -pwd <password>
-
ユーザー・ウォレット、たとえば顧客ウォレットを作成します。
orapki wallet create -wallet ./user -pwd <password> -auto_login
-
証明書リクエストの追加
orapki wallet add -wallet ./user -dn 'CN=<client's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
-
証明書リクエストをエクスポートします。
orapki wallet export -wallet ./user -dn 'CN=<client's hostname>' -request ./user/creq.txt -pwd <password>
-
CAによって発行された証明書を作成します。
orapki cert create -wallet ./root -request ./user/creq.txt -cert ./user/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
-
信頼できる証明書(CA証明書)をウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。
orapki wallet add -wallet ./user -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
-
新しい証明書を追加します。
orapki wallet add -wallet ./user -user_cert -cert ./user/cert.txt -pwd <password> -sign_alg sha512
-
ユーザー・ウォレットの内容を表示します。
orapki wallet display -wallet ./user -pwd <password>
-
サーバー・ウォレットを作成します。
orapki wallet create -wallet ./server -pwd <password> -auto_login
-
サーバー証明書リクエストを追加します。
orapki wallet add -wallet ./server -dn 'CN=<server's hostname>' -keysize 1024 -pwd <password> -sign_alg sha512
-
証明書リクエストをエクスポートします。
orapki wallet export -wallet ./server -dn 'CN=<server's hostname>' -request ./server/creq.txt -pwd <password>
-
CAによって発行されたサーバー証明書を作成します。
orapki cert create -wallet ./root -request ./server/creq.txt -cert ./server/cert.txt -validity 3650 -pwd <password> -sign_alg sha512
-
信頼できる証明書(CA証明書)をサーバー・ウォレットに追加します。この例では、クライアントとサーバーの両方のウォレットに同じCAを使用すると想定しています。
orapki wallet add -wallet ./server -trusted_cert -cert ./root/b64certificate.txt -pwd <password>
-
サーバー・ウォレットの
user_cert
証明書を追加します。orapki wallet add -wallet ./server -user_cert -cert ./server/cert.txt -pwd <password> -sign_alg sha512
-
サーバー・ウォレットの内容を表示します。
orapki wallet display -wallet ./server -pwd <password>
クラウド接続のHTTPSプロキシ
ODP.NETは、HTTPSプロキシ構成をサポートしています。この機能を使用すると、HTTP CONNECTメソッドを使用して、フォワードHTTPプロキシ上にセキュアな接続をトンネリングできます。
HTTPSプロキシを使用すると、クライアント側のファイアウォールでアウトバウンド・ポートを開く必要がなくなるため、パブリック・クラウド・データベース・サービスへのアクセスが向上します。
この機能はSSL/TLS付きTCP/IPを使用する場合のみ機能し、接続記述子(例: tnsnames.ora
のPROTOCOL=TCPS
)で有効化できます。インターネットのホストに接続する必要があるイントラネット・ユーザーのWebブラウザ設定に似ています。
HTTPSプロキシを構成するには、プロバイダ・タイプごとに次を使用します。
-
ODP.NETコア-
OracleConfiguration HttpsProxy
、HttpsProxyPort
およびUseHttpsProxy
プロパティ -
管理対象ODP.NET - .NET構成ファイルのプロパティ
HTTPS_PROXY
、HTTPS_PROXY_PORT
およびUSE_HTTPS_PROXY
-
管理対象外ODP.NET –
tnsnames.ora
、HTTPS_PROXY
およびHTTPS_PROXY_PORT
値と、SQLNET.USE_HTTPS_PROXY
値を次のように変更します(DESCRIPTION=ADDRESS=( HTTPS_PROXY= www-proxy.mycompany.com)(HTTPS_PROXY_PORT=8080)(PROTOCOL=TCPS)(HOST=sales2-svr)(PORT=443)) (CONNECT_DATA=(SERVICE_NAME=sales.us.example.com)))
SQLNET.USE_HTTPS_PROXY
はon
に設定する必要があります。
セキュアな外部パスワード・ストアの使用
安全性の高い外部パスワード・ストア(SEPS)は、パスワードの資格証明を安全に格納するクライアント側ウォレットの使用です。ODP.NET管理対象ドライバおよび管理対象外ドライバの両方について、外部パスワード・ストアを使用するように構成できます。
Oracleウォレットは、認証および署名用資格証明を安全に格納するコンテナです。ウォレットにより、データベース接続をパスワード資格証明に依存する大規模なデプロイメントを簡素化できます。アプリケーションでは、埋込みユーザー名およびパスワードが必要なくなり、これによりセキュリティ・リスクを減らします。
注意:
ODP.NET Coreでは、WindowsでのみSEPSがサポートされます。
セキュアな外部パスワード記憶域(SEPS)の構成
SEPSを構成するためのステップ:
ステップ1:ウォレット・ファイルを作成します
mkstore
ユーティリティを使用してウォレット・ファイルを作成し、資格証明を挿入します。
ステップ1a:コマンド行で次の構文を使用して、クライアント上にウォレットを作成します。
mkstore -wrl wallet_location -create
次に例を示します。
mkstore -wrl c:\oracle\product\12.1.0\db_1\wallets -create Enter password: password
ステップ1b:コマンドラインで次の構文を使用して、ウォレットにデータベース接続の資格証明を作成します。
mkstore -wrl wallet_location -createCredential db_connect_string username Enter password: password
次に例を示します。
mkstore -wrl c:\oracle\product\12.1.0\db_1\wallets -createCredential orcl system Enter password: password
ステップ2:構成がクライアント・ウォレットを示すようにします
クライアントのsqlnet.ora
ファイルに、WALLET_LOCATION
パラメータを入力し、ステップ1で作成したウォレットのディレクトリの場所に設定します。
たとえば、$ORACLE_HOME/network/admin
にウォレットを作成し、OracleホームがC:\app\client\
<user>
\product\
<version>
\client_1\
に設定されている場合、クライアントのsqlnet.ora
ファイルには次のように指定する必要があります。
WALLET_LOCATION = (SOURCE =(METHOD = FILE) (METHOD_DATA = (DIRECTORY = C:\app\client\<user>\product\<version>\client_1\Network\Admin) ) )
ステップ3:SEPSをオンにします
ステップ3:SEPSをオンにします
SQLNET.WALLET_OVERRIDE = TRUE
この設定により、すべてのCONNECT /@db_connect_string
文で、データベースへの認証に、指定された場所にあるウォレットの情報が使用されます。
外部認証が使用されている場合、そのウォレットによる認証ユーザーはCONNECT /@db_connect_string
構文を使用し、前述の手順で指定したデータベースにユーザー名およびパスワードを使用せずにアクセスできます。ただし、ウォレット・ファイルはデータベース資格証明に対して最新に保っておく必要があることに注意してください。データベース資格証明が変更され、ウォレット・ファイルがそれに対応して変更されていない場合、接続は失敗します。
関連項目:
-
ウォレットの設定の詳細は、「Oracle Data Provider for .NET管理対象ドライバの構成」を参照してください。
-
安全性の高い外部パスワード・ストアおよびOracle databaseでの構成の詳細は、『Oracle Databaseセキュリティ・ガイド』のパスワード資格証明用の安全性の高い外部パスワード・ストアの管理に関する項を参照してください。
Kerberosの使用
Kerberosは、分散環境におけるセキュリティのためのネットワーク認証サービスです。ODP.NETアプリケーションは、シングル・サインオンと一元的なユーザー認証の目的でKerberosを使用できます。ODP.NET管理対象外ドライバおよび管理対象ドライバは両方ともデータベース・サーバーに対する外部認証としてKerberosをサポートします。
注意:
ODP.NET Coreでは、Kerberosはサポートされていません
管理対象ODP.NETでは、Kerberosの制約付き委任はサポートされません
ファイル・ベース資格証明キャッシュおよびMSLSA
ODP.NETは、ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)およびKerberosクライアント資格証明としてWindowsログオン資格証明を使用する機能の両方をサポートします。後者はMSLSAベースKerberos認証と呼ばれます。
ファイル・ベースKerberosクライアント資格証明キャッシュ(CC)を使用するには、Oracle Call Interface (OCI)のフル・インストールに関連付けられている次の実行ファイルが必要です。
-
okinit.exe
-
oklist.exe
-
okdstry.exe
Kerberos5資格証明を入手し、ファイル・ベース資格証明キャッシュ(CC)に格納するためにこの実行ファイルが必要です。ただし、資格証明キャッシュを作成後、資格証明が有効であるかぎり、前述の実行可能ファイルは実行時にODP.NETアプリケーションでは不要になります。
MIT KerberosでのODP.NET管理対象ドライバ依存性
Kerberos5データベース認証をODP.NET管理対象ドライバと一緒に使用するには、MIT Kerberos for Windows 4.0.1を次の場所からODP.NET管理対象ドライバと同じマシンにダウンロードしてインストールします。
http://web.mit.edu/kerberos/dist/
関連項目:
Kerberosと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でKerberos認証の構成に関する項を参照してください。
ODP.NETでのKerberos認証の構成
後述のKerberos構成例を表示する際には、次の"キー"を参照してください。
-
oracleclient
= ドメインのOracle Clientユーザーを表すためにOracleデータベース・クライアント・プログラムによって使用されるKerberos/Windowsドメイン・ユーザーID -
oracleserver
= Oracleデータベース・サーバーによって使用されるKerberos/Windowsドメイン・ユーザーID -
DOMAIN.COMPANY.COM
= Kerberos/Windowsドメイン -
dbhost.company.com
= Oracleデータベース・サーバー・マシン・ホスト名 -
kerberos_service_name
= Kerberosサービス名 -
dc.company.com
= Kerberos Key Distribution Center (KDC)およびWindows Domain Controllerのホスト名
Kerberos認証の構成トピック:
-
ステップ2: クライアントとサーバーのKerberosユーザー(MSLSAのWindowsドメイン・ユーザー)を作成します
-
ステップ3: DBサーバーのKerberosプリンシパル名をDBサーバーのKerberosサービス(SPNマッピング)に関連付け、サーバー・キータブ・ファイルを生成します
-
ステップ6: Kerberos KDC(MSLSAのWindowsドメイン・コントローラ)を示すkerberos構成ファイルを作成します
-
ステップ7: Oracleデータベース・クライアントおよびサーバーのsqlnet.oraまたは.NET構成が前述のKerberos構成ファイルを示すように構成します
-
ステップ8: クライアントsqlnet.oraまたは.NET構成で資格証明キャッシュ・ファイルまたはMSLSAを示します
-
ステップ9: sqlnet.oraまたは.NET構成のクライアントとサーバー認証サービスをKerberos5に設定します
-
ステップ10: ステップ1で設定されたKerberosクライアント・ユーザーと一致する外部認証データベース・ユーザーを設定します(大文字、小文字に注意)
ステップ1:Windowsサービス・ファイルを更新し、"kerberos5"エントリを含めます
Windowsサービス・ファイル(C:\windows\system32\drivers\etc\services
)のKerberosエントリを変更します。変更前:
kerberos 88/tcp krb5 kerberos-sec #Kerberos
変更後:
kerberos 88/tcp kerberos5 krb5 kerberos-sec #Kerberos
ステップ2:クライアントとサーバーのKerberosユーザー(MSLSAのWindowsドメイン・ユーザー)を作成します
前述の"key"で示すように、oracleclient
およびoracleserver
をそれぞれクライアントとサーバーのKerberosユーザーIDとして使用します。
ODP.NETは、次の属性を持つWindowsドメイン・ユーザーを使用してMSLSAをサポートします。
-
"Kerberos DES"はオフ
-
"Kerberos AES 128ビット"はオン
-
"Kerberos AES 256ビット"はオン
-
"Kerberos事前認証必要なし"はオン
ステップ3:DBサーバーのKerberosプリンシパル名をDBサーバーのKerberosサービス(SPNマッピング)に関連付け、サーバー・キータブ・ファイルを生成します
Kerberos KDC (MSLSAのWindowsドメイン・コントローラ)で、管理者として次のコマンドを実行します。
> ktpass -princ kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM /crypto all /mapuser oracleserver@DOMAIN.COMPANY.COM /pass <oracleserver password> /out v5srvtab > setspn -A kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM oracleserver
ステップ4:サービス・プリンシパルに対するサーバー・ユーザーのマッピングを確認します
Kerberos KDCで、次のコマンドを実行し、出力をメモします。
> setspn -L oracleserver Registered ServicePrincipalNames for CN=oracleserver,CN=Users,DC=domain,DC=company,DC=com: kerberos_service_name/dbhost.company.com kerberos_service_name/dbhost.company.com@DOMAIN.COMPANY.COM
ステップ5:サーバーのsqlnet.oraが、ステップ2で生成したキータブ・ファイルを示すように設定します
サーバーのsqlnet.ora
に次の行を追加します。
sqlnet.kerberos5_keytab = c:\krb\v5srvtab
ステップ6:Kerberos KDC(MSLSAのWindowsドメイン・コントローラ)を示すkerberos構成ファイルを作成します
kerberos構成ファイルの例(krb.conf
):
[libdefaults] default_realm = DOMAIN.COMPANY.COM [realms] DOMAIN.COMPANY.COM = { kdc = dc.company.com } [domain_realm] .domain.company.com = DOMAIN.COMPANY.COM domain.company.com = DOMAIN.COMPANY.COM .DOMAIN.COMPANY.COM = DOMAIN.COMPANY.COM DOMAIN.COMPANY.COM = DOMAIN.COMPANY.COM
ステップ7:Oracleデータベース・クライアントおよびサーバーのsqlnet.oraまたは.NET構成が前述のKerberos構成ファイルを示すように構成します
クライアントまたはサーバーのsqlnet.ora
を編集し、組み込みます。
sqlnet.kerberos5_conf = C:\krb\krb.conf
または、クライアント・アプリケーション構成を編集して(設定セクションで)組み込みます。
<setting name="sqlnet.kerberos5_conf" value="C:\krb\krb.conf" />
ステップ8:クライアントsqlnet.oraまたは.NET構成で資格証明キャッシュ・ファイルまたはMSLSAを示します
資格証明キャッシュ・ファイルを示す例:
sqlnet.kerberos5_cc_name = c:\krb\krb.cc
MSLSAを示す例:
sqlnet.kerberos5_cc_name = MSLSA:
ステップ9:sqlnet.oraまたは.NET構成のクライアントとサーバー認証サービスをKerberos5に設定します
sqlnet.authentication_services=(Kerberos5)
ステップ10:ステップ1で設定されたKerberosクライアント・ユーザーと一致する外部認証データベース・ユーザーを設定します(大文字、小文字に注意)
create user "ORACLECLIENT@DOMAIN.COMPANY.COM" identified externally; grant connect, create session to "ORACLECLIENT@DOMAIN.COMPANY.COM";
ステップ11:Windowsドメイン・クライアント・ユーザー(MSLSA用)を介してクライアント・マシンにログインするか、okinitを実行してクライアントKerberosユーザー(ファイル・ベースCC用)を認証します。
okinit oracleclient
ステップ12:ODP.NETアプリケーションを実行します
注意:
-
クライアントとサーバーを構成後、最後の2つのステップのみがODP.NETアプリケーションを実行するために継続的に必要なステップです。
-
Microsoft Visual Cランタイム・ライブラリ(MSVCRT.DLL)のバグによって、MicrosoftランタイムではKerberos5構成のODP.NET管理対象ドライバの設定が無視される可能性があります。そのような場合は、エラー・メッセージが表示されます。
OracleInternal.Network.NetworkException (0x80004005): NA Kerberos5: Authentication handshake failure at stage: krb5_sname_to_principal: default realm not found. Please set SQLNET.Kerberos5_conf.
このエラーを回避するには、ODP.NETアプリケーションのランタイム環境の
KRB5_CONFIG
が、SQLNET.Kerberos5_conf
によって示されたKerberos5構成ファイルを示すように手動で設定します。次に例を示します。set KRB5_CONFIG=c:\oracle\network\admin\krb5.ini
関連項目:
Kerberosと、Oracleデータベースでの構成に関する詳細は、『Oracle Databaseセキュリティ・ガイド』でKerberos認証の構成に関する項を参照してください。
Windowsネイティブ認証(NTS)の使用
Windowsのネイティブ認証アダプタで、OracleユーザーはWindowsユーザー・ログイン資格証明のみを使用してデータベースに対して認証できます。シングル・サインオンを可能にする方法を提供し、ユーザーおよびロールの資格証明管理を簡素化します。Windowsのネイティブ認証は、Windowsネイティブ認証(NTS)とも呼ばれています。
注意:
-
ODP.NET Coreでは、WindowsでのみWindowsネイティブ認証がサポートされます
-
Microsoft .NET APIの制限によって、ODP.NET管理対象ドライバはKerberosベース資格証明ではなく、Microsoft NT LAN Manager (NTLM)を介したWindowsネイティブ認証(NTS)のみをサポートします。通常、WindowsドメインおよびOracleデータベース・サーバーがデフォルトで透過的にNTLMとKerberosドメイン資格証明の両方をサポートするため、この制限はODP.NET管理対象ドライバ・アプリケーションからは見えません。
ODP.NETクライアントのWindowsネイティブ認証(NTS)の構成
ODP.NETクライアントのNTSを構成するステップ:
ステップ1:OSAUTH_PREFIX_DOMAINが正しく設定されていることを確認します
OSAUTH_PREFIX_DOMAIN
が適切に設定されていることを確認します。外部で識別されたユーザーIDがドメインを含めるようにするには、trueに設定します。それ以外の場合はfalseに設定します。パラメータはHKLM/software/oracle/HOME<ORACLE_SID>
にあるレジストリ設定です。たとえば、ORACLE_SID
がr1
の場合、HKLM/software/oracle/HOMEr1
に置かれます。
ステップ2:外部で識別されたデータベース・ユーザーを設定します
ステップ0の設定がtrueと仮定した場合、次のコマンドを使用して外部で識別されたデータベース・ユーザーを必要なWindowsドメイン・ユーザーと関連付けます。
create user "MYDOMAIN\MYUSER" identified externally; grant connect, create session to "MYDOMAIN\MYUSER";
ステップ3:認証方法としてNTSを使用するためにクライアント構成を設定します
クライアントのsqlnet.oraまたはアプリケーション設定を編集して、NTSをsqlnet.authentication_services
に追加します。たとえば、次のようになります。
sqlnet.authentication_services = (NTS)
注意:
クライアントとサーバーを構成後、最後の2つのステップのみがODP.NETアプリケーションを実行するために継続的に必要なステップです。
関連項目:
Windowsネイティブ認証の詳細は、Windows用の『Oracle Databaseプラットフォーム・ガイドfor Microsoft Windows』の「Windows環境におけるデータベース・ユーザーの認証」を参照してください。
ネットワーク・データの暗号化および整合性
ODP.NETはイントラネットおよびクラウド・デプロイメントの両方のネットワークのデータ暗号化および整合性を有効化します。これにより、データが認証されたユーザー以外のすべてのユーザーから隠れ、元のメッセージ・コンテンツが変更されていないことを保証します。以前のリリースでは、これらの機能はOracle Advanced Security Option(ASO)暗号化と呼ばれていました。Oracle Database 12cからは、ネットワーク・データ暗号化とデータ整合性を使用する際にOracle ASOが必要なくなりました。
データ暗号化の使用
管理対象および管理対象外のODP.NETは次の暗号化標準およびアルゴリズムをサポートします。
-
Advanced Encryption Standard(AES)
-
AES 128ビット
-
AES 192ビット
-
AES 256ビット
-
-
Triple-DES (3DES)
-
112ビット
-
168ビット
-
ODP.NET管理対象ドライバは次の設定を使用してネットワーク暗号化を構成します。
-
SQLNET.ENCRYPTION_CLIENT
-
SQLNET.ENCRYPTION_TYPES_CLIENT
関連項目:
使用方法の定義および詳細は、「settingsセクション」を参照してください。
データ整合性の使用
管理対象および管理対象外ODP.NETは次のデータ整合性アルゴリズムをサポートします。
-
SHA-1
-
SHA-2
-
SHA-256
-
SHA-384
-
SHA-512
-
関連項目:
-
ネットワーク暗号化および整合性、またはODP.NET管理対象外ドライバ用の構成の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。
-
ODP.NET管理対象ドライバでネットワーク暗号化またはデータ整合性を構成するには、Oracle Data Provider for .NET管理対象ドライバの構成で、
SQLNET.CRYPTO_CHECKSUM_CLIENT
およびSQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT
設定を参照してください。データ・サーバー・マシンで、sqlnet.ora
ファイルのSQLNET.CRYPTO_CHECKSUM_SERVER
パラメータとSQLNET.CRYPTO_CHECKSUM_TYPES_SERVER
パラメータを構成する必要がある可能性があります。
スキーマ検出
ADO.NETでは、OracleConnection.GetSchema
APIから5つの異なるタイプのメタデータ・コレクションが公開されています。これにより、アプリケーション開発者は、すべてのOracleデータ・ソースに対して、メタデータの取得を個別のアプリケーション・ベースでカスタマイズできます。このようにして、開発者は複数のデータ・ソースからのメタデータを管理する汎用セットのコードをビルドできます。
公開されているメタデータのタイプは次のとおりです。
-
MetaDataCollections
テーブル、列、インデックスおよびストアド・プロシージャなどのデータ・ソースから使用できるメタデータ・コレクションのリストです。
-
Restrictions
要求されたスキーマ情報の範囲を制限して、各メタデータ・コレクションに適用される制限。
-
DataSourceInformation
製品名やバージョンなど、現在使用されているデータベースのインスタンスについての情報。
-
DataTypes
データベースがサポートする各データ型についての情報のセット。
-
ReservedWords
Oracle問合せ言語の予約語。
関連項目:
メタデータのユーザー・カスタマイズ
ODP.NETでは、データベース・スキーマ情報の包括的なセットが提供されています。開発者は、個々のアプリケーション・ベースでGetSchema
メソッドが戻すメタデータを拡張またはカスタマイズできます。
これを行うには、開発者はカスタマイズしたメタデータ・ファイルを作成し、アプリケーションにファイル名を提供する必要があります。方法は次のとおりです。
-
カスタマイズしたメタデータ・ファイルを作成し、それを.NET Frameworkがインストールされた
CONFIG
サブディレクトリに置きます。これは、machine.config
およびセキュリティ設定があるディレクトリです。このファイルには、変更のみではなく、スキーマ設定情報のセット全体を含める必要があります。開発者は、ユーザー固有の要件を検索するスキーマ動作の変更を提供します。たとえば、開発者は内部データベース表にフィルタをかけ、ユーザー固有の表のみを検索できます。
-
次と同じく、アプリケーションの
app.config
ファイル内にエントリを追加し、メタデータ・ファイルの名前を名前/値ペアの書式で指定します。<oracle.dataaccess.client> <settings> <add name="MetaDataXml" value="CustomMetaData.xml" /> </settings> </oracle.dataaccess.client>
GetSchema
メソッドがコールされると、ODP.NETではapp.config
ファイルでカスタマイズしたメタデータXMLファイルの名前を確認します。最初に、GetSchema
メソッドはプロバイダにちなんで付けられた要素、この例ではoracle.dataaccess.client
でファイル内のエントリを検索します。このXML要素内の名前MetaDataXml
に対応する値は、カスタマイズしたXMLファイルの名前で、この例ではCustomMetaData.xml
です。
メタデータ・ファイルが正しいディレクトリ内にない場合、アプリケーションは、ODP.NETに含まれているデフォルトのメタデータXMLファイルをロードします。
関連項目:
接続プーリング
ODP.NET接続プーリングは、Pooling
接続文字列属性を使用して有効化または無効化できます。デフォルトでは、接続プーリングは有効です。次に、接続プーリング・サービスの動作を制御するConnectionString
属性を示します。
-
Connection
Lifetime
-
Connection
Timeout
-
Decr
Pool
Size
-
HA
Events
-
Incr
Pool
Size
-
Load
Balancing
-
Max
Pool
Size
-
Min
Pool
Size
-
Pooling
-
Validate
Connection
接続プーリングの例
次の例は、接続プーリングに関連するConnectionString
属性を使用して、接続をオープンします。
// C# using System; using Oracle.DataAccess.Client; class ConnectionPoolingSample { static void Main() { OracleConnection con = new OracleConnection(); //Open a connection using ConnectionString attributes //related to connection pooling. con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;" + "Min Pool Size=10;Connection Lifetime=100000;Connection Timeout=60;" + "Incr Pool Size=5; Decr Pool Size=2"; con.Open(); Console.WriteLine("Connection pool successfully created"); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Connection is placed back into the pool."); } }
接続プーリングの使用
接続プーリングが有効な場合(デフォルト)、OracleConnection
オブジェクトのOpen
およびClose
メソッドは、接続プーリング・サービスを暗黙的に使用します。これは、接続をプールしてアプリケーションに戻す処理を担当します。
接続プーリング・サービスは、プールを一意に識別するために、ConnectionString
プロパティを署名として使用して接続プールを作成します。
ODP.NETの管理対象バージョンとコア・バージョンでは、接続文字列自体が完全に一致している必要があります。キーワードが異なる順序で指定されている、または接続文字列にスペースが追加される場合は、新しいプールが作成されます。要求された署名を持つプールがすでに存在する場合、接続はそのプールからアプリケーションに戻されます。
管理対象外ODP.NETでは、接続文字列属性の値が変更された場合にのみ、新しいプールが作成されます。余分なスペースがある場合や、キーワード順序を変更した場合でも、新しいプールは作成されません。
接続プールが作成されると、接続プーリング・サービスは、ConnectionString
のMin
Pool
Size
属性で定義された接続数を最初に作成します。高速接続フェイルオーバーが無効な接続を削除するか接続存続期間が超えないかぎり、この接続数は、接続プールの接続プーリング・サービスによって常に保持されます。前述の2つのケースの場合、接続数は最小プール・サイズを下回る可能性があります。その場合、ODP.NETは次の接続リクエストで最小プール・サイズ・レベルのリストアを試みます。
これらの接続は、常にアプリケーションで使用され、またプール内でも使用できます。
ConnectionString
プロパティのIncr
Pool
Size
属性には、接続プールでより多くの接続が必要になったときに、接続プーリング・サービスで作成される新しい接続の数を定義します。
アプリケーションが接続をクローズすると、接続プーリング・サービスは、接続存続期間がConnection Lifetime
属性を超えているかどうかを調べます。超えている場合、接続プーリング・サービスは接続を破棄し、超えていない場合、接続は接続プールに戻ります。接続プーリング・サービスは、Close()
またはDispose()
が起動されたときのみ、Connection Lifetime
を実行します。
ConnectionString
プロパティのMax
Pool
Size
属性は、接続プールの接続の最大数を設定します。新しい接続が要求されたときに、有効な接続がなく、Max
Pool
Size
に達している場合、接続プーリング・サービスは、Connection
Timeout
属性で定義された時間待機します。Connection
Timeout
に達していても、プールに有効な接続がない場合、接続プーリング・サービスは、接続プール要求がタイムアウトしたことを示す例外を呼び出します。接続タイムアウトが発生すると、ODP.NETはそのタイムアウトの原因が、データベース・サーバーが所定の時間内に接続できなかったことであるか、プール・サイズの最大値に達したためにプール内に使用可能な接続がなかったことであるかを判断します。返される例外テキストは、「接続リクエストがタイムアウトしました」(前者の場合)または「プールされた接続リクエストがタイムアウトしました」(後者の場合)となります。
Validate
Connection
属性は、プールから発生する接続を検証します。この属性は、必要な場合にのみ使用してください。この属性により、データベースへのラウンドトリップが、各接続権をアプリケーションに付与する前に検証するためです。無効な接続が特殊な場合、開発者はValidate
Connection
属性を使用するのではなく、独自のイベント・ハンドラを作成して、新しい接続を取得および検証できます。通常は、これによりパフォーマンスが改善されます。
接続が使用されていない場合、接続プーリング・サービスは接続をクローズします。接続は3分ごとにクローズされます。ConnectionString
プロパティのDecr
Pool
Size
属性は、接続プーリング・サービスに対して、3分ごとにクローズできる接続の最大数を指定します。
Oracle Data Provider for .NETリリース11.1.0.6.20以降では、接続文字列で"pooling=true"
を設定して接続プーリングを有効化することにより(デフォルトで設定されます)、オペレーティング・システムの認証された接続もプールされます。
接続プールの管理
ODP.NET接続プール管理は、ODP.NETアプリケーションに関する明示的な接続プール管理を提供します。アプリケーションは接続プール内の接続を明示的にクリアできます。
接続プール管理を使用すると、アプリケーションは次を実行できます。
注意:
これらのAPIは、.NETストアド・プロシージャではサポートされません。
-
ClearPool
メソッドを使用して接続プールから接続をクリアします。 -
ClearAllPools
メソッドを使用して、アプリケーション・ドメイン内のすべての接続プール内の接続をクリアします。
関連項目:
接続パフォーマンス・カウンタ
Oracle Data Provider for .NETのインストールにより、ターゲット・システムにパフォーマンス・カウンタのセットが作成されます。すべてのODP.NETプロバイダ・タイプ(コア、管理対象および管理対象外)は、クライアント・アプリケーションごとにこれらのパフォーマンス・カウンタを公開します。これらのパフォーマンス・カウンタは、システムのWindowsパフォーマンス・モニター(Perfmon)またはSystem.Diagnostics
ネームスペースのPerformanceCounter
クラスで表示できます。
注意:
ODP.NETパフォーマンス・カウンタは、Windowsプラットフォームでのみ使用できます。
ODP.NETパフォーマンス・カウンタは、インストール後に有効化も登録もされないため、管理者はカウンタを登録してから、目的のカウンタを有効化してから監視する必要があります。
パフォーマンス・カウンタの登録
インストール後、ODP.NETパフォーマンス・カウンタを登録して、Perfmon
などのツールがそれらを消費できるようにします。登録には、プロバイダごとにPowerShellスクリプトを実行する必要があります。
ODP.NETは、PowerShellから実行して有効にする必要のあるカウンタ用に6つのスクリプトをインストールします
-
register_odpc_perfmon_counters.ps1
– ODP.NETコア・カウンタを登録します -
register_odpm_perfmon_counters.ps1
– 管理対象ODP.NETカウンタを登録します -
register_odpu_perfmon_counters.ps1
– 管理対象外ODP.NETカウンタを登録します -
unregister_odpc_perfmon_counters.ps1
– ODP.NETコア・カウンタの登録を解除します -
unregister_odpm_perfmon_counters.ps1
– 管理対象ODP.NETカウンタの登録を解除します -
unregister_odpu_perfmon_counters.ps1
– 管理対象外ODP.NETカウンタの登録を解除します
これらのスクリプトは、Oracle Universal InstallerおよびNuGetデプロイメントの場合はORACLE_HOME\odp.net\PerfCounters
ディレクトリ、xcopyデプロイメントの場合は<INSTALLATION_DIRECTORY>\odp.net\PerfCounters
ディレクトリ、およびMSIデプロイメントの場合は<VISUAL_STUDIO_SOLUTION_DIRECTORY>\packages\Oracle.ManagedDataAccess.<VERSION>\PerfCounters
ディレクトリに、それぞれあります。
これらのPowerShellスクリプトを実行する場合は、Windows管理者権限が必要です。
登録を解除するには、登録を解除するODP.NETプロバイダ・タイプに一致する登録解除PowerShellスクリプトを実行します。
以前は、カウンタの登録および登録解除用にOraProvCfg.exe
ユーティリティがODP.NETに付属していました。このユーティリティは、これらのPowerShellスクリプトによって置き換えられます。このユーティリティにODP.NETカウンタを登録した場合は、同じOraProvCfg.exe
バージョンで登録を解除します。
パフォーマンス・カウンタの有効化
ODP.NETにより、プールされた接続および非プール接続など、様々な接続カウンタを監視できます。これらのカウンタは、個別に監視することも、まとめて監視することもできます。開発者は、管理対象および管理対象外ODP.NETで使用可能な.NET構成ファイルの<settings>
セクション、または管理対象外ODP.NETでのみ使用可能なWindowsレジストリのPerformanceCounters設定を使用して、アプリケーションの起動の前にどのカウンタを使用するか設定できます。ODP.NETコアの場合、開発者はOracleConfiguration.PerformanceCounters
プロパティを設定できます。
表3-3に、接続パフォーマンス・カウンタの設定値を示します。
表3-3 接続プーリングのパフォーマンス・カウンタ
パフォーマンス・カウンタ | 有効な値 | 説明 |
---|---|---|
なし |
|
無効(デフォルト) |
|
|
Oracle Databaseで毎秒確立されるセッション数。 |
|
|
Oracle Databaseから毎秒切断されるセッション数。 |
|
|
接続プールから毎秒確立されるアクティブな接続数。 |
|
|
接続プールから毎秒戻されるアクティブな接続数。 |
|
|
アクティブな接続プールの合計数。 |
|
|
非アクティブな接続プール数。 |
|
|
使用中の接続の合計数。 |
|
|
すべての接続プールで使用可能な接続の合計数。 |
|
|
プールされたアクティブ接続および空き接続の合計数。 |
|
|
プールされていないアクティブな接続の数。 |
|
|
暗黙的にガベージ・コレクションに入った接続数。 |
|
|
操作は行われません。このカウンタはもうサポートされていません。 |
複数のカウンタを監視するために、これらの設定はビット単位のORedです。たとえば、SoftConnectsPerSecond (4)
、Soft DisconnectsPerSecond (8)
およびNumberOfActiveConnectionPools (16)
のカウンタを収集するには、PerformanceCounters
を28
(4+8+12)に設定します。
.NET構成ファイルでのパフォーマンス・カウンタの設定
パフォーマンス・カウンタは、管理対象および管理対象外ODP.NETでのみ、web.config
やapp.config
などの.NET構成ファイルを使用して設定できます。.NET構成エントリはWindowsレジストリ設定よりも優先されるので、特定のアプリケーションに使用できます。
前述のとおり、<settings>
セクションのPerformanceCounters
設定を移入すると、個々のパフォーマンス・カウンタを監視できます。WindowsのPerfmonは、非常に長く、読みづらいアプリケーション・インスタンス名を使用しています。各アプリケーションを識別しやすくするために、管理者は.NET構成ファイルの<connectionPools>
セクションに識別子名を割り当てることができます。このセクションでは、次の設定がサポートされています。
-
connectionString
: この設定は、接続文字列を一意の識別子として使用して監視する接続またはプールを識別します。ここで入力する接続文字列は、監視するターゲット接続文字列と一致する必要がありますが、パスワード属性はありません。 -
poolName
(オプション): 接続文字列は非常に長く、多くがよく似た外観のため読みづらい可能性があります。poolName
を使用すると、任意の文字列を使用して監視対象プールを簡単に識別できます。
次の例に、これらの設定を使用する方法を示します。
ODP.NET管理対象ドライバ
<oracle.manageddataaccess.client> <version number="*"> <connectionPools> . . <connectionPool connectionString="[connection string without password]" poolName="[Pool Name]"> </connectionPool> . . </connectionPools> </version> </oracle.manageddataaccess.client>
ODP.NET管理対象外ドライバは、<oracle.manageddataaccess.client
>タグを<oracle.unmanageddataaccess.client
>タグに置き換えることによって、上にリストしたのと同じプール名の設定とフォーマットを使用できます。または、管理対象外ODP.NETにレガシー<oracle.dataaccess.client
>フォーマットを使用できます。
ODP.NET管理対象外ドライバ
<configuration> <oracle.dataaccess.client> <settings> . . <add name="[connection string without password]" value="connectionPool name='[Pool Name]'"/> . . </settings> </oracle.dataaccess.client> </configuration>
Windowsレジストリでのパフォーマンス・カウンタの設定
管理対象外ODP.NETパフォーマンス・カウンタの公開を個別に有効または無効にするには、タイプREG_SZ
のWindowsレジストリ値PerformanceCounters
を使用します。このレジストリ値は次のようになります。
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\
Assembly_Version
Assembly_Version
は、Oracle.DataAccess.dll
の完全なアセンブリ・バージョン番号です。
.NET構成ファイルと同様に、有効な値を追加して複数のパフォーマンス・カウンタを取得できます。たとえば、PerformanceCounters
が3に設定されている場合、HardConnectsPerSecond
およびHardDisconnectsPerSecond
は有効になります。
パフォーマンス・カウンタの公開
一般に、ODP.NETパフォーマンス・カウンタはPerfmonを使用して監視されます。カウンタは、次のカテゴリ名で公開されます。
-
ODP.NET、コア・ドライバ
-
ODP.NET管理対象ドライバ
-
ODP.NET管理対象外ドライバ
管理者は、これらのカテゴリを1つ以上選択した後で、監視する個々のODP.NETカウンタを選択できます。PerfMonはすべてのODP.NETカウンタを表示しますが、明示的に有効化されたカウンタのみ統計情報を生成します。
監視するカウンタを選択した後、管理者は監視する実行中のインスタンスを選択します。ODP.NETインスタンスは、PerfMonに表示されるようにアクティブに実行する必要があります。そうでない場合、モニターに使用可能なインスタンスは表示されません。インスタンス選択が発生した後、監視するカウンタとしてPerfMonに追加されます。
パフォーマンス・カウンタは、アプリケーション・ドメイン、プールまたはデータベース・インスタンスのレベルで監視できます。データベース・インスタンス・レベルの監視が適用されるのは、ロード・バランシング機能または高速接続フェイルオーバー機能が有効化されている場合のみです。
インスタンス名の形式は次のとおりです。
<アプリケーション・ドメイン名> [<プロセスID>, <アプリケーション・ドメインID>][<接続文字列/プール名>][<インスタンス名>]
。エントリの上限は127文字です。インスタンス名の各フィールドに対して長さの制約があります。次の表に、各フィールドの最大文字数を示します。
表3-4 パフォーマンス・カウンタのフィールド名と、最大文字数
フィールド名 | 最大文字数 |
---|---|
アプリケーション・ドメイン |
40 |
プール名/接続文字列 |
70 |
データベース・インスタンス名 |
16 |
フィールド値の長さが上限を超えているときは、その文字列は長さ制限に収まるように切り詰められて、続きがあることを示す「...
」が末尾に付加されます。たとえば、アプリケーションの名前がProgram.exe
で接続文字列がuser id=hr;Password=<password>;data source=inst1;max pool size=125;min pool size=50
であるとします。アプリケーション・ドメインが2つあるプロセスの場合は、次のようになります。
-
Program.exe [123, 1]
-
Program.exe [123, 1][ user id=hr;data source=inst1;max pool siz...]
-
Program.exe [123, 1][ user id=hr;data source=inst1;max pool siz...] [instA]
-
Domain 2[123, 2]
-
Domain 2[123, 2][ user id=hr;data source=inst1;max pool siz...]
-
Domain 2[123, 2][ user id=hr;data source=inst1;max pool siz...] [instB]
-
Domain 2[123, 2][ user id=hr;data source=inst1;max pool siz...] [instC]
接続プールの属性は先頭の70文字がよく似ているため、アプリケーションでプール名を設定しておくと監視ツールで各プールを一意に識別できるようになります。たとえば、プール名を使用するとき、プロセスは次のように表示されます。
Domain 2[123, 2][Pool Name][instC]
データベース常駐接続プーリング
クライアント側の接続プーリングは、中間層マシンにとって非常に効率的です。ただし、アイドル接続の中間層サーバーが大量にある場合、データベース・サーバー・リソースを大量に消費する可能性があります。アイドル接続の数は最小限におさえることを目的としていますが、中間層サーバーが増加すると、それぞれにアプリケーション間で共有できないアイドル接続を持つ可能性があるため難しくなります。
データベース常駐の接続プール(DRCP)は、データベース・サーバー・レベルで接続をプールすることでリソース使用率を最適化することを目的としており、これにより多くのアプリケーション間で共有できます。利点は、スケーラビリティが向上し、データベース・サーバー・レベルでリソース使用率が低下することです。
管理対象および管理対象外ODP.NETは、DRCPをサポートするように拡張され、これによりDRCP接続を確立および切断してデータベース・サーバー・リソースをさらに有効に活用できます。
DRCPについて
DRCPプール・サーバーのプロセスは、それぞれが専用サーバー・プロセスとデータベース・セッションを組み合せたものと同等です。これらは、プールされたサーバーと呼ばれます。プールされたサーバーは、同じホストまたは複数のホストで実行されている複数のアプリケーションによる共有が可能です。
DRCPがOracle Database Real Application Clusters (Oracle RAC)用に構成されている場合、プール構成は各データベース・インスタンスに適用されます。1つのインスタンスでプールを起動または停止すると、すべてのインスタンスのプールが起動または停止されます。
DRCPおよびODP.NET
DRCPは、ODP.NETのクライアント側のプーリングを補完するサーバー側のプールです。これらの2つのプールは一緒に使用できます
典型的な専用サーバー・モードでは、クライアント側の接続プーリングによって、サーバー・ラウンド・トリップとソケット/セッション作成の両方が節約されます。接続のオープン/クローズ手順では、サーバー・ラウンド・トリップは最初のOpen()
にのみ含まれます。同じ接続に対する後続のオープン/クローズ手順の場合、接続はクライアント・アドレス空間にローカルにプールされているため、クライアントからサーバーへの対話は必要ありません。
DRCPを有効にすると、クライアントが接続を確立するときに必要に応じて接続にプールされたサーバーが割り当てられます。接続がクローズされると、データベース・サーバーはDRCPサーバー・セッションをリリースしてサーバー側プールに戻し、DRCPサーバー・セッションを効率的に再利用できるようにします。このサーバー・セッションは、同じプールまたは同一または異なる中間層ホストの異なるプールによって再利用できます。
DRCPおよびODP.NETの構成
次の項では、クライアント側およびサーバー側でDRCPを構成する方法を説明します。
-
クライアント側でのDRCPの構成
ODP.NET開発者は、接続記述子で
(SERVER=POOLED)
を使用することで、クライアント側でDRCPを有効にできます。サンプル接続記述子:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=myhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=sales.example.com)(SERVER=POOLED)))
-
サーバー側でのDRCPの構成
Oracleデータベースには、
SYS_DEFAULT_CONNECTION_POOL
と呼ばれるデフォルトの接続プールがあります。デフォルトでは、このプールは作成されますが起動はされません。データベース常駐接続プーリングを使用可能にするには、接続プールを明示的に起動する必要があります。プールを起動し終了するには、データベース管理者(DBA)が
SYSDBA
としてログインする必要があります。SQL> EXECUTE DBMS_CONNECTION_POOL.START_POOL();
アプリケーションが複数の中間層サーバー間でDRCP接続プールを共有する場合、アプリケーションには、サーバー・プールを一意に識別する文字列値に
OracleConnection.DRCPConnectionClass
プロパティを設定するオプションがあります。このプロパティを設定してDRCP接続をオープンすると、ODP.NETはその特定のサーバー・プールからの接続を使用するようにDRCPに指示します。この機能によって、データベース・サーバーは複数の中間層サーバー間で容易に拡張できるようになります。
例3-1 データベース常駐接続プーリング・アプリケーションの使用: サンプル・コード
// This application uses the following connect descriptor:
// oracle = (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=<hostname>)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=<service name>)(SERVER=POOLED)))
using System;
using Oracle.ManagedDataAccess.Client;
class DRCP
{
static void Main()
{
string constr = “user id=hr;password=hr;data source=oracle";
OracleConnection con = new OracleConnection(constr);
con.DRCPConnectionClass = "GroupA";
con.Open();
con.Dispose();
}
}
注意:
ODP.NET管理対象外ドライバでDRCPを使用するには、次の設定が必要です。
-
.NET構成設定、
CPVersion
が2.0
に設定される必要があります。または、 -
CPVersion
は設定せずに、アプリケーションで使用されるTNS完全ディスクリプタに(SERVER=POOLED)
を設定します。
詳細は、「settingsセクション」を参照してください。
関連項目:
デフォルト接続プールまたはエンド・プールの構成の詳細は、『Oracle Database管理者ガイド』を参照してください。
Oracle MultitenantのDRCP
PDBにDRCPを作成することはできません。DRCPは、CDBにのみ作成でき、すべてのPDB間で共有できます。
ODP.NETはCDB全体で1つのDRCPを持ち、ルート・コンテナに接続するだけで構成および管理(起動、停止または再構成)できます。
構成する場合は、CDBを指すようにセッションを設定して、DRCPプールを開始します。次に例を示します。
alter session set container = cdb$root;
execute dbms_connection_pool.configure_pool('SYS_DEFAULT_CONNECTION_POOL');
execute dbms_connection_pool.start_pool();
Oracle Real Application Clusters (RAC)のDRCP
Oracle Real Application Clusters (RAC)環境では、インスタンスにDRCPを作成すると、そのDRCPはOracle RACデータベースのすべてのインスタンスにレプリケートされ、任意のインスタンスを使用して接続プールを管理できます。プール構成に対する変更は、すべてのOracle RACインスタンスで適用されます。
ODP.NETのDRCP制限
ODP.NETは、次のDRCPの機能はサポートしません。
-
エンド・ユーザー認証を使用したプロキシ接続のオープン
-
sysoper
接続のオープン -
OpenWithNewPassword
を使用したオープン -
SQLNET.AUTHENTICATION_SERVICES
パラメータ値のnts
への設定(これにより、Microsoft Windowsネイティブのオペレーティング・システム認証が有効になります) -
.NET Framework 4より前の.NET Frameworkバージョン
Oracleマルチテナントおよびプラガブル・データベース
Oracle Database 12cでは、Oracle Multitenantが導入され、これにより、スキーマ、スキーマ・オブジェクト、非スキーマ・オブジェクトのポータブル・コレクションをOracle Database内に構成し、これらを個別のデータベースとしてODP.NETに表示することができます。この自己完結型コレクションは、プラガブル・データベース(PDB)と呼ばれます。
Oracle Multitenantは、顧客がアプリケーションを変更することなく、複数のプラガブル・データベースを簡単に統合できるデータベース・アーキテクチャです。このアーキテクチャにより、多数のデータベースを1つのデータベースとして管理する利点をすべて提供しつつ、別々のデータベースの独立性およびリソース優先度付けを維持します。また、Oracle Multitenantは迅速なプロビジョニングおよびアップグレードを可能にし、他のOracleデータベース・オプションを完全に補完します。
管理対象および管理対象外のODP.NETは、Oracle Multitenantを完全にサポートします。個々のプラガブル・データベースに接続できることに加えて、ODP.NETは拡張されて、アプリケーションが同じ接続プールから特定のPDBに対して接続をリクエストおよび取得できるようになりました。アプリケーションは、同じコンテナ・データベース(CDB)の一部であるPDBのどれにでも接続でき、同じ共通ユーザーを持つ必要があります。また、接続がOracle Real Application Clustersなどで複数のインスタンスにまたがる場合、すべてのインスタンスは、共通ユーザーが接続するためにまったく同じPDBおよびサービスを一様に持つ必要があります。こうした条件が満たされると、ODP.NETは同じプール内の1つのPDBから別のPDBへの接続を、非常に効率的な方法で接続または暗黙的に切り替えることができます。
特定のPDBへの接続を(共通ユーザーとして)確立するには、OracleConnections
プロパティ、PDBName
およびServiceName
を設定してから、OracleConnection.Open()
を呼び出して、指定したPDBおよびサービス名への接続を確立します。PDBName
およびServiceName
は、接続プールからの既存のアイドル接続を使用する場合に、接続の確立または切り替えが必要なPDBおよびサービスを識別します。これらは、それぞれプラガブル・データベース名およびデータベース・サービス名です。PDBName
プロパティのみが設定されていて、サービス名が設定されていない場合、プロバイダはデフォルト(管理)・サービスを使用する接続を戻します。
注意:
ODP.NETでは、管理対象外ドライバは同じプール内でPDB接続を切り替えることができます。
-
.NET構成設定、
CPVersion
が2.0
に設定される必要があります。または、 -
CPVersion
は設定せずに、指定された接続文字列の接続要求に対してPDBName
またはServiceName
(あるいはその両方)にNULL以外/空以外の値を設定します。
詳細は、「settingsセクション」を参照してください。
例3-2 プラガブル・データベースの使用: サンプル・コード
// C#
using System;
using Oracle.ManagedDataAccess.Client;
class PDB
{
static void Main()
{
string constr = “user id=hr;password=hr;data source=oracle”;
OracleConnection con = new OracleConnection(constr);
con.PDBName = "pdb1";
con.ServiceName = "db1.company.com";
con.Open();
con.Close();
}
}
ODP.NETは、プールされた接続が確立されているPDBName
およびServiceName
を追跡します。アプリケーションが指定されたPDBName
およびServiceName
で接続を要求すると、ODP.NETは要求と一致する接続を戻します。ただし、一致する接続が見つからない場合、ODP.NETは新しい接続を作成またはセッションを変更(あるいはその両方)を行って、要求されたPDBName
およびServiceName
に切り替えます。PDBName
またはServiceName
(あるいはその両方)が変更されている場合、SwitchedConnection
プロパティは、Open()
メソッドの起動で呼び出されると、trueを戻します。
ODP.NETでは、プロセスの存続中にALTER SESSION
文を使用してエディションベースの再定義でエディションを変更することはサポートされていません。Oracle Continuous Query NotificationでPDBを使用している場合、Oracle Database 12cリリース2以上に接続する必要があります。同じプールから複数のPDBへの接続をホストするには、ODP.NET for .NET Framework 4以上が必要です。
注意:
あるPDB/サービスから別のPDB/サービスに接続が暗黙的に切り替えられている場合、サービス再配置接続タイムアウト(SRCT)は有効になりません。
関連項目:
『Oracle Database管理者ガイド』のプラガブル・データベースの管理に関する説明を参照
エディションベースの再定義
エディションベースの再定義を使用すると、アプリケーションが使用中であってもそのデータベース・コンポーネントをアップグレードできます。このため、アプリケーションの停止時間を最小化あるいは排除することができます。
ODP.NETでは、プロセスの存続期間中にALTER SESSION
文を使用してエディションを変更することはサポートされていません。
管理対象および管理対象外ODP.NETはデータベース・エディションに接続でき、同じプール内の複数のエディションへの接続をホストすることもできます。ODP.NETアプリケーションは、OracleConnection.DatabaseEditionName
プロパティを接続が関連付けられるデータベース・エディションの名前に設定することで、指定されたデータベース・エディションに関連付けられている接続を取得できます。単一のプールを使用するには、同じユーザーが両方のエディションに接続できる必要があります。ODP.NETは同じ接続プールを使用でき、エディション固有のプロパティを変更するだけで同じOracleConnection
オブジェクトを共有することもできるため、エディションを使用するとアプリケーションのパフォーマンスが向上し、効率的になります。
例3-3 エディションベースの再定義の使用: サンプル・コード
using System;
using Oracle.ManagedDataAccess.Client;
class Editions
{
static void Main()
{
// Create a connection
string constr = “user id=hr;password=hr;data source=oracle”;
OracleConnection con = new OracleConnection(constr);
// Obtain a connection associated with EditionX
con.DatabaseEditionName = "EditionX";
con.Open();
// Obtain a connection associated with EditionY
con.Close();
con.DatabaseEditionName = "EditionY";
con.Open();
con.Dispose();
}
}
接続をオープンしている間にDatabaseEditionName
を使用してエディション名を変更することはできません。接続がクローズ状態のときに変更する必要があります。
ODP.NETは、Oracle Database 11gリリース2以上に接続する場合にエディションをサポートします。同じプールで複数のエディションをホストすることは、ODP.NET for .NET Framework 4以上でのみ可能です。
注意:
管理対象外ODP.NET接続プールでこのエディションベースの再定義機能を使用するには、次の設定が必要です。
-
.NET構成設定、
CPVersion
が2.0
に設定される必要があります。または、 -
CPVersion
は設定せずに、指定された接続文字列の接続要求に対してDatabaseEditionName
プロパティにNULL以外/空以外の値に設定します。
詳細は、「settingsセクション」を参照してください。
アプリケーションは、レジストリまたは構成ファイルを使用して、デプロイメント時にエディションを指定できます。アプリケーションは、タイプREG_SZ
の次のレジストリ・エントリを作成できます。
HKLM\Software\Oracle\ODP.NET\version\Edition
ここで、version
はODP.NETのバージョン、Edition
はエディションの有効な文字列値です。
アプリケーションは、かわりにweb.config
またはapplication.config
構成ファイルを使用して、デプロイメント時にエディションを指定できます。machine.config
構成ファイルを使用すると、特定のバージョンの.NET frameworkを使用するすべてのアプリケーションに対してエディションを指定できます。
次の例では、ODP.NET管理対象外ドライバの.NET構成ファイルでエディションをE1
に設定します。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <oracle.dataaccess.client> <settings> <add name="Edition" value="E1"/> </settings> </oracle.dataaccess.client> </configuration>
まとめると、エディション名は.NET構成ファイルまたはWindowsレジストリのDatabaseEditionName
プロパティで設定することができます。DatabaseEditionName
が設定されている場合、他の2つの設定より優先されます。.NET構成ファイルにエディションが設定されている場合、レジストリよりも優先されます。
関連項目:
エディションの詳細は、『Oracle Database管理者ガイド』および『Oracle Database開発者ガイド』を参照
オペレーティング・システム認証
Oracle Databaseは、Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証できます。Windowsのユーザー・ログイン資格証明を使用して接続をオープンするには、User
Id
接続文字列属性をスラッシュ(/)
に設定する必要があります。Password
属性を指定しても無視されます。
注意:
オペレーティング・システム認証は、.NETストアド・プロシージャではサポートされません。
ODP.NET Coreでは、Windowsでのみオペレーティング・システム認証がサポートされます。
オペレーティング・システム認証を使用する接続を含む、すべてのODP.NET管理対象外ドライバ接続がプールできます。ODP.NET管理対象ドライバは、WindowsドメインがKerberosベースのドメイン認証のみをサポートするように制限されている場合を除き、オペレーティング・システム認証をサポートします。プーリングが有効になっている間は、デフォルトで接続はプールされ、構成は必要ありません。
オペレーティング・システム認証の使用例を次に示します。
/* Create an OS-authenticated user in the database Assume init.ora has OS_AUTHENT_PREFIX set to "" and <OS_USER> is any valid OS or DOMAIN user. create user <OS_USER> identified externally; grant connect, resource to <OS_USER>; Login through OS Authentication and execute the sample. See Oracle documentation for details on how to configure an OS-Authenticated user */ // C# using System; using Oracle.DataAccess.Client; class OSAuthenticationSample { static void Main() { OracleConnection con = new OracleConnection(); //Establish connection using OS Authentication con.ConnectionString = "User Id=/;Data Source=oracle;"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
関連項目:
Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証するようにOracle Databaseを設定する方法の詳細は、Oracle Database管理者リファレンスfor Microsoft Windowsを参照
特権接続
データベース管理者は、SYSDBA
またはSYSOPER
権限を使用してOracle Databaseにアクセスできます。これは、ConnectionString
プロパティのDBA
Privilege
属性によって実行されます。
次の例では、SYSDBA
としてscott
/tiger
に接続します。
// C# using System; using Oracle.DataAccess.Client; class PrivilegedConnectionSample { static void Main() { OracleConnection con = new OracleConnection(); //Connect scott/tiger as SYSDBA con.ConnectionString = "User Id=scott;Password=tiger;" + "DBA Privilege=SYSDBA;Data Source=oracle;"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
関連項目:
データベースでの特権接続の詳細は、表6-47のDBA Privilegeを参照してください。
OracleCredentialでの接続プーリング
パスワードをさらに安全にするため、すべてのODP.NETアプリケーションは、OracleCredential
を使用して、接続文字列の外部にユーザー名とパスワードを格納できます。OracleCredential
を使用すると、ページ・ファイル・スワップまたはクラッシュ・ダンプにユーザー資格証明が公開される可能性を軽減できます。
OracleCredential
は、接続プーリングの有無にかかわらず使用できます。
OracleCredential
オブジェクトを使用する場合、Oracleデータベースへの接続を開くときに、この新機能を考慮して変更された接続プール・アルゴリズムを認識する必要があります。ODP.NET接続プール・アルゴリズムの以前の実装では、接続文字列属性値の一意性を使用して新しい接続プールを作成する必要があるか、既存の接続プールを使用して接続を配布できるかを決定していました。ただし、OracleCredential
の導入では、このオブジェクトの参照も使用して、どの接続プールにOracleConnection
オブジェクトが関連付けられるかを決定します。
新しい接続プールを作成する決定は、2つのファクタに依存します。1つ目は(以前のリリースのように)接続文字列の一意性、2つ目は、新しい接続を開くときのOracleConnection
オブジェクトに指定されたOracleCredential
の参照比較です。これらのいずれかが異なる場合は、別のプールが使用されます。
次に、新しいアルゴリズムを明確にする方法を示します。
using System; using Oracle.DataAccess.Client; //using Oracle.ManagedDataAccess.Client; class Test { static void Main() { string connStr1 = “user id=hr; password=hr; data source=oracle”; string connStr2 = “data source=oracle”; SecureString secPwd = new SecureString(); secPwd.AppendChar(‘h’); secPwd.AppendChar(‘r’); OracleCredential oc1 = new OracleCredential (“hr”, secPwd); OracleCredential oc2 = new OracleCredential (“hr”, secPwd); OracleCredential oc3 = new OracleCredential (“hr”, secPwd); // con1 and con2 are associated with the same connection pool since both are using the same // connection string and OracleCredential remains null in both cases. OracleConnection con1 = new OracleConnection (connStr1) OracleConnection con2 = new OracleConnection (connStr1, null) // con3 and con4 use the same connection string but different OracleCredential objects // (although same contents) so they are associated with different connection pools. OracleConnection con3 = new OracleConnection (connStr2, oc1) OracleConnection con4 = new OracleConnection (connStr2, oc2) // con5 and con6 use the same connection string and same OracleCredential object // so they are associated with the same connection pool. OracleConnection con5 = new OracleConnection (connStr2, oc3) OracleConnection con6 = new OracleConnection (connStr2, oc3) // Please note that con1, con3, con4, and con5 are all associated // with a different connection pool. } }
注意:
OracleCredential
では、SecureString
パスワードの二重引用符をサポートしません。ただし、二重引用符はパスワード内で使用できます。
関連項目:
パスワードの有効期限
ユーザーのパスワードを失効させることができます。ODP.NETは、新規パスワードで接続をオープンする新しいメソッドOpenWithNewPassword
を指定することで、アプリケーションにパスワードの失効を処理させることができます。
次のコードは、panther
の新規パスワードで接続するために、OracleConnection
OpenWithNewPassword
メソッドを使用しています。
/* Database Setup connect / as sysdba; drop user testexpire cascade; -- create user "testexpire" with password "testexpire" grant connect , resource to testexpire identified by testexpire; alter user testexpire password expire; */ // C# using System; using Oracle.DataAccess.Client; class PasswordExpirationSample { static void Main() { OracleConnection con = new OracleConnection(); try { con.ConnectionString = "User Id=testexpire;Password=testexpire;Data Source=oracle"; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); } catch (OracleException ex) { Console.WriteLine(ex.Message); //check the error number //ORA-28001 : the password has expired if (ex.Number == 28001) { Console.WriteLine("\nChanging password to panther"); con.OpenWithNewPassword("panther"); Console.WriteLine("Connected with new password."); } } finally { // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } } }
注意:
-
OpenWithNewPassword
は、パスワードを変更するためではなく、ユーザーのパスワードが失効した場合のみ使用してください。 -
接続プーリングが有効な場合、
OpenWithNewPassword
メソッドを呼び出すと接続プールがクリアされます。その結果、古いパスワードで作成されたアイドル接続はすべてクローズされます。
プロキシ認証
データベースの設定が正しければ、データベース・ユーザーのアイデンティティおよび特権を保持し、ユーザーのかわりに監査処理を実行して、プロキシ認証により、中間層アプリケーションでセキュリティを制御できるようになります。そのためには、(実在の)データベース・ユーザー(複数可)のかわりにデータベースに接続し、認証を受けるプロキシ・データベース・ユーザーを作成および使用します。
さらに、プロキシ認証をすると、接続プーリングのスケーラビリティを強化できます。接続プーリングをプロキシ認証と組み合せて使用すると、プロキシ認証済の接続を、実在する複数のユーザー間で共有できます。これは、プロキシに対して確立済の接続およびセッションのみがキャッシュされるためです。プロキシ認証済の接続を要求すると、セッションが実際のユーザーに対して追加作成されますが、このプロキシ認証済接続がプール内に戻されると、追加作成されたセッションは廃棄されます。この設計により、セキュリティを犠牲にすることなくアプリケーションのスケーラビリティを強化できます。
ODP.NETアプリケーションでプロキシ認証を使用するには、接続文字列に、"Proxy
User
Id"
属性および"Proxy
Password"
属性を設定します。実在のユーザーは、"User
Id"
属性で指定します。オプションで、"Password"
接続文字列属性を介して実在のユーザーのパスワードを指定すると、セキュリティがさらに強化されます。プロキシ認証とともに分散トランザクションを使用する場合は、実際のユーザーのパスワードがオプションでなくなるため、パスワードを指定する必要があります。
ODP.NETプロキシ認証の使用例を次に示します。
/* Log on as DBA (SYS or SYSTEM) that has CREATE USER privilege. Create a proxy user and modified scott to allow proxy connection. create user appserver identified by eagle; grant connect, resource to appserver; alter user scott grant connect through appserver; */ // C# using System; using Oracle.DataAccess.Client; class ProxyAuthenticationSample { static void Main() { OracleConnection con = new OracleConnection(); // Connecting using proxy authentication con.ConnectionString = "User Id=scott;Password=tiger;" + "Data Source=oracle;Proxy User Id=appserver;Proxy Password=eagle; "; con.Open(); Console.WriteLine("Connected to Oracle" + con.ServerVersion); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); Console.WriteLine("Disconnected"); } }
関連項目:
-
ALTER
USER
文のプロキシ句の説明と構文は、Oracle Database SQL言語リファレンスを参照 -
SQL文に対する監査の動作と、多層環境における権限については、Oracle Databaseセキュリティ・ガイドを参照
動的な分散トランザクション登録
OracleConnection
オブジェクトのEnlistDistributedTransaction
を使用して分散トランザクションに動的に登録するアプリケーションでは、"Enlist"
接続文字列属性の値を"true"
に設定する必要があります。"Enlist=true"
の場合、COM+トランザクションまたはSystem.Transactions
のコンテキスト内でOracleConnection
オブジェクトに対してOpen
メソッドがコールされると、接続がトランザクションに登録されます。そうでない場合、OracleConnection
オブジェクトは分散トランザクションに登録されませんが、後でEnlistDistributedTransaction
またはEnlistTransaction
メソッドを使用して明示的に登録できます。"Enlist
"が"false
"または"dynamic
"の場合、接続はトランザクション内に登録できません。ODAC 12cリリース3のODP.NET管理対象外ドライバは、"Enlist=dynamic
"用にこの新しい動作を最初に導入しました。
クライアント識別子とエンドツーエンド・トレース
クライアント識別子は、Oracleアプリケーションのコンテキスト・ネームスペースUSERENV
から事前に定義された属性です。ユーザーのアイデンティティのトラッキングが可能であるという点で、プロキシ認証に似ています。ただし、プロキシ認証では、2つのセッション(プロキシ・ユーザー用とエンド・ユーザー用)を作成する必要がありません。さらに、クライアント識別子は、データベース・ユーザーである必要はありません。任意の文字列に設定できます。最も重要な点は、クライアント識別子を使用することで、ODP.NET開発者がApplication ContextおよびOracle Label Securityを使用してOracle Virtual Private Database(VPD)をより簡単に構成できることです。クライアント識別子を設定するため、接続をオープンしてから、ODP.NETアプリケーションでOracleConnection
オブジェクトにClientId
プロパティを設定できます。管理対象外ODP.NETで接続プーリングが有効な場合、プールに接続が戻されると、常にClientId
はnullにリセットされます。管理対象ODP.NETでは、接続がプールに戻されてから最初のデータベース・ラウンドトリップの際に、ClientId
がnullにリセットされます(新しい値が指定されていない場合)。
クライアント識別子は、エンドツーエンド・アプリケーション・トレースにも使用できます。エンドツーエンド・トレースは、複数層環境のパフォーマンス上の問題の診断プロセスを単純化します。複数層環境では、エンド・クライアントからの要求は中間層で別のデータベース・セッションにルーティングされるため、異なるデータベース・セッションを越えてクライアントを追跡することは困難になります。エンドツーエンド・トレースでは、クライアント識別子を使用して、データベース・サーバーに対するすべての層から特定のエンドクライアントを一意にトレースします。
ODP.NETでは、OracleConnection
オブジェクトの書込み専用プロパティであるActionName、ClientId
、ClientInfo
、およびModuleName
が公開されています。これらのプロパティは、次のエンドツーエンドのトレース属性に対応しています。
-
Action
- モジュールのINSERT
操作やUPDATE
操作などのアクションを指定します。 -
ClientId
-HR.HR
などのログオンIDに基づいてエンド・ユーザーを指定します。 -
クライアント情報
- ユーザー/セッション情報を指定します。 -
Module
- アプリケーションのAccounts ReceivableやGeneral Ledgerなどの機能ブロックを指定します。
関連項目:
-
エンドツーエンド・アプリケーションのトレースの概要は、Oracle Database SQLチューニング・ガイドを参照
透過的アプリケーション・フェイルオーバー(TAF)コールバックのサポート
透過的アプリケーション・フェイルオーバー(TAF)は、高可用性を提供するOracle Databaseの機能です。
注意:
ODP.NET管理対象ドライバおよびODP.NET Coreでは、TAFおよびTAFコールバックはサポートされていません。
TAFを使用すると、接続が継続していれば、別のデータベース・インスタンスに自動的に再接続できます。アクティブなトランザクションはロールバックされますが、別のノードを経由した新しいデータベース接続は、元の接続と同一です。これは、接続が失敗した方法に関係なく当てはまります。
TAFを使用すると、アプリケーションを提供するインスタンスが1つ残っているかぎり、クライアントで接続が失われることはありません。データベース管理者は、インスタンスで実行されるアプリケーションを制御して、各アプリケーションのフェイルオーバー命令も作成します。
別のデータベースにセッションがフェイルオーバーした場合、元のセッションで最初に設定されていたNLS設定は、新しいセッションに引き継がれません。したがって、これらのNLS設定は、アプリケーション側で新しいセッションに設定する必要があります。
TAF通知
フェイルオーバーによる遅延を考慮して、アプリケーションではTAFコールバックによる通知を必要とします。ODP.NETは、OracleConnection
オブジェクトのFailover
イベントによるTAFコールバック機能をサポートしています。これにより、フェイルオーバーが発生したときは常にアプリケーションに通知されます。TAFコールバックを受信するには、Failover
イベントにイベント・ハンドラ関数を登録する必要があります。
フェイルオーバーが発生した場合
フェイルオーバーが発生すると、Failover
イベントが発生し、別のOracleインスタンスに接続を再確立する過程で、イベント・ハンドラが複数回起動されます。
イベント・ハンドラの最初のコールは、Oracleデータベースがインスタンス接続の損失を最初に検出したときに行われます。これにより、アプリケーションはフェイルオーバーの次の遅延に応じて動作します。
フェイルオーバーが成功した場合、接続が再確立されて使用可能になったときにFailover
イベントが発生します。この時点で、アプリケーションはOracleGlobalization
セッション設定を再同期化して、フェイルオーバーが発生したことをアプリケーション・ユーザーに通知できます。FailoverEvent.Begin
イベントの直後には、大きいデータベース操作が発生しません。SQLと主なデータベース操作は、FailoverEvent.End
イベントまで待つようにしてください。FailoverEvent.Begin
は主として、フェイルオーバーを拒否するか、またはフェイルオーバーをトレースするために使用されます。FailoverEvent.Begin
は、フェイルオーバーが進行中であり、完了を待ってから続行するようエンド・ユーザーに告知するなど、データベース以外のアプリケーション操作にも使用されます。トランザクションは、フォルト・チケットの発行や監査など、FailoverEvent.End
コールバック・フェーズで使用できます。これらのトランザクションは、コールバックが完了する前にコミットする必要があります。
フェイルオーバーが失敗した場合、フェイルオーバーが発生しなかったことをアプリケーションに通知するために、Failover
イベントが発生します。
アプリケーションは、イベント・ハンドラに渡されるOracleFailoverEventArgs
オブジェクトをチェックすることで、フェイルオーバーが成功したかどうかを判断できます。
フェイルオーバーのイベント・ハンドラの登録
次のコード例は、OnFailover
と呼ばれるイベント・ハンドラ・メソッドを登録します。
// C# using System; using Oracle.DataAccess.Client; class TAFCallBackSample { public static FailoverReturnCode OnFailover(object sender, OracleFailoverEventArgs eventArgs) { switch (eventArgs.FailoverEvent) { case FailoverEvent.Begin : Console.WriteLine( " \nFailover Begin - Failing Over ... Please standby \n"); Console.WriteLine( " Failover type was found to be " + eventArgs.FailoverType); break; case FailoverEvent.Abort : Console.WriteLine(" Failover aborted. Failover will not take place.\n"); break; case FailoverEvent.End : Console.WriteLine(" Failover ended ...resuming services\n"); break; case FailoverEvent.Reauth : Console.WriteLine(" Failed over user. Resuming services\n"); break; case FailoverEvent.Error : Console.WriteLine(" Failover error gotten. Sleeping...\n"); return FailoverReturnCode.Retry; default : Console.WriteLine("Bad Failover Event: %d.\n", eventArgs.FailoverEvent); break; } return FailoverReturnCode.Success; } /* OnFailover */ static void Main() { OracleConnection con = new OracleConnection(); con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;"; con.Open(); con.Failover += new OracleFailoverEventHandler(OnFailover); Console.WriteLine("Event Handler is successfully registered"); // Close and Dispose OracleConnection object con.Close(); con.Dispose(); } }
Failover
イベントは、1つのイベント・ハンドラのみを起動します。Failover
イベントに複数のFailover
イベント・ハンドラが登録されていても、最後に登録されたイベント・ハンドラのみが起動されます。
注意:
フェイルオーバーが有効な環境では、分散トランザクションはサポートされません。