プライマリ・コンテンツに移動
Oracle® Data Provider for .NET開発者ガイド
ODAC 12c リリース4 (12.1.0.2) for Microsoft Windows
E72575-01
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

Oracle Databaseへの接続

Oracle Data Provider for .NETは、ユーザー名とパスワード、Windowsネイティブ認証、KerberosおよびTransport Layer Security/Secure Sockets Layerなど様々な方法でOracle Databaseに接続できます。この項では、OracleConnectionプロバイダ固有の機能について説明します。内容は次のとおりです。

接続文字列属性

表3-2は、サポートされている接続文字列属性のリストです。

表3-2 サポートされている接続文字列属性

接続文字列属性 説明 デフォルト値

Connection Lifetime

接続の最小存続時間(秒)。

0

Connection Timeout

プールから使用可能な接続を待機する最小時間(秒)。

15

Context Connection

trueに設定した場合、暗黙的なデータベース接続が戻されます。

.NETストアド・プロシージャでのみサポートされています。

false

Data Source

接続するデータベースを識別するOracle Netサービス名、接続記述子または簡易接続ネーミング。

空の文字列

DBA Privilege

管理者権限:SYSDBAまたはSYSOPER

空の文字列

Decr Pool Size

未使用の確立済接続量が過剰となり、クローズされる接続数。

1

Enlist

COM+トランザクションまたはSystem.Transactionsのコンテキストでの接続の登録動作と機能を制御します。

true

HA Events

ODP.NET接続プールを使用して、Oracleデータベース・サービス、サービス・メンバー、インスタンスまたはノードの停止時に、プールから接続を事前に削除できます。Oracle RAC、Data Guard、GoldenGateなどの単一インスタンスへのデプロイを含め、Oracle Global Data Servicesを扱います。

false

Load Balancing

ODP.NET接続プールを使用して、ロード・バランシング・アドバイザリおよびサービスの目的に基づき、Oracleデータベース・インスタンス間の作業要求のバランスを調整できます。Oracle RAC、Active Data Guard、GoldenGateなどを含め、Oracle Global Data Servicesを扱います。

false

Incr Pool Size

プール内のすべての接続が使用された場合に作成される新しい接続の数。

5

Max Pool Size

プール内の接続の最大数。

100

Metadata Pooling

メタデータ情報をキャッシュします。

True

Min Pool Size

プール内の接続の最小数。

1

Password

User Idにより指定されたユーザーのパスワード。

空の文字列

Persist Security Info

接続文字列でのパスワード検索。

false

Pooling

接続プーリング。

true

Promotable Transaction

トランザクションがその存続中にローカルまたは分散かどうかを示します。

promotable

Proxy User Id

プロキシ・ユーザーのユーザー名。

空の文字列

Proxy Password

プロキシ・ユーザーのパスワード。

空の文字列

Self Tuning

接続の自動チューニングを有効化または無効化します。

true

Statement Cache Purge

接続がプールに戻るときの文キャッシュの消去。

false

Statement Cache Size

文キャッシングの有効化と、キャッシュ・サイズ、つまりキャッシュ可能な文の最大数。

0

User Id

Oracleユーザー名。

空の文字列

Validate Connection

プールから発生した接続の検証。

false


次の例は、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");
  }
}
 

関連項目:


接続文字列ビルダー

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が使用されます。


関連項目:

簡易接続ネーミング・メソッドの使用の項に関する詳細および要件は、『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セクション」の手順に従ってください。


関連項目:

Using LDAPを使用するセクションの詳細と要件は、『Oracle Database Net Services管理者ガイド』『Oracle Databaseセキュリティ・ガイド』を参照してください。

データ・ソース列挙子

データ・ソース列挙子では、アプリケーションによって、そのアプリケーションが接続できるOracleデータ・ソースのコレクションを一般的に取得できます。

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に段階的改善を加えるものです。


関連項目:

IETF Webサイトの次の場所にあるTLSプロトコル・バージョン1.0(RFC 2246)

http://www.ietf.org



注意:

SSLが最も広く認識されている用語であるため、SSLでもTLSでも該当する場合、この項では説明を簡単にするためにSSLという用語を使用します。ただし、これらのプロトコルの使用方法または構成方法に違いがある場合、この項では、記述内容がSSLに該当するか、TLSに該当するかを明記します。

