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の仮想プライベートデータベース機能を使用することですが、それはおそらくやり過ぎです。(また、それは追加費用のオプションかもしれません、私にはわかりません。)