特定のユーザーに対して列が表示されないようにするには、ユーザー グループごとに個別のビューが必要です (つまり、SSN を持たないビュー A、制限されたグループのユーザーの給与など)。または、きめ細かいアクセス制御 FGAC を使用します: http://docs.oracle.com/cd/B19306_01/network.102/b14266/apdvcntx.htm
きめ細かいアクセス制御はテーブルに直接適用されるため、ビューを実装する必要はありません。
たとえば、非常に簡単なテストを示します。Oracle ロール「SSN_AUTH」を持つすべてのユーザーが、すべての行の SSN/Salary を表示できるとします。それがないものはできません。
SQL> create table person(id number, name varchar2(200), ssn varchar2(20), salary number(*,2));
Table created.
次に、関数を作成します (必ず、これを実際のコードのパッケージに入れます)。exists (select null from session_roles where role = 'SSN_AUTH')
この関数は、テーブルで起動されたすべてのクエリに対してサイレント述語を適用しperson
ます。つまり、その述語は、SSN_AUTH と呼ばれる有効なロールを持っていない場合、データが表示されないことを意味します。
SQL> create or replace function person_rls (p_owner in varchar2, p_name in varchar2)
2 return varchar2 as
3 v_sql varchar2(2000);
4 begin
5 v_sql := 'exists (select null from session_roles where role = ''SSN_AUTH'')';
6 return v_sql;
7 end person_rls;
8 /
Function created.
今、私は行を抑制したくありません(できますが)。列データを抑制したいだけです。したがって、この関数をポリシーとしてテーブルに追加し、保護する列を伝えます。
SQL> BEGIN
2 DBMS_RLS.ADD_POLICY(object_schema=>user, object_name=>'PERSON',
3 policy_name=>'SEC_PERSON', function_schema=>user,
4 policy_function=>'PERSON_RLS',--our function
5 sec_relevant_cols=>'ssn,salary', -- secure these cols.
6 sec_relevant_cols_opt=>dbms_rls.ALL_ROWS);
7 END;
8 /
PL/SQL procedure successfully completed.
SQL> insert into person values (1, 'DazzaL', 'asdklakjd', 10000.12);
1 row created.
SQL> commit;
Commit complete.
役割が設定されていない場合:
SQL> set role none;
Role set.
SQL> select * from person;
ID NAME SSN SALARY
---------- -------------------- -------------------- ----------
1 DazzaL
給与+ SSNは空白です..しかし、役割を有効にすると.
SQL> set role all;
Role set.
SQL> select * From session_roles;
ROLE
------------------------------
CONNECT
RESOURCE
SELECT_CATALOG_ROLE
HS_ADMIN_SELECT_ROLE
PLUSTRACE
SSN_AUTH <--- we have it now.
SQL> select * from person;
ID NAME SSN SALARY
---------- -------------------- -------------------- ----------
1 DazzaL asdklakjd 10000.12
データが魔法のように表示されます。