1

さまざまなクライアントに属するさまざまな人のテーブルがあります。

CREATE TABLE CLIENTS
(
  CLIENT    VARCHAR2(20),
  FIRSTNAME VARCHAR2(20)
)

データ例:

INSERT INTO CLIENTS (CLIENT, FIRSTNAME) VALUES ('A Corp.', 'Alice')
INSERT INTO CLIENTS (CLIENT, FIRSTNAME) VALUES ('B Corp.', 'Bob')

ここで、「ACorp。」のすべての行の名を変更する権限を付与します。人物Aと「BCorp。」の行に Bさんへ。一人一人の視点を作ることで可能かもしれないと思います。しかし、各人に専用の助成金ビューを作成せずにそれも可能ですか?

4

1 に答える 1

4

Oracleユーザー名、またはアプリケーション内のデータを使用してユーザーを識別できる場合は、次のような単一の更新可能なビューを使用できると思います。

CREATE VIEW filtered_clients AS (
  SELECT * FROM clients WHERE client LIKE USER || ' Corp.'
)

(ここで、「USER」はログインしたユーザー名を返すOracle SQL関数です。エンドユーザーが中間層を介してデータベースアカウントを共有している場合、これは機能しませんが、おそらくエンドユーザー名をから渡すことができます。中間層を使用し、代わりにそれを使用します。)

ユーザー名とクライアント名の関係をハードコーディングしないように、どのユーザーがどのクライアントを管理できるかを識別する別のテーブルを追加することをお勧めします。その場合、ビューは次のようになります。

CREATE VIEW filtered_clients AS (
  SELECT * FROM clients WHERE client IN (
    SELECT client FROM user_client_access WHERE username = USER
  )
)

これはまだ更新可能だと思います。CLIENTおそらく、列の更新を防ぎたいでしょう。これを行うには、ビューで指定するWITH CHECK OPTIONか、ベーステーブルでトリガーを使用します。

ユーザーが任意の行を表示できるようにし、自分の行のみを更新できるようにする場合は、表示アプローチは適切ではありません。代わりに、更新が試行されるたびにアクセスをチェックし、ユーザーが別のクライアントの行を更新しようとするとエラーを発生させるトリガーをベーステーブルに設定するだけで済みます。

さらに別のアプローチは、Oracleの仮想プライベートデータベース機能を使用することですが、それはおそらくやり過ぎです。(また、それは追加費用のオプションかもしれません、私にはわかりません。)

于 2012-07-18T11:55:17.723 に答える