web-dev-qa-db-ja.com

さまざまなユーザーのビューに列レベルのセキュリティを課す

重複の可能性:
列レベルのセキュリティ

複数のユーザーが表示できるビューがあり、一部の列を特定のユーザーに制限したいと思います。

たとえば、フィールドAB... Fのビューがあり、ユーザーPQRSがあります。これが私が実装しようとしているものです:

  • ユーザーPがビューを参照すると、ABCF、列DEのデータがNULLとして表示されます。
  • ユーザーQがビューを参照すると、すべてのフィールドにデータが表示されます
  • ユーザーRがビューを参照すると、ADEF、列BCのデータがNULLとして表示されます。
2
dibakar paul

いくつかのオプションがあります。

自分でそれを行う方法の例を次に示します。

_CREATE TABLE base_table (a NUMBER, b NUMBER, c NUMBER, d NUMBER, e NUMBER, f NUMBER);

CREATE TABLE column_rights (username VARCHAR2(30) PRIMARY KEY,
                            a NUMBER, b NUMBER, c NUMBER, d NUMBER, e NUMBER, f NUMBER);

INSERT INTO column_rights VALUES ('P', 1, 1, 1, 1, NULL, NULL);
INSERT INTO column_rights VALUES ('Q', 1, 1, 1, 1, 1, 1);
INSERT INTO column_rights VALUES ('R', 1, NULL, NULL, 1, 1, 1);

CREATE OR REPLACE VIEW my_view AS
SELECT b.a * c.a a,
       b.b * c.b b,
       b.c * c.c c,
       b.d * c.d d,
       b.e * c.e e,
       b.f * c.f f
  FROM base_table b
  JOIN column_rights c ON c.username = USER;

 GRANT SELECT ON my_view TO P; -- Q, R
_

上記はすべてのフィールドがNUMBERであることを前提としていますが、CASEを使用すればこれは何でも機能します。これは、ユーザーがデータベースレベルで定義されていることも前提としていますが、カスタム識別スキームを使用することもできます(USERを関数--V('USER') in APEXに置き換えます)。

より一般的な設定では、_COLUMN_RIGHTS_列と_TABLE_NAME_列を持つ_COLUMN_NAME_テーブルを使用できます(残念ながら、これにはN個のルックアップが必要です。Nは列の数です)。

列の権利の連結ビット表現に単一のINTEGERフィールドまたはRAWフィールドを使用して、すべての情報が引き続き単一の行にあり、これを複数のビューに使用できるようにすることもできます。 。

2
Vincent Malgrat