web-dev-qa-db-ja.com

Oracle-接続文字列を介してプロキシユーザーとして接続する

「プロキシユーザー」/「接続」を介してOraleデータベースの特定のスキーマへのアクセスが許可されています。

SQL Developer/TOADでは、ユーザー名を "MyUser [SomeSchema]"として指定し、ログイン後、SomeSchemaのすべてのテーブルなどをクエリできるようになりました。 「MyUser」だけを使用してログインすることもできますが、SomeSchema内の任意のテーブルをクエリすることはできません(schema.table構文を使用していても。)

つまり、私の質問は:接続文字列を使用してコードから接続する場合(.NETでODP.NETを使用)、MyUser [SomeSchema]アプローチを「複製」するにはどうすればよいですか?

更新1
Toadで次のSQLを実行すると、実際に必要な結果が得られることがわかりました。

connect MyUser[SomeSchema]/{password for MyUser};

現在のスキーマがSomeSchemaに変更され、そのテーブルをクエリできます。

問題は、これがODP.NETを介して直接達成できるかどうかです。

更新2
最後に、接続文字列を組み合わせる方法を見つけました。以下の自分の答えを見てください。


研究

私はかなりググってみました、そして運なしで以下を試しました。

  • MyUser [SomeSchema]を「ユーザーID」として指定します。
  • 接続文字列で「Proxy User Id」および「Proxy Password」パラメータを指定します。ただし、プロキシユーザーのパスワードはありません。
  • 「ALTER SESSION」構文を使用したログイン後のスキーマの変更:「ALTER SESSION SET CURRENT_SCHEMA = SomeSchema」。これは失敗しませんが、スキーマ内のテーブルをクエリすることはまだできません。
  • Toad自体でSQLトラッカーを使用して、プロキシに接続するためにSQLを実行したかどうかを確認しますが、SQLトラッカーが何かを取得できる「前」に発生するようです。トリガー?
2

最後に、接続文字列を介してプロキシユーザーのログインを表す方法を見つけました。

  • プロキシユーザーID = MyUser
  • プロキシパスワード= MyUser password
  • ユーザーID = SchemaName
  • ユーザーパスワードが設定されていません

Toad経由でログインした後、 https://www.devart.com/dotconnect/Oracle/docs/ProxyUserConnection.html にアクセスし、以下のSQLクエリを実行した後、最終的にダイムはドロップしました。ここで、誤解していたこと、MyUserが実際にはプロキシユーザーであることは明らかでした...

SELECT SYS_CONTEXT('USERENV', 'PROXY_USER'), SYS_CONTEXT('USERENV', 'SESSION_USER') FROM dual
2

プロキシ認証

次の例は、ODP.NETプロキシ認証の使用を示しています。

/*  Log on as DBA (SYS or SYSTEM) that has CREATE USER privilege.
    Create a proxy user and modified scott to allow proxy connection.

     create user appserver identified by eagle;
     grant connect, resource to appserver;
     alter user scott grant connect through appserver;
*/

// C#

using System;
using Oracle.DataAccess.Client; 

class ProxyAuthenticationSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();

    // Connecting using proxy authentication
    con.ConnectionString = "User Id=scott;Password=tiger;" + 
      "Data Source=Oracle;Proxy User Id=appserver;Proxy Password=eagle; ";
    con.Open();
    Console.WriteLine("Connected to Oracle" + con.ServerVersion);

    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
    Console.WriteLine("Disconnected");
  }
}

上記はPassword属性なしで動作するはずです。プロキシ特権の要点は、スキーマのパスワードを開示せずにログインできるようにすることです。

0
Balazs Papp