2008年02月25日

ちなみにポリシーを削除するのは、

BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'user1',
object_name => 'emp',
policy_name => 'emp_policy',
function_schema => 'user1',
policy_function => 'policy_func',
sec_relevant_cols => 'sal, comm');
END;
/

で作成したものを削除するには、


BEGIN
DBMS_RLS.DROP_POLICY (
object_schema => 'user1',
object_name => 'emp',
policy_name => 'emp_policy');
END;
/


です。猫


良かったらクリックお願いします→banner_01.gif
posted by 台北猫々 at 20:50| Comment(0) | TrackBack(0) | 技術メモ(Oracle)

では、「ファイングレインアクセスコントロール(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)

ファイングレインアクセスコントロール(FGAC)の前準備

この機能は、使ったことはないのですが、DWHなどでは便利なのでしょうか?

「ファイングレインアクセスコントロール(FGAC)」と「アプリケーションコンテキスト」を使用して表の行データへのアクセスを制御できるようです。

とりあえず、試してみるかということで、ポリシーを登録しようとしたところ以下のようなエラーが・・・
DBMS_RLS.ADD_POLICY (
*
行2でエラーが発生しました。:
ORA-06550: 行2、列1:
PLS-00201: 識別子DBMS_RLSを宣言してください。
ORA-06550: 行2、列1:
PL/SQL: Statement ignored

そういえば、
SQL> @(ORACLE_HOME)/rdbms/admin/catalog.sql
SQL> @(ORACLE_HOME)/rdbms/admin/catproc.sql

を実行していなかった。と思って実行してから、ポリシーを登録しようとしても状況変わらず・・・
というか、DBMSパッケージの実行権限を与えないと駄目じゃん!ということに気づいて、SYSユーザで以下のコマンドを実行。
GRANT EXECUTE ON DBMS_RLS TO ユーザ名
とりあえず、問題はクリアできました。猫

posted by 台北猫々 at 19:03| Comment(0) | TrackBack(0) | 技術メモ(Oracle)