公開[篠原光太郎,@IT]今回は、前回に引き続き、権限の設定です。「ロール」という、ユーザーやログインのグループ機能についてチャレンジします。ロールを利用することによって、個々のユーザーへ権限を設定するのではなく、グループに対して権限の設定が可能になるため、設定をよりシンプルにすることができます。新規にロールを作成して、画面で確認しながら進めていきましょう。Managerで、「CardInfoUsers」というロールを作成します。CardInfoUsersは、顧客のメンバカード情報にアクセスできるメンバのグループです。メンバカード情報は機密性が高いため、特定のユーザー「yamada」と「tanaka」にのみアクセス権を与えることとします。Serverログインを作成しましょう。Serverのオブジェクトに権限を設定する」)の例題2を参考にしてください。次に、ロール「CardInfoUsers」を作成し、いま作成したユーザー「tanaka」と「yamada」をメンバに追加しましょう。左端に表示される「ツリー」で、以下を順に展開する。新規ロールの作成ダイアログボックス。画面1からロールメンバが追加された状態。この状態であることを確認して「OK」ボタンを押す(画面をクリックすると拡大表示します)これで、ロールCardInfoUsersが作成できました。この状態では、ロールCardInfoUsersのメンバは、データベースに対して何もすることができません。ユーザーを新規作成したときに、データベースオブジェクトに対する権限がまったく設定されていなかったのと同じですね。ロールCardInfoUsersに対して、CardInfoテーブルとCardInfoViewビューへの参照(SELECT)/挿入(INSERT)/更新(UPDATE)の権限を付与してみましょう。CardInfoテーブル、CardInfoViewビューに対して、「SELECT」「INSERT」「UPDATE」をチェックし、権限を付与する。「OK」ボタンを押して、権限の設定画面、データベースロールのプロパティ画面を閉じるこれで、権限の設定は完了しました。実際にクエリアナライザを使用して、tanakaとyamadaでそれぞれログインし、CardInfoテーブル、CardInfoViewにアクセスできることを確認してみましょう。権限の継承これまでの例で、CardInfoUsersというロールに対して権限を設定することにより、ロールのメンバであるユーザーtanakaとyamadaに対して権限が付与されることが分かりました。ここで、ユーザーtanakaとyamadaに対しては、個別に権限が設定されていないことをプロパティで確認してみてください。ユーザーtanakaのプロパティを参照してみると、先ほど設定した権限が個別のユーザーには反映されていないことが分かる(画面をクリックすると拡大表示します)ロールに対して設定したすべての権限は、すべてのメンバに対して適用されます。ロールの権限を変更すると、ロールのメンバ全員に対してその権限の変更が適用されます。データベース・アプリケーションを構築する際、あらかじめアプリケーション運用に際して必要になる役割を定義し、それを「ロール」として設定し、ロールに対して権限設定を行う運用とすれば、テーブルやビューが追加されたときに、すべてのメンバに対して権限の設定変更を行う必要がなくなり、運用をシンプルにすることが可能です。ロールに所属させておけば、メンバの権限を設定する必要がないことを説明しました。例題を実行しながら、確認してみましょう。'ALFKI'ユーザー「yamada」が属しているロール「CardInfoUsers」は、CardInfoテーブルに対してDELETE権限が設定されていないため、例題4のとおりエラーとなります。ユーザーyamadaに対して、CardInfoテーブルのDELETE権限を設定してみましょう。例題4のとおり、ロールに権限が設定されていない場合、メンバに対して権限を付与すればその権限が有効になります。例題4では、CardInfoテーブルに対するDELETE権限は、ロールCardInfoUsersに対しては設定されていなかったため、メンバのユーザーyamadaに対して設定したDELETE権限が有効になったわけです。このように、ロールの権限とメンバの権限は、それぞれの権限を合わせた権限がメンバに対して付与されます。権限の拒否では次に、ロールに与えられた権限を拒否する場合はどうするのでしょうか。ユーザtanakaはロールCardInfoUsersのメンバですので、CardInfoテーブルに対してINSERTの権限が与えられています。これを、ユーザーtanakaだけはCardInfoテーブルに対して挿入(INSERT)ができないように設定するとします。次の例題を実行してみましょう。7)例題5のとおり、ロールで権限が設定されていても、メンバで権限を拒否すると、結果としてメンバの権限は拒否されることが確認できました。逆に、メンバで権限が設定されていても、ロールで権限が拒否されていれば、結果としてメンバの権限は拒否されます。ロールCardInfoUsersに対して、CardInfoテーブルのDELETE権限を拒否に設定すると、先ほどyamadaに対して許可したDELETE権限が拒否されるのが確認できますので、実際に実行してみてください。ロールとメンバの権限に関して、設定と実際に付与される権限を一覧でまとめると、以下の表のとおりになります。拒否つまり、「許可が1つもないと拒否」「拒否が1つでもあると拒否」と覚えるとよいでしょう。固定データベースロールこれまでの例で気が付いたかもしれませんが、ロールの一覧には、今回作成したCardInfoUsers以外にもいくつかのロールが表示されています。Managerでロールの一覧を表示させたところ。今回作成したCardInfoUsers以外にも、あらかじめロールが用意されていることが分かる(画面をクリックすると全体を表示します)「db_accessadmin」など、「db_」が頭に付いたロールと、「public」というロールがあるのを確認できますね。Serverでデータベースを作成すると自動的に作成される標準のロールです。それぞれのロールは、データベースに対しての権限があらかじめ設定されているため、条件が合えば新たにロールを作成せずに、これらの固定データベースロールを使用した方が便利なことがあります。各ロールの設定内容は下記の表のとおりです。db_datareader、db_datawriterは、すべてのテーブルとビューに対しての権限を設定することが可能です。ほとんどのテーブルやビューに対して権限を許可し、一部のテーブルやビューに対して権限を拒否する場合は、db_datareaderやdb_datawriterのメンバに指定し、ユーザーの権限を設定する方が、テーブル数が多い場合に便利です。この一覧にない固定データベースロールが「public」です。ロールpublicは、データベースのすべてのユーザーがメンバとして自動的に指定されるロールです。ユーザーを新規に作成すると、必ずロールpublicのメンバに指定されます。先の例で作成したユーザーyamadaとtanakaもロールpublicのメンバに指定されているので、確認してみてください。ロールpublicには、すべてのユーザーがメンバとして自動的に登録される。ユーザーyamadaが所属するロールの一覧を確認してみると、特に設定していないのにpublicに所属していることが分かる(画面をクリックすると拡大表示します)ただし、ロールpublicには権限の設定がまったくされていないので、1つ1つのオブジェクトに対して権限を設定する必要があります。データベースのすべてのユーザーに一律の権限を設定する際は、新たにロールを作成するのではなく、ロールpublicに対して権限を設定すると便利です。Managerを使用したロールの設定について解説しました。メールマガジンをご購読ください。申し込みページへITmediaはアイティメディア株式会社の登録商標です。