2008年02月25日

では、「ファイングレインアクセスコントロール(FGAC)」やってみよう

以下のように、EMP表があるとして、SAL,COMM列に制限をかけて、
SAL,COMM列にアクセスした場合は、自分以外の行は見れないようにします。
NOENAMESALCOMM
10YAMADA1000 
11KUMA5000500
12SASAKI20000
13SUZUKI4000 


(1)先ずは、ポリシーファンクションの登録

CREATE OR REPLACE FUNCTION policy_func (
obj_schema VARCHAR2,
obj_name VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
IF obj_schema = SYS_CONTEXT('USERENV', 'SESSION_USER') THEN
RETURN '1=1';
ELSE
RETURN 'ename = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')';
END IF;
END policy_func;
/


SYS_CONTEXT('USERENV', 'SESSION_USER')は、SQLの実行ユーザ名を返却しますので、
"obj_schema = SYS_CONTEXT('USERENV', 'SESSION_USER')"は、実行ユーザがオブジェクトの所有者であるかを判断しています。

そして、
"'ename = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')'"は、ename列の値が、実行ユーザ名であるかを判断しています。

(2)次に、ポリシーの登録

BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => (EMPの所有ユーザ名),
object_name => 'emp',
policy_name => 'emp_policy',
function_schema => ('policy_func'の所有ユーザ名),
policy_function => 'policy_func',
sec_relevant_cols => 'sal, comm');
END;
/


sec_relevant_cols => 'sal, comm');で、アクセスコントロールする列リストを指定します(Oracle10gから複数の列を指定できるようになりました。)

これで、設定完了です。

"YAMADA"ユーザで以下ような'sal' or 'comm'列にアクセスするSQLを実行すると、ポリシーが働き、
SELECT * FROM (EMPの所有ユーザ名).EMP;

NOENAMESALCOMM
10YAMADA1000 


というようENAMEが自分以外のレコードは見えなくなります。
posted by 台北猫々 at 20:44| Comment(0) | TrackBack(0) | 技術メモ(Oracle)
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/11438002

この記事へのトラックバック