SAL,COMM列にアクセスした場合は、自分以外の行は見れないようにします。
NO | ENAME | SAL | COMM |
10 | YAMADA | 1000 | |
11 | KUMA | 5000 | 500 |
12 | SASAKI | 2000 | 0 |
13 | SUZUKI | 4000 |
(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;
NO | ENAME | SAL | COMM |
10 | YAMADA | 1000 |
というようENAMEが自分以外のレコードは見えなくなります。