また、ロールを有効化する直前に、PL/SQLのコード内でセキュリティ要件を満たしているかのチェックができるメリットがある。
セキュアアプリケーションロールの作成
セキュアアプリケーションロールは、ロール作成時にidentified usingなお、このタイミングでidentified usingに指定したpl/sqlが存在していなくても問題ない。
SQL> create role sample_role identified using hoge.activation_sample_role; Role created.
ロールを有効化するためのpl/sqlを作成する
このpl/sqlでは、要件を満たす場合にのみdbms_sessionパッケージを使って、先ほど作ったロールを有効化します。サンプルとして、接続プログラムを表す値が「SQL*Plus」の場合にロールを有効化します。
create or REPLACE PROCEDURE activation_sample_role
authid CURRENT_USER
AS
BEGIN
  if (SYS_CONTEXT('USERENV','MODULE') = 'SQL*Plus') THEN
    DBMS_SESSION.set_role('sample_role');
  END IF;
END;
ロールの付与
hrスキーマのjobsテーブルへの参照権限をロールに付与し、ロールをhogeユーザに付与する。SQL> grant select on hr.jobs to sample_role; Grant succeeded. SQL> grant sample_role to hoge; Grant succeeded.
ログインしてロールの確認をする
SQL> sho user
USER is "HOGE"
-- ログイン直後のロールの確認
-- sample_roleは付与されていない
SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
RESOURCE
-- ロールに与えているオブジェクト権限で参照できるテーブルへアクセスしてみるがエラーとなる。
SQL> select* from hr.jobs;
select* from hr.jobs
                *
ERROR at line 1:
ORA-00942: table or view does not exist
-- ロール有効化のPL/SQLを実行
SQL> execute activation_sample_role;
PL/SQL procedure successfully completed.
-- ロールの確認
-- 有効になっていることがわかる
SQL> select * from session_roles;
ROLE
--------------------------------------------------------------------------------
SAMPLE_ROLE
-- ロールに値ている権限で参照できるテーブルも見れるようになる。
SQL> select* from hr.jobs;
JOB_ID    JOB_TITLE          MIN_SALARY MAX_SALARY
---------- ----------------------------------- ---------- ----------
AD_PRES    President        20080      40000
