11

私は主にオラクルの初心者なので、これがばかげた質問であれば許してください...

任意の SQL を実行するストアド プロシージャを含む「CODE」というスキーマがあります (現時点では、それに関連する潜在的なセキュリティの問題は無視してください)。渡された SQL はデータを選択します。ただし、すべてのデータはスキーマ A、B、または C のいずれかに存在しますが、SQL は一度に 1 つのスキーマからのみ選択します。

例: タイプ A のユーザーは文字列 'SELECT * FROM A.USERTABLE' を作成しますが、タイプ B のユーザーは文字列 'SELECT * FROM B.USERTABLE' を作成します。

私がやろうとしているのは、ユーザーがスキーマを明示的に指定できないようにすることです。フロントエンドの .net アプリケーション。それらがタイプ A、B、または C のいずれであるかは既にわかっています。3 つすべてに単純に「SELECT * FROM USERTABLE」と入力してもらいたいのです。

私が抱えている問題は、それを行う方法がわからないことです。私のアプリは 'CODE' スキーマでのみ proc を実行できます。そのため、コードを複製してユーザー A に 'A.ExecuteSQL' を呼び出させることはできません。

いくつか試してみました。しかし、これまでのところ何も機能していません。ExecuteSQL プロシージャを CODE スキーマにとどめたい。しかし、'USERTABLE' が渡されたとき、それが A.USERNAME を意味することもあれば、B.USERNAME を意味することもあるということを知っておく必要があります。

助言がありますか?

4

2 に答える 2

12

使用する:

ALTER SESSION SET CURRENT_SCHEMA = schema

これは、 SQL Server の構文に相当しEXECUTE ASます。

于 2010-03-04T03:35:53.070 に答える
9

別のオプションは、AUTHIDCURRENT_USERプラグマを使用することです。

パッケージ、プロシージャ、関数、またはタイプ名の直後にこれら2つのキーワードを追加すると、CODEスキーマではなく、実行ユーザーの権限で実行されます。これは、AUTHID DEFINER(コードをコンパイルしたスキーマ/ユーザーの特権)であるデフォルトの動作をオーバーライドします。

すなわち

CREATE FUNCTION examplefunc
    (pSqlStatement IN VARCHAR2)
RETURN INTEGER
  AUTHID CURRENT_USER
AS 
   lResult INTEGER;
BEGIN
    EXECUTE IMMEDIATE pSqlStatement INTO lResult;
    RETURN lResult;
END examplefunc;

パッケージ内の関数とプロシージャの場合、プラグマはパッケージレベルでのみ適用できることに注意してください。機能ごとに権限を設定することはできません。

これにより、関数、パッケージなどの内部のSQLがユーザー権限で実行されるようになります。

私はこれを使用して、同様の「SQLの古いビットを動的に実行する」ルーチンを管理しました-少なくとも、「通常の」ユーザーがストアドプロシージャを使用してテーブルを削除したり、追加のコードをインストールしたりできないようにしますCODEスキーマ。

(まだ行っていない場合は、特定のキーワードをスローするための検証を追加することも価値があります。つまり、SELECTで開始する必要があり、埋め込まれたpl / sqlブロックを含めることはできません。既存のコードを壊さずに回避できるものは何でも)。

于 2010-06-28T16:25:08.643 に答える