0

さて、私はSQLに慣れていないので、テーブルから情報を取得するときに、誰がどのタイプのデータにアクセスできるかを制限する方法があるかどうか疑問に思っていました. たとえば、クライアントの名前、電話番号、住所、SSN、給与などの情報を含むテーブルがありました。誰が閲覧しているかに基づいて、表示される内容を制限する方法があるかどうかを調べたいと思いますそのデータ。人 A はすべてを見ることができ、人 B は SSN と給与以外のすべてを見ることができます。

編集:

特定のグループのビューを制限するトリガーを使用できますか?

4

2 に答える 2

2

ビューを使用できます。その後は、使用方法、ユーザーがデータにアクセスする方法 (アクセス権やユーザー グループなど) によって異なります。

于 2012-12-10T21:24:24.327 に答える
1

特定のユーザーに対して列が表示されないようにするには、ユーザー グループごとに個別のビューが必要です (つまり、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

データが魔法のように表示されます。

于 2012-12-10T21:29:58.880 に答える