1

Oracle SQL ステートメントをストアド プロシージャに変換する必要があるため、権限の低いユーザーは特定のデータ フィールドにアクセスできます。

SELECT
    info_field, data_field
FROM
    table_one
WHERE
    some_id = '<id>' -- I need this <id> to be the procedure's parameter
UNION ALL

SELECT
    info_field, data_field
FROM
    table_two
WHERE
    some_id = '<id>'
UNION ALL

SELECT
    info_field, data_field
FROM
    table_three
WHERE
    some_id = '<id>'
UNION ALL

...

私は SP の専門家ではないので、関連するすべてのテーブル (約 12) をループする良い解決策を見つけることができませんでした。

どんなアイデアでも役に立ちます。どうもありがとう!

4

3 に答える 3

4

ユーザーのアクセスを制限したいだけの場合は、ビューを作成して、テーブルではなくビューでの選択を許可できます。

CREATE VIEW info_and_data AS
    SELECT info_field, data_field    
    FROM   table_one
    UNION ALL
    SELECT info_field, data_field    
    FROM   table_two
    UNION ALL
    SELECT info_field, data_field    
    FROM   table_three
    ...

次に、ユーザーは次のように入力できます。

SELECT info_field, data_field
FROM   info_and_data
WHERE  some_id = <id>
于 2008-11-21T14:28:06.887 に答える
2

以下の私の提案以外にも目標を達成する方法はありますが、将来変更される可能性のあるデータ アクセス ポリシーを実装するためだけに、実際には 1 つのテーブルに属するデータを分割しないように警告します。

ユーザーに表示されるテーブル列を制限する最も簡単な解決策は、それらのテーブルのビューを使用することです。特定の列を表示または非表示にするさまざまなビューを使用し、それらのビューへのアクセス権をさまざまなユーザー/ロールに付与します。

ユーザーが表示できる列の組み合わせが事前にわからない場合は、動的 SQL を使用できます。ユーザーのアクセス権限に基づいて、ストアド プロシージャで SQL ステートメントを組み立てますつまり、ステートメントの SELECT 部分に適切な列のみを含めます。詳細については、Oraceのこのドキュメントを参照 してください。

Oracle 10g を使用している場合は、このOracle の記事が興味深いかもしれません。Virtual Private Database (略して VPD) のトピックを紹介します。ここでは、誰がテーブルにアクセスしているかに応じて、特定の行、列、または個々の列の値を非表示にすることができます。

于 2008-11-21T14:52:37.757 に答える
1

これらすべてのテーブルの中で、特定の ID に一致するテーブルは 1 つだけであると期待していますか?

いいえの場合: 複数の一致がある場合に何をしたいのかを説明する必要があります。

はいの場合: 同じ SQL クエリを実行し、結果を変数に選択して返します。

次のようになります。

PROCEDURE get_fields( the_id  NUMBER,
                      info_field_out  OUT  table_one.info_field%TYPE,
                      data_field_out  OUT  table_one.data_field%TYPE
                    )
  IS
  BEGIN
    SELECT info_field, data_field
      INTO info_field_out, data_field_out
      FROM (
        ... put your full SQL query here, using 'the_id' as the value to match against ..
      );

  EXCEPTION

    WHEN no_data_found THEN
      -- What do you want to do here?  Set the outputs to NULL?  Raise an error?

    WHEN too_many_rows THEN
      -- Is this an invalid condition?

  END;
于 2008-11-21T14:07:06.773 に答える