ODP.NET Secure Sockets Layerの構成

Secure Sockets Layerをクライアントで構成する場合、ウォレットが作成されていることを確認して、SSL付きTCP/IPをクライアントで使用してください。オプションで、追加の手順を実行して構成を強化できます。


注意:

サーバー識別名(DN)のマッチングは、ODP.NET管理対象ドライバでは現在サポートされていません。

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.configweb.congigまたはmachine.configファイルを介して設定できます。通常、このパラメータを設定する必要はありません。このパラメータのデフォルト設定はanyで、データベース・サーバーがあらゆる必要な制限を認証されているSSLバージョンに適用できるようにします。次にsqlnet.oraの設定例を示します。

SSL_VERSION=3.0

手順5: クライアントにおける認証サービスとしてのSSLの設定(オプション)

sqlnet.oraまたはapplication.configweb.congigまたはmachine.configのファイルにSQLNET.AUTHENTICATION_SERVICEパラメータを設定し、SSLがデータベース外部認証方法で使用できるようにします。

SSLはトランスポート暗号化媒体として使用できます。そのため、この設定の「オプション」指定です。

データベース外部認証サービスとしてSSLを使用する場合、クライアント証明書とマッチングするデータベースの外部認証ユーザーを作成する必要があります。外部で識別されるデータベース・ユーザーの作成の詳細は、『Oracle Databaseセキュリティ・ガイド』の外部認証されるユーザーの作成に関する項を参照してください。

次に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の有効化に関する項を参照してください。

セキュアな外部パスワード・ストアの使用

安全性の高い外部パスワード・ストア(SEPS)は、パスワードの資格証明を安全に格納するクライアント側ウォレットの使用です。ODP.NET管理対象ドライバおよび管理対象外ドライバの両方について、外部パスワード・ストアを使用するように構成できます。

Oracleウォレットは、認証および署名用資格証明を安全に格納するコンテナです。ウォレットにより、データベース接続をパスワード資格証明に依存する大規模なデプロイメントを簡素化できます。アプリケーションでは、埋込みユーザー名およびパスワードが必要なくなり、これによりセキュリティ・リスクを減らします。

セキュアな外部パスワード記憶域(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をサポートします。

ファイル・ベース資格証明キャッシュおよびMSLA

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認証の構成トピック:

手順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)とも呼ばれています。


注意:

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_SIDr1の場合、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はイントラネットおよびクラウド・デプロイメントの両方のネットワークのデータ暗号化および整合性を有効化します。これにより、データが認証されたユーザー以外のすべてのユーザーから隠れ、元のメッセージ・コンテンツが変更されていないことを保証します。

データ暗号化の使用

管理対象および管理対象外のODP.NETは次の暗号化標準およびアルゴリズムをサポートします。

  • Advanced Encryption Standard(AES)

    • AES 128ビット

    • AES 192ビット

    • AES 256ビット

  • RSA RC4

    • 128ビット

    • 256ビット

  • Triple-DES (3DES)

    • 112ビット

    • 168ビット

ODP.NET管理対象ドライバは次の設定を使用してネットワーク暗号化を構成します。

  • SQLNET.ENCRYPTION_CLIENT

  • SQLNET.ENCRYPTION_TYPES_CLIENT

使用方法の定義および詳細は、「settingsセクション」を参照してください。

管理対象外ODP.NETは次のデータ整合性アルゴリズムをサポートします。

  • MD5

  • SHA-1

  • SHA-2

管理対象ODP.NETは前述のデータ整合性アルゴリズムをサポートしません。

ネットワーク暗号化および整合性、またはODP.NET管理対象外ドライバ用の構成の詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。

ODP.NET管理対象ドライバでネットワーク暗号化を構成するには、「Oracle Data Provider for .NET管理対象ドライバの構成」を参照してください。

スキーマ検出

ADO.NETでは、OracleConnection.GetSchema APIから5つの異なるタイプのメタデータ・コレクションが公開されています。これにより、アプリケーション開発者は、すべてのOracleデータ・ソースに対して、メタデータの取得を個別のアプリケーション・ベースでカスタマイズできます。このようにして、開発者は複数のデータ・ソースからのメタデータを管理する汎用セットのコードをビルドできます。

公開されているメタデータのタイプは次のとおりです。

  • MetaDataCollections

    テーブル、列、インデックスおよびストアド・プロシージャなどのデータ・ソースから使用できるメタデータ・コレクションのリストです。

  • Restrictions

    要求されたスキーマ情報の範囲を制限して、各メタデータ・コレクションに適用される制限。

  • DataSourceInformation

    製品名やバージョンなど、現在使用されているデータベースのインスタンスについての情報。

  • DataTypes

    データベースがサポートする各データ型についての情報のセット。

  • ReservedWords

    Oracle問合せ言語の予約語。

メタデータのユーザー・カスタマイズ

ODP.NETでは、データベース・スキーマ情報の包括的なセットが提供されています。開発者は、個々のアプリケーション・ベースでGetSchemaメソッドが戻すメタデータを拡張またはカスタマイズできます。

これを行うには、開発者はカスタマイズしたメタデータ・ファイルを作成し、アプリケーションにファイル名を提供する必要があります。方法は次のとおりです。

  1. カスタマイズしたメタデータ・ファイルを作成し、それを.NET FrameworkがインストールされたCONFIGサブディレクトリに置きます。これは、machine.configおよびセキュリティ設定があるディレクトリです。

    このファイルには、変更のみではなく、スキーマ設定情報のセット全体を含める必要があります。開発者は、ユーザー固有の要件を検索するスキーマ動作の変更を提供します。たとえば、開発者は内部データベース表にフィルタをかけ、ユーザー固有の表のみを検索できます。

  2. 次と同じく、アプリケーションの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ファイルをロードします。


関連項目:

「GetSchema」

接続プーリング

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 12.1.0.2以下では、一致する必要があるのは接続文字列の属性値のみでした。現在は、接続文字列そのものが完全一致する必要があります。同じ接続に対して異なる順序で指定したキーワードは、別々にプールされます。要求された署名を持つプールがすでに存在する場合、接続はそのプールからアプリケーションに戻されます。

接続プールが作成されると、接続プーリング・サービスは、ConnectionStringMin 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により、各ODP.NETクライアント・アプリケーションに公開されます。また、Windowsパフォーマンス・モニター(Perfmon)を使用して確認できます。

Perfmonでは、管理者はODP.NETカウンタをパフォーマンス・モニター・グラフに追加できます。ODP.NETパフォーマンス・カウンタは、Oracle Data Provider for .NETというカテゴリ名で公開されます。管理者は、Oracle Data Provider for .NETカテゴリを選択した後で、監視するODP.NETカウンタを選択できます。

ODP.NETパフォーマンス・カウンタは、デフォルトでは有効になっていないため、監視する前に、管理者が目的のカウンタを有効にする必要があります。また、Perfmonを使用して監視しようとする場合は、1つ以上のODP.NETインスタンスがアクティブに実行されている必要があります。

Oracle Data Provider for .NETは、レジストリ・エントリを使用して接続プーリングのパフォーマンス・カウンタの公開を有効または無効にします。

表3-3は、有効なレジストリ値を持つ接続プーリングに対して使用されるパフォーマンス・カウンタを示します。

表3-3 接続プーリングのパフォーマンス・カウンタ

パフォーマンス・カウンタ 有効な値 説明

なし

0

無効(デフォルト)

HardConnectsPerSecond

1

Oracle Databaseで毎秒確立されるセッション数。

HardDisconnectsPerSecond

2

Oracle Databaseから毎秒切断されるセッション数。

SoftConnectsPerSecond

4

接続プールから毎秒確立されるアクティブな接続数。

SoftDisconnectsPerSecond

8

接続プールから毎秒戻されるアクティブな接続数。

NumberOfActiveConnectionPools

16

アクティブな接続プールの合計数。

NumberOfInactiveConnectionPools

32

非アクティブな接続プール数。

NumberOfActiveConnections

64

使用中の接続の合計数。

NumberOfFreeConnections

128

すべての接続プールで使用可能な接続の合計数。

NumberOfPooledConnections

256

プールされているアクティブな接続の数。

NumberOfNonPooledConnections

512

プールされていないアクティブな接続の数。

NumberOfReclaimedConnections

1024

暗黙的にガベージ・コレクションに入った接続数。

NumberOfStasisConnections

2048

まもなくプールで利用可能になる接続数。ユーザーはこれらの接続をクローズしましたが、使用可能な接続としてプールに戻される前の、トランザクション完了などのアクション待ちになっています。


パフォーマンス・カウンタの公開

パフォーマンス・カウンタの公開を個別に有効または無効にするには、タイプREG_SZのレジストリ値PerformanceCountersまたは.NET構成ファイルを使用します。このレジストリ値は次のようになります。

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ODP.NET\Assembly_Version

Assembly_Versionは、Oracle.DataAccess.dllの完全なアセンブリ・バージョン番号です。

複数のパフォーマンス・カウンタは、有効な値を追加することで取得できます。たとえば、PerformanceCountersが3に設定されている場合、HardConnectsPerSecondおよびHardDisconnectsPerSecondは有効になります。

.NET構成エントリを使用したパフォーマンス・カウンタの設定

.NET構成エントリを使用してパフォーマンス・カウンタを設定できます。.NET構成エントリはレジストリ値設定よりも優先されるので、特定のアプリケーションに使用できます。

.NET構成エントリでは、次の例に示すように名前/値のペアが使用されます。

<configuration>
  <oracle.dataaccess.client>
  <settings>
    <add name="PerformanceCounters"
         value="3"/>
  </settings>
  </oracle.dataaccess.client>
</configuration>

パフォーマンス・カウンタのインスタンス名

パフォーマンス・カウンタの監視を、アプリケーション・ドメイン、プールまたはデータベース・インスタンスのレベルでできるようになりました。データベース・インスタンス・レベルの監視が適用されるのは、ロード・バランシング機能または高速接続フェイルオーバー機能が有効化されている場合のみです。

インスタンス名の形式は次のとおりです。

<アプリケーション・ドメイン名> [<プロセスID>, <アプリケーション・ドメインID>][<接続文字列/プール名>][<インスタンス名>]。エントリの上限は127文字です。インスタンス名の各フィールドに対して長さの制約があります。次の表に、各フィールドの最大文字数を示します。

フィールド名 最大文字数
アプリケーション・ドメイン 40
プール名/接続文字列 70
データベース・インスタンス名 16

フィールド値の長さが上限を超えているときは、その文字列は長さ制限に収まるように切り詰められて、続きがあることを示す「...」が末尾に付加されます。たとえば、アプリケーションの名前がProgram.exeで接続文字列がuser id=scott;Password=tiger;data source=inst1;max pool size=125であるとします。アプリケーション・ドメインが2つあるプロセスの場合は、次のようになります。

  • Program.exe [123, 1]

  • Program.exe [123, 1][ user id=scott;data source=inst1;max pool siz]

  • Program.exe [123, 1][ user id=scott;data source=inst1;max pool siz...] [instA]

  • Domain 2[123, 2]

  • Domain 2[123, 2][ user id=scott;data source=inst1;max pool siz]

  • Domain 2[123, 2][ user id=scott;data source=inst1;max pool siz...] [instB]

  • Domain 2[123, 2][ user id=scott;data source=inst1;max pool siz...] [instC]

接続プールの属性は先頭の70文字がよく似ているため、アプリケーションでプール名を設定しておくと監視ツールで各プールを一意に識別できるようになります。.NET構成ファイルでは、プール名属性を次のように設定できます。

ODP.NET管理対象外ドライバ

<configuration>
 <oracle.dataaccess.client>
  <settings>
           .
           .
      <add name="[connection string without password]" value="connectionPool   name='[Pool Name]'"/>   
          .
          .
    </settings>
  </oracle.dataaccess.client>
</configuration>

ODP.NET管理対象ドライバ

<oracle.manageddataaccess.client>
 <version number="*">
  <connectionPools>
           .
           .
     <connectionPool connectionString="[connection string without password]" " poolName="[Pool Name]">   </connectionPool>
           .
           .
  </connectionPools>
 </version>
</oracle.manageddataaccess.client>

パフォーマンス・カウンタのうち、次の2つの動作は12cリリースで変更されました。

  • NumberOfPooledConnections: アクティブな接続と使用可能な接続の合計。以前は、この値はアクティブな接続のみの数でした。

  • NumberOfStasisConnections: サポートされなくなりました。

プラガブル・データベース

Oracle Database 12cで新しく導入されたプラガブル・データベース機能を使用すると、スキーマ、スキーマ・オブジェクト、非スキーマ・オブジェクトのポータブル・コレクションをOracle Database内に構成し、これらを個別のデータベースとしてODP.NETに表示することができます。この自己完結型コレクションは、プラガブル・データベース(PDB)と呼ばれます。

PDBにアクセスできるのはODP.NET 12c以降のリリースからです(クライアントはデータベース・サービスを通じてアクセスします)。データベース・サービスには、オプションのPDBプロパティがあります。PDBを作成すると、デフォルトの新しいデータベース・サービスが自動的に作成されます。このサービスはPDBと同じ名前になり、簡易接続構文またはネット・サービス名でのPDBアクセスに使用できます。このサービスの主な役割は管理タスクの実行です。アプリケーションで使用するサービスは別に作成することをお薦めします。

PDBでは、次の機能を除く、すべてのODP.NET機能を使用できます。

  • 連続問合せ通知

  • クライアント結果キャッシュ

  • ALTER SESSION SET CONTAINER文を使用した、1つのPDBから別のPDBへの切替え


関連項目:

『Oracle Database管理者ガイド』のプラガブル・データベースの管理に関する説明を参照

エディションベースの再定義

エディションベースの再定義を使用すると、アプリケーションが使用中であってもそのデータベース・コンポーネントをアップグレードできます。このため、アプリケーションの停止時間を最小化あるいは排除することができます。


関連項目:

エディションの詳細は、『Oracle Database管理者ガイド』および『Oracle Database開発者ガイド』を参照

Oracle Database 11.2以上で使用している場合、ODP.NET 11gリリース2(11.2.0.1)以上では、デプロイメント時のエディションの指定がサポートされています。アプリケーションは、レジストリまたは構成ファイルを使用して、デプロイメント時にエディションを指定できます。

アプリケーションは、タイプREG_SZの次のレジストリ・エントリを作成できます。

HKLM\Software\Oracle\ODP.NET\version\Edition

ここで、versionはODP.NETのバージョン、Editionはエディションの有効な文字列値です。

アプリケーションは、かわりにweb.configまたはapplication.config構成ファイルを使用して、デプロイメント時にエディションを指定できます。machine.config構成ファイルを使用すると、特定のバージョンの.NET frameworkを使用するすべてのアプリケーションに対してエディションを指定できます。

次の例では、ODP.NET管理対象外ドライバの.NET構成ファイルでEditionをE1に設定します。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <oracle.dataaccess.client>
  <settings>
   <add name="Edition" value="E1"/>
  </settings>
 </oracle.dataaccess.client>
</configuration>

注意:

  • ODP.NETでサポートされるのは、エディションのデプロイメント時の構成のみです。

  • ODP.NETでは、プロセスの存続期間中にALTER SESSION文を使用してエディションを変更することはサポートされていません。

  • ODP.NET管理対象ドライバは、エディションベースの再定義をサポートしていません。


オペレーティング・システム認証

Oracle Databaseは、Windowsのユーザー・ログイン資格証明を使用してデータベース・ユーザーを認証できます。Windowsのユーザー・ログイン資格証明を使用して接続をオープンするには、User Id接続文字列属性をスラッシュ(/)に設定する必要があります。Password属性を指定しても無視されます。


注意:

オペレーティング・システム認証は、.NETストアド・プロシージャではサポートされません。

オペレーティング・システム認証を使用する接続を含む、すべての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");
  }
}

関連項目:

データベースの特権接続の詳細は、「サポートされている接続文字列属性」の「DBA Privilege」を参照

パスワードの失効

ユーザーのパスワードを失効させることができます。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");
  }
}

関連項目:

  • プロキシ・ユーザーを使用して中間層サーバーを設計する方法の詳細は、『Oracle Database開発ガイド』を参照

  • ALTER USER文のプロキシ句の説明と構文は、『Oracle Database 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プロパティを設定できます。接続プーリングが有効な場合、プールに接続が戻されると、常にClientIdnullにリセットされます。

クライアント識別子は、エンドツーエンド・アプリケーション・トレースにも使用できます。エンドツーエンド・トレースは、複数層環境のパフォーマンス上の問題の診断プロセスを単純化します。複数層環境では、エンド・クライアントからの要求は中間層で別のデータベース・セッションにルーティングされるため、異なるデータベース・セッションを越えてクライアントを追跡することは困難になります。エンドツーエンド・トレースでは、クライアント識別子を使用して、データベース・サーバーに対するすべての層から特定のエンドクライアントを一意にトレースします。

ODP.NETでは、OracleConnectionオブジェクトの書込み専用プロパティであるActionName、ClientIdClientInfo、およびModuleNameが公開されています。これらのプロパティは、次のエンドツーエンドのトレース属性に対応しています。

  • Action - モジュールのINSERT操作やUPDATE操作などのアクションを指定します。

  • ClientId - HR.HRなどのログオンIDに基づいてエンド・ユーザーを指定します。

  • クライアント情報 - ユーザー/セッション情報を指定します。

  • Module - アプリケーションのAccounts ReceivableやGeneral Ledgerなどの機能ブロックを指定します。


関連項目:

  • 「OracleConnectionプロパティ」

  • Oracle Databaseパフォーマンス・チューニング・ガイドの「エンドツーエンド・アプリケーション・トレース」

  • 『Oracle Databaseセキュリティ・ガイド』


透過的アプリケーション・フェイルオーバー(TAF)コールバックのサポート

透過的アプリケーション・フェイルオーバー(TAF)は、高可用性を提供するOracle Databaseの機能です。


注意:

ODP.NET管理対象ドライバは、TAFおよびTAFコールバックをサポートしていません。

TAFを使用すると、接続が継続していれば、別のデータベース・インスタンスに自動的に再接続できます。アクティブなトランザクションはロールバックされますが、別のノードを経由した新しいデータベース接続は、元の接続と同一です。これは、接続が失敗した方法に関係なく当てはまります。

TAFを使用すると、アプリケーションを提供するインスタンスが1つ残っているかぎり、クライアントで接続が失われることはありません。データベース管理者は、インスタンスで実行されるアプリケーションを制御して、各アプリケーションのフェイルオーバー命令も作成します。

別のデータベースにセッションがフェイルオーバーした場合、元のセッションで最初に設定されていたNLS設定は、新しいセッションに引き継がれません。したがって、これらのNLS設定は、アプリケーション側で新しいセッションに設定する必要があります。

TAF通知

フェイルオーバーによる遅延を考慮して、アプリケーションではTAFコールバックによる通知を必要とします。ODP.NETは、OracleConnectionオブジェクトのFailoverイベントによるTAFコールバック機能をサポートしています。これにより、フェイルオーバーが発生したときは常にアプリケーションに通知されます。TAFコールバックを受信するには、Failoverイベントにイベント・ハンドラ関数を登録する必要があります。

フェイルオーバーが発生した場合

フェイルオーバーが発生すると、Failoverイベントが発生し、別のOracleインスタンスに接続を再確立する過程で、イベント・ハンドラが複数回起動されます。

イベント・ハンドラの最初のコールは、Oracle Databaseがインスタンス接続の損失を最初に検出したときに行われます。これにより、アプリケーションはフェイルオーバーの次の遅延に応じて動作します。

フェイルオーバーが成功した場合、接続が再確立されて使用可能になったときにFailoverイベントが発生します。この時点で、アプリケーションはOracleGlobalizationセッション設定を再同期化して、フェイルオーバーが発生したことをアプリケーション・ユーザーに通知できます。

フェイルオーバーが失敗した場合、フェイルオーバーが発生しなかったことをアプリケーションに通知するために、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イベント・ハンドラが登録されていても、最後に登録されたイベント・ハンドラのみが起動されます。


注意:

フェイルオーバーが有効な環境では、分散トランザクションはサポートされません。


関連項目: