2012-03-20 6 views
0

当社は、C#Visual Studio 2010、Windows 7、およびOracle 11gで実行されるいくつかのソフトウェアを継承しました。努力の結果、ソフトウェアが稼働し、安定したデータベース(スキーマ)がセットアップされました。同じユーザーで複数のOracleデータベース(スキーマ)をセットアップする方法は?

古いシステムのデータをこの新しいシステムに移行するプロセスが開始されました。しかし、データのインポートでは試行錯誤の作業が必要になると思うので、私は作業スキーマを台無しにしたくありません。

私は次のことをしたかった: 私たちの既存のスキーマがPRODと呼ばれているとしましょう。インポートしたデータに使用できるTESTという2番目のスキーマを作成したかったのです。次に、C#コードでは、2つのデータベーススキーマを切り替えるときに、データソースの名前を切り替えることができます。この接続のユーザー名とパスワードは、コードに散在している多数の場所に表示されます。 「db環境」を切り替えるたびに複数の場所でユーザーの資格情報を変更する必要がないように、私はPRODとTESTにアクセスできる単一のユーザーを作成したいと考えました。

ただし、how to grant user privilege on specific schema?はこれが不可能であることを示しています。 Correct way to give users access to additional schemas in Oracleは、オブジェクトレベルでアクセスを許可する方法を提案していますが、これは不十分です。基本的に、1人のユーザーが2つの同一のスキーマ(PRODとTEST)にアクセスするようにします。これを達成したら、データのインポートを開始するためにTESTを修正したいと考えています。

別のポートに別々のOracle DatabaseインストールとしてTESTを作成しようとしましたが、この新しいインスタンスでユーザーを作成しようとすると、ユーザーがすでに存在しているという競合が発生します(PROD用に作成された元のデータベースインストール)。

ユーザーは既に存在し、PRODにアクセスできます。彼にTESTへのアクセスを与えるにはどうすればいいですか?または、Oracleを使用するアプリケーションでPRODおよびTESTデータベースを定義するというより一般的な問題を解決するにはどうすればよいでしょうか?

これは些細なことですが、Oracleでこれを行う方法はわかりません。私はOracleにとって非常に新しいです。

+0

「1人のユーザーが2つの同一のスキーマにアクセスできる」とはどういう意味ですか? oracle dbでは、ユーザーはスキーマとほとんど同じです。どのユーザーが「PRODにアクセスできますか」とはどういう意味ですか? –

+0

説明:コードには、oracleデータベースに接続するためのユーザー名とパスワードが定義されています。このユーザー名とパスワードは、さまざまな場所でコードにハードコードされています。このユーザー名/パスワードは、スキーマAに接続するために使用されます(正しくは1か所のみで定義されています)。今度は、データインポートのいくつかのテストを行うための2番目のスキーマ、たとえばBを作成します。 BはAと同じユーザー名/パスワードを使用する必要があるため、アプリケーション全体でこれらの詳細を変更する必要はありません。次に、アプリケーションのAとBを切り替えるだけで、1つの場所でスキーマ名を変更できます。 – Stanley

+0

oracle DB schema = dbユーザーです。セマンティクスの違いについては、http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6162110256950を参照してください。さて、あなたは 'スキーマAに接続する'と言うとき、あなたはどういう意味ですか?アプリケーションからユーザーAとしてDBに接続しているということですか?またはスキーマAのオブジェクト(ユーザーAが所有するオブジェクト)に対する権限を持つ別のDBユーザーですか? –

答えて

0

Oracleへの接続がC#コードで正しく処理されていないため、これが問題になっています。

グレゴリーが示唆するようにデータアクセスレイヤーを個別に定義した場合、またはA.Bの答えポイントとしてSQL文でより一般的な命名規則を使用した場合、2つのデータベースを切り替えるほうがはるかに簡単です。

私たちの使命は、現在のコードの変更/リファクタリングを行う伴わないので、私は、バックアップとリカバリの方法を使用しています:

私は作業データベースのバックアップを作成します。それから私は必要なテストとデータベースの変更を行います。作業データベースに戻す必要がある場合は、「テスト」データベースのバックアップを再度作成し、元の作業データベースを復元し、適切なフラグを使用してリストアの場合は既存のテーブルを置き換えます。これにより、私は "作業中の"データベースと "テスト"データベースの間を行き来することができます。

バックアップとリストアの実行に時間がかかりますが、C#コードに影響を与えることなく動作し、動作中のデータベースに影響を与えずに「テスト」データベースで作業できるため、これは理想的ではありません。これは "テスト"データベースが機能するまでの一時的なシナリオなので、これが私が従うアプローチです。

他の回答が指摘するように、接続コードを修正/リファクタリング/一般化する必要があります - 私はそれが最善のアプローチであり、私がすぐにやっていない唯一の理由は私たちがまだコードを変更することを義務づけられました。

1

許可を与える質問はalready been answeredです。

