重複の可能性:
列レベルのセキュリティ
複数のユーザーが表示できるビューがあり、一部の列を特定のユーザーに制限したいと思います。
たとえば、フィールドA
、B
... F
のビューがあり、ユーザーP
、Q
、R
、S
があります。これが私が実装しようとしているものです:
P
がビューを参照すると、A
、B
、C
、F
、列D
、E
のデータがNULL
として表示されます。Q
がビューを参照すると、すべてのフィールドにデータが表示されますR
がビューを参照すると、A
、D
、E
、F
、列B
、C
のデータがNULL
として表示されます。いくつかのオプションがあります。
自分でそれを行う方法の例を次に示します。
_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
フィールドを使用して、すべての情報が引き続き単一の行にあり、これを複数のビューに使用できるようにすることもできます。 。