【DB概論】DBMSに求められるもの(3)セキュリティ:できるエンジニアになる! ちょい上DB術・基礎編(4)
デキるエンジニアになるためには、DB技術の基礎は必須です。本連載では、豊富な実例と演習問題で、プロとして恥ずかしくない設計手順を解説します。DB設計のポイントとなる汎用的なケースを紹介しているので、通常の業務とは異なる場合でも応用できる「共通の考え方」を身に付けられます。
性能を満たすために検討すべきオブジェクトインデックス
辞書をひく際に、1ページ目からめくっていって自分の知りたいキーワードを探す人はいないでしょう。 では、何をたよりにあなたが探しているキーワードの場所を特定していますか? 辞書を初めて使った人でなければ、辞書の中の単語は文字の昇順にソートされていることを知っていますから、ソート順に単語を探します。
データベースの中の値も同様にして探すことができます。ただし、「その値をもつ列または列の組み合わせ」に索引というオブジェクトを作成する必要があります。索引を作成すると、実際の行が格納されている領域とは別の領域に索引が作成されます。
索引は、索引を作成するときに指定した「列または列の組み合わせ」の値をすべて抽出します。抽出した値をソートした順番に並べ、その値とともにどの行に格納されているかという行を示すためのボインタをペアにして、索引エントリを作成します。
例えば、10万件ある売上データの中から、売上番号1021337のデータを探そうとします。売上データを格納している表の売上番号列に索引を作成して、売上番号の値を使用して検索処理を行えば、売上番号は10万件ある売上データの1件につき1つの番号が割り振られているため、効率良く10万件の中から1件の売上データを探し出すことができます。
このように索引は、検索時のパフォーマンスを高くすることのできるオブジェクトです。特に値の一意性が高い場合は、劇的にパフォーマンスを向上させることができます。データベースを設計する際には、どの列または列の組み合わせに索引を作成するか、どの種類の索引を作成するかを検討する必要があります。 索引については、第3章「論理設計」で詳しく紹介します。
セキュリティ
データベースは、企業の貴重な情報が集約して格納されています。この宝の山を守るためには、データベースレベルでのセキュリティを設計する必要があります。
セキュリティと一言で言っても、OSレベルで設定するもの、データベースの機能として設定するもの、ネットワーク上で設定するものなど、いろいろな観点から設計する必要があります。
データベースレベルでのセキュリティは、一般的に「ビュー」と「権限の管理」の2点で管理されます。
ビューは、ユーザーが「参照する」イメージのデータ集合を定義するものです。権限の管理は、業務ごとにアクセスするユーザーグループと対象のデータ、アクセスの種類(参照、更新、挿入、削除)を明確に定義し、それ以外のアクセスを許さないという管理を行います。
権限の管理は、Oracleデータベースの場合、「システム権限」と「オブジェクト権限」の2種類の管理を行うことができるようになっています。
システム権限とは、データベースの中で何ができるかを定義する権限で、具体的にはどのようなDDL文(CREATE、ALTER、DROP)を発行できるかを管理します。例えば、次のような権限があります。
- データベースに接続する権限
- 表を作成する権限(併せて表の定義変更、表の削除、索引の作成、表と索引の統計情報の収集もできます)
- 表領域を作成する権限(併せて表領域の定義変更)、削除する権限
- 管理表を参照する権限、管理表を削除する権限
- 他人の作成した表を含め、すべての表を削除する権限
- ユーザーを作成する権限
システム権限は、データベースユーザーの役割によって、必要なシステム権限のセットを次のように分けることができます。
- データベース管理者
- アプリケーション間発者
- エンドユーザー
また、オブジェクト権限とは、データベース内で作成されたオブジェクトに対してどのような操作ができるかを定義するものです。 オブジェクトごとに次のような種類の権限を管理することができます(すべてを示しているわけではありません)。
- 参照(表単位)
- 更新(列単位)
- 挿入(列単位)
- 削除(表の行単位)
- 参照制約の設定(列単位)
- 索引の作成(列単位)
これらの権限が、作成されたオブジェクトの数だけ存在します。
オブジェクト権限は、データのセキュリティを管理する上で大切な役割を果たします。 これらのオブジェクト権限は、業務を実施するユーザーグループ単位に適切に付与される必要があります。 しかし、前述したように、オブジェクト権限の種類は膨大な数になるので、システム権限と併せて、権限をグループ化して管理することを考えます。
図1は、システム権限のセットを管理者用、アプリケーション開発者用、エンドユーザー用の3種類のロールを作成し、オブジェクト権限のセットを、同様にグループ化したロールを作成し、それぞれ、各ユーザーに付与するように考えた管理方法の例です。
このように、大量で複雑な「権限」の管理を効率よく、しかも抜けがないように設計するのは、セキュリティ上、大切なことです。
筆者紹介
中村才千代
エディフィストラーニング インストラクター。データベース設計、システム構築の上流工程〜下流工程全般のコースを担当。「実践で使える」講義を行うことを心掛けている。
現在は、複数のSIerの人材育成を担当している。SE時代の経験を生かし、「業務を知っているエンジニアこそデータベース設計に関わるべきだ」ということ、「データベース設計に携わるエンジニアは、逆に業務を知っている人に知恵を貸してもらう必要がある」ということを伝えていきたい。
Copyright © ITmedia, Inc. All Rights Reserved.