特集:VBでOracle Database開発入門(後編)

SQL Server開発者のためのOracle DB入門

初音 玲
2008/12/09
2008/12/16 更新
Page1 Page2 Page3

 前回に引き続き、今回は「SQL Server開発者がOracle Database開発に取り組み始めるときのポイント」を説明する。

SQL Server開発者から見たOracle Databaseの特徴

 Oracle DatabaseとSQL Serverは、どちらもRDBMS(リレーショナル・データベース管理システム)だが、その生い立ちや製品特性の違いからさまざまな相違点が存在する。

 そこで、SQL Serverを使ったデータベース開発の経験者の視点からOracle Database特有の特徴に注目して、まずは両者の違いを明確にしたいと思う。

インスタンスの違い

 Oracle DatabaseとSQL Serverは、1つのサーバ・マシン上に複数のインスタンス(RDBMSの管理単位)が作成できる。しかし、SQL Serverが1インスタンスで複数データベースを管理できるのに対して、Oracle Databaseでは1インスタンスで1データベースのみを管理する仕組みになっている。

図1 インスタンスとデータベースの関係

 インスタンスはRDBMSがデータベースを管理する単位であり、起動や停止もインスタンス単位に行われる。また、管理情報を格納するための単位でもあるので、SQL Serverで1インスタンスに複数データベースを作成したときも、管理領域はデータベースごとではなく1つしか存在しない。

図2 データベースの構成要素

セキュリティの違い

 SQL Serverには次の2つの認証方式がある。

  • SQL Server認証(=SQL Server独自のアカウントを利用した認証)
  • Windows統合認証(=Windowsのアカウントを利用した認証)

 基本的にWindows統合認証の採用が推奨されている。なお、Windows Server 2003以降ではSQL Server認証でもWindowsパスワード・ポリシー・メカニズムというOS標準搭載の機能を活用したパスワード・ポリシーおよびパスワードの期限の設定が行える。

 Oracle Databaseにも以下のような方式があり、データベース認証でも独自のセキュリティ・ポリシーが設定できる

  • データベース認証(=Oracle Database独自のアカウントを利用した認証)
  • OS認証(=Windows OSのアカウントを利用した認証)
  • ネットワーク・サービス認証(=SSLやkerberos認証などのサードパーティ・サービスを利用した認証。Enterprise EditionのAdvanced Securityオプションが必要)

トランザクションの違い

 SQL Serverの既定の設定では、SQL文が実行されるたびにトランザクションがコミット(COMMIT)される。そのため通常はトランザクションをあまり意識しない。

 Oracle Databaseの既定の設定では、トランザクションは自動的に始まるが、明示的にコミットやロールバック(ROLLBACK)をしなければトランザクションは終了しない。

 なお、ADO.NETやODP.NETでSQL ServerやOracle Databaseを利用する場合、プログラム・コード上ではどちらのデータベースでも明示的にトランザクションを指定しなければ自動的にトランザクションがコミットされるが、これはADO.NETやODP.NETの中で、各データベースにおける動作の違いの補完を行って、コード上での動きを統一させているからだ。

Oracle Databaseを使うメリットとデメリット(SQL Serverとの比較において)

Oracle Databaseのメリット

  • Windows以外のOSも選択できるため、ハードウェア選択の幅が広い

  • 1インスタンスに1データベースしか作れないため、運用開始後、同一インスタンスの複数データベースがシステム管理情報を取り合う、インスタンスの停止が必要なメンテナンス時に、データベースごとに停止可能な時間帯がばらばらで停止のタイミングが取りづらい、といった問題が発生しない

  • (SQL Server認証では、Windows Server 2003 以降を利用していれば、前述したパスワード・ポリシーを設定可能である。一方)Oracle Databaseのデータベース認証ではデータベース独自のセキュリティ・ポリシーが設定できる

  • Oracle Databaseではデフォルトの設定で、読み取り一貫性(=ある行のデータの更新で排他ロックが掛かっていても、ほかのユーザーがデータを読み取れる機能)が有効になっており、バッチ処理時間帯などでデータベースの情報が書き換わっていても、参照系の業務は遂行できる(挿入/更新/削除などの業務処理は行えない)(SQL Serverでも、SQL Server 2005以降であれば、トランザクション分離レベルを変更することで、Oracle Databaseと同等の読取一貫性を提供することは可能になっている)

  • (SQL Serverにおいては行レベル・ロックが既定値で、一定の条件下ではロック管理を効率化するための「ロック・エスカレーション」が発生する。一方)Oracle Databaseでは行レベル・ロックは既定値であるが、ロック・エスカレーションは行われない。レコードという扱いやすいロック単位でシステムが動作するため、プログラム・コードのレベルで考慮しなければならない点が「比較的」少ない(なお、SQL Serverで同じように常にレコード単位のロックを利用したい場合は、ロック・エスカレーションを無効にすればよい)

Oracle Databaseのデメリット

  • Linux版の出荷後にWindows版が出荷されるので、最新バージョンをWindows環境ですぐに使えない期間がある

  • Express EditionがOracle Database 10g Release 2までにしか存在しない(最新のOracle Databaseでは、いまのところExpress Editionが提供されていない。前編参照)

  • 読み取り一貫性が備わっているため、バッチ処理中にほかの業務を処理待ちにする必要がある場合には、特別な工夫が必要となる

Oracle DatabaseとSQL Serverのコードの主な違い

データベースとの接続

 データベースに接続する場合、使用する接続クラス(SQL ServerはSqlConnectionクラス、Oracle DatabaseはOracleConnectionクラス)が異なるだけでなく、接続文字列(ConnectionStringプロパティへの設定値)も異なる。

Dim cn As New System.Data.SQlClient.SqlConnection()
cn.ConnectionString = "User Id=sa;" & _
                      "Password=aU98rrx2;" & _
                      "Initial Catalog=pubs;" & _
                      "Data Source=servername;"
cn.Open()
Dim cn As New Oracle.DataAccess.Client.OracleConnection()
cn.ConnectionString = "User Id=scott;" & _
                      "Password=tiger;" & _
                      "Data Source=orcl.world;"
cn.Open()
データベースへ接続するコード(上:SQL Server、下:Oracle Database)

 なお、.NETデータ・プロバイダでは、接続プーリングにより、プログラム・コード上でデータベースとの接続を切断しても、実際の接続は維持される。そして、同じ内容の接続文字列で接続、つまりユーザーIDや接続先が同一の場合には、維持しておいた実接続を再使用することで、データベースに再接続する際にかかる時間をほぼゼロにする機能が実装されている。

図3 .NETデータ・プロバイダによる接続プーリング

エラーの取得

.NETデータ・プロバイダで検出したエラーは、Try〜Catch〜End Tryブロックを使用した.NET Frameworkの例外ハンドリング機能により処理できる。このため、両者の例外処理コードには大きな差異は生じない。

Try
  cn.Open()
Catch ex As Exception
  MessageBox.Show("Message=" & ex.Message & vbCrLf & _
    "StackTrace=" & ex.StackTrace, _
    Me.Text, _
    MessageBoxButtons.OK, _
    MessageBoxIcon.Exclamation)
Finally
  cn.Close()
End Try
Try
  cn.Open()
Catch ex As Exception
  MessageBox.Show("Message=" & ex.Message & vbCrLf & _
    "StackTrace=" & ex.StackTrace, _
    Me.Text, _
    MessageBoxButtons.OK, _
    MessageBoxIcon.Exclamation)
Finally
  cn.Close()
End Try
例外処理のコード(上:SQL Server、下:Oracle Database)


 INDEX
  [特集]VBでOracle Database開発入門(前編)
  .NETによるOracle Database開発とは?
    1..NETで、なぜデータベースが必要なのか?
    2.Oracle Databaseの歴史と最新のOracle 11gとは
    3.Oracleデータベース開発のテクノロジ
 
  [特集]VBでOracle Database開発入門(後編)
  SQL Server開発者のためのOracle DB入門
  1.SQL Server開発者から見たOracle Databaseの特徴
    2.Oracle DatabaseとSQL Serverのコードの主な違い
    3.VB6×Oracleから.NET×Oracle 11g移行のポイント

更新履歴
【12月16日】以下のような誤りや誤解を与えかねない表現がありました。お詫びして訂正させていただきます。

 しかし、SQL Server認証にはパスワードの複雑さチェックや有効期限などのセキュリティ・ポリシーが設定できないため、Windows統合認証の採用が推奨されている。
 Oracle Databaseにも、以下のような方式があるが、データベース認証でもセキュリティ・ポリシーが設定できる。
 基本的にWindows統合認証の採用が推奨されている。なお、Windows Server 2003以降ではSQL Server認証でもWindowsパスワード・ポリシー・メカニズムというOS標準搭載の機能を活用したパスワード・ポリシーおよびパスワードの期限の設定が行える。
 Oracle Databaseにも以下のような方式があり、データベース認証でも独自のセキュリティ・ポリシーが設定できる。

データベース認証であってもセキュリティ・ポリシーが設定できるため、Active Directoryなどの外部認証やOS認証を使用しなくてもユーザー認証が可能
(SQL Server認証では、Windows Server 2003 以降を利用していれば、前述したパスワード・ポリシーを設定可能である。一方)Oracle Databaseのデータベース認証ではデータベース独自のセキュリティ・ポリシーが設定できる

読み取り一貫性(=ある行のデータの更新で排他ロックが掛かっていても、ほかのユーザーがデータを読み取れる機能)により、バッチ処理時間帯などでデータベースの情報が書き換わっていても、参照系の業務は遂行できる(挿入/更新/削除などの業務処理は行えない)
Oracle Databaseではデフォルトの設定で、読み取り一貫性(=ある行のデータの更新で排他ロックが掛かっていても、ほかのユーザーがデータを読み取れる機能)が有効になっており、バッチ処理時間帯などでデータベースの情報が書き換わっていても、参照系の業務は遂行できる(挿入/更新/削除などの業務処理は行えない)(SQL Serverでも、SQL Server 2005以降であれば、トランザクション分離レベルを変更することで、Oracle Databaseと同等の読取一貫性を提供することは可能になっている)

行レベル・ロックが既定値のため、レコードという扱いやすいロック単位でシステムが動作する。このため、プログラム・コードのレベルで考慮しなければならない点が比較的少ない
(SQL Serverにおいては行レベル・ロックが既定値で、一定の条件下ではロック管理を効率化するための「ロック・エスカレーション」が発生する。一方)Oracle Databaseでは行レベル・ロックは既定値であるが、ロック・エスカレーションは行われない。レコードという扱いやすいロック単位でシステムが動作するため、プログラム・コードのレベルで考慮しなければならない点が「比較的」少ない(なお、SQL Serverで同じように常にレコード単位のロックを利用したい場合は、ロック・エスカレーションを無効にすればよい)


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH