e-learning、オラクル研修、LMS(学習管理システム)のiStudy

e-learning、オラクル研修、LMS(学習管理システム)のiStudy

第54回 「定義者権限と実行者権限(その3)」

2013.04.15

こんにちは。インストラクターの蓑島です。

前回からの続きです。今回は、実行者権限プロシージャのもう一つの側面、つまり「実行者の権限」で実行されるという側面に注目して解説します。

例えば、実行者権限プロシージャ内で参照されている表に、明示的にスキーマが指定されていれば、どういうことになるでしょうか?具体的にはプロシージャ内で「EMP」ではなく、「SCOTT.EMP」などと記述されている場合です。

この場合は実行者権限プロシージャとはいっても、実行者のスキーマではなく、あくまでもSCOTTスキーマのEMPということになります。
ただし、定義者権限の場合とは違って、その表に対する権限が実行者に必要になります。 なぜなら実行者権限プロシージャは実行者の権限で実行されるからです。
スキーマの指定がない、ただの「EMP」表であれば、実行者のEMP表ということになりますので、当然すべての権限が実行者にあり、ことさら「実行者の権限で」と意識する必要はありません。
しかし、「SCOTT.EMP」のようにスキーマの指定があれば、それは実行者のスキーマとは違うので、「実行者の権限」で実行する以上は権限の問題がクローズアップされてくるのです。つまり、SCOTT.EMP表に対する権限がなければプロシージャを実行してもエラーになるということです。
このことは、しっかりと権限管理をすればセキュリティ強化につながることを意味します。

以下の例をご覧ください。

実行者権限PROC1プロシージャ内のEMP表に対してスキマーを指定してSCOTT.EMPとして前回と同じことを行ってみます。

--  ここから  ----------------------------------------------
SQL> SHOW USER
ユーザーは"SCOTT"です。   ← SCOTTユーザで
SQL> CREATE OR REPLACE PROCEDURE PROC1    -- ← PROC1プロシージャを作り変える
  2  AUTHID CURRENT_USER         -- ←実行者権限の指定
  3  IS
  4      V_ENAME    VARCHAR2(20);
  5  BEGIN
  6      SELECT ENAME INTO V_ENAME
  7      FROM SCOTT.EMP WHERE EMPNO = 7934;  -- ←スキーマを指定した(変更点)
  8      DBMS_OUTPUT.PUT_LINE(V_ENAME);
  9  END;
 10  /

プロシージャが作成されました。

--  ここまで  ----------------------------------------------

権限の関係がわかりやすいように新規ユーザ( KING )をつくり最低限の権限を付与し実行します。

--  ここから  ----------------------------------------------

SQL> CONNECT SYSTEM/oracle       -- SYSTEMユーザ(管理者)で
接続されました。

SQL> CREATE USER KING IDENTIFIED BY king;   --新規ユーザ( KING )を作成

ユーザーが作成されました。

SQL> GRANT CONNECT TO KING;            -- KINGユーザにCONNECTロール(接続のための権限)を付与

権限付与が成功しました。

SQL> GRANT EXECUTE ON  SCOTT.PROC1 TO KING;   -- KINGにSCOTT.PROC1の実行権限を付与

権限付与が成功しました。

--  ここまで  ----------------------------------------------
これで、KINGユーザはCONNECTロールと、SCOTT.PROC1プロシージャの実行権限のみを持ちます。それ以外の権限はありません。
では早速、CONNECTして実行してみます。

--  ここから  ----------------------------------------------

SQL> CONNECT KING/king     -- KINGユーザで
接続されました。
SQL> SET SERVEROUTPUT ON      -- SCOTT.PROC1プロシージャを実行
SQL> EXECUTE SCOTT.PROC1
BEGIN SCOTT.PROC1; END;

*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。
ORA-06512: "SCOTT.PROC1", 行6          -- SCOTT.PROC1プロシージャの6行目でエラー
ORA-06512: 行1

--  ここまで  ----------------------------------------------
ご覧のように、KINGがSCOTT.PROC1プロシージャを実行しても、エラーです。SCOTT.PROC1プロシージャの6行目でエラーというのは、SCOTT.EMP表のことです。
SCOTT.EMPに対する
SELECT権限がKINGにないためにエラーとなったわけです。ではKINGにSCOTT.EMPのSELECT権限を与えて同じ処理を行います。

--  ここから  ----------------------------------------------
SQL> CONNECT SCOTT/tiger      -- SCOTTユーザで
接続されました。
SQL> GRANT SELECT ON SCOTT.EMP TO  KING;    -- SCOTT.EMPのSELECT権限をKINGに与え

権限付与が成功しました。

SQL> CONNECT KING/king  -- KINGユーザで、
接続されました。
SQL> SET SERVEROUTPUT ON   -- 画面出力有効
SQL> EXECUTE SCOTT.PROC1   -- SCOTT.PROC1プロシージャを実行する
MILLER                     -- SCOTT.EMPがSELECTされた

PL/SQLプロシージャが正常に完了しました。 -- 正常に完了

--  ここまで  ----------------------------------------------

このように、実行者権限プロシージャを実行するためには、そのプロシージャの実行権限だけではなく、そのプロシージャ内で実行する個々の処理についても、実行者側に権限が必要であることがおわかりいただけると思います。
つまり実行者権限プロシージャは「実行者の権限」で実行されているわけです。

実行者権限プロシージャは実行者の権限で実行されますから、実行者側の権限を細かく設定することでセキュリティ強化に役立ちます。
例えば、ユーザ1には、SCOTT.EMPのSELECT権限だけを与える、ユーザ2には、SCOTT.EMPのSELECT権限とUPDATE権限を与える、そして、SCOTT.EMPをSELECTする実行者権限プロシージャの実行権限をユーザ1とユーザ2に与える、さらにSCOTT.EMPをUPDATEする実行者権限プロシージャの実行権限をユーザ2にだけ与えるといったようにします。
しかしユーザの数や、実行者権限プロシージャの数が多いときはなかなか大変そうですね。
そこで、パッケージ(本メルマガ第27回~35回)やロールを使うことでこのようなセキュリティ管理を簡素化できます。
次回はそのことを解説したいと思います。

それでは今回はここまでにいたします。また次回ご期待ください。

先頭へ戻る