質問:全体として、データベース・スキーマを更新したいが、別のスキーマと同じデータベースに保存し、両方を本番データベースのように見せたい?もしそうなら、それをもう一度読んで、それがどんなに危険なのかを沈めることができます。

ソフトウェアの更新として、あるスキーマから別のスキーマに移行する場合は、新しいデータベースを作成して移行する方が安全です。これは、あなたがスクリプトを微調整するときに新しいデータベースを吹き飛ばすことができるので、たくさんのショットを与えます。

あなたがソフトウェアで可能な限り小さな摩擦をしたい場合、あなたはいくつかのことをする必要があります。

  1. は、複数の場所でハードコード接続情報に決めたバカからコードをリファクタリング。 1つの場所で文字列を取得し、データアクセスレイヤ(DAL)コードを独自のクラスに抽出する必要があります。
  2. データベーススキーマに依存しないドメインオブジェクトの作成を検討してください。私はこれを必須と考えていますが、これをしないと逃げることができます。あるスキーマから別のスキーマに移行する場合は、データ構造を使用すべきではないので、PRODスキーマテーブルと一致する場合でも、私はまだドメインオブジェクトを作成します。
  3. データアクセスレイヤー(DAL)のインターフェイスを作成する
  4. 現在のデータスキーマを現在のDALを通じて、インターフェイスを使用してドメインオブジェクトにマップします。
  5. 新しいDALを使用して、新しいスキーマをインターフェイスを使用してドメインオブジェクトにマップします。
  6. これは古いか新しい「スキーマ」
+0

システムがまだプロンプトされていません。 PRODとTESTは、2つの異なるデータベース(スキーマ)名の単なる例です。これは究極の、最終的な解決策のように聞こえる。しかし、コードリファクタリングは現時点では私たちの任務ではありません。私たちはまず、データの作業を開始するだけです。だから私は、必要ならば同じユーザー名/パスワードを使用してPRODデータベースに接続し、必要に応じてTESTデータベースに接続したいと思っています。そして、私は2つの間で簡単に切り替える必要があります。 – Stanley

0

への応用が設定可能になり、私はあなたが持っていると仮定しています(あなたが使用しようとしているどのDALのオブジェクトを決定するためにファクトリを作成します(またはプロバイダパターンを使用)スキーマPRODと、このスキーマ内のオブジェクトにいくつかの権限を持ってDBUSER。
DBUSERの名前とパスワードは、すべてのアプリケーションの上にハードコードされています。
あなたは(DBUSERへの助成金を含む)PRODと同じように見える新しいスキーマTESTを作成しました
アプリケーションが好きな場所であればどこでもかまいません。

UPDATE some_table set ... 

それはPRODTESTずにsome_tableテーブルを更新します。
私の提案を使用して変更SYNONYMSを、IE-
あなたはPRODsome_tableを更新したい場合は、実行することです。

CREATE OR REPLACE PUBLIC SYNONYM some_table for prod.some_table; 

とあなたがTESTsome_tableを更新する際に、実行します。

CREATE OR REPLACE PUBLIC SYNONYM some_table for test.some_table; 
+0

シノニムとは、私のコーリング(C#)コードを変更する必要はないということですか?したがって、some_tableの同義語がPROD.some_tableであれば "UPDATE some_table"はPRODを更新し、特定の時刻に同義語がTEST.some_tableであればTESTを更新しますか? (シノニム名がスキーマ・オブジェクトと同じであれば、オブジェクト名はスキーマ名で始まる必要があります) 1)TESTを使用するにはTESTのシノニムを設定し、PRODを再び使用するにはシノニムを削除しますテストし、PRODの同義語を作成しますか? 2)すべてのオブジェクトに対して、my_objectがschema.my_objectを指すように、どのようにすべてのスキーマ・オブジェクトの同義語を作成できますか? – Stanley

+0

A、B、Cの3つのスキーマがあるとします。AとBの両方にテーブル名T1があります。 AとBの両方で、T1にCの選択が与えられます。スキーマC(ユーザーC)にDBに接続し、フォームT1を選択する場合は、スキーマ、構文が「A.T1」、 B.T1'(あなたが望むT1に依存する)。もしCが同義語を持っていれば、A.T1のために "TT1"と言うことができ、A.T1の公式の同義語 "TT1"があれば、CはTT1から本当に 'A.T1'を選択することができます。 TT1を 'B.T1'の同義語に変更する場合は、TT1から選択するとT1の結果がBになります。 –

+0

Ok。しかし、これは、AとBの両方が同じテーブル名を持ち、SQLコードでテーブル名(接頭辞なし)が参照されているため、コード内のどこでもSQLコマンドを変更する必要があることを意味します。例:AとBの両方にテーブルT1が含まれ、C#コードに「select * from T1」などの文が含まれている。私はシノニム(接頭辞なし)としてT1を使用することはできませんし、コードから参照される各テーブルまたはビューに対してプレフィックスまたはT1の名前を変更することは侵略的な練習です。まだコードを変更するのは私たちの範囲ではありません。だから私は同義語がうまくいくとは思わない。 – Stanley