1

サーバー上にトランザクション用のパブリック シノニムがあります。ただし、他のユーザーの邪魔にならないように、自分のローカル バージョンのテーブルで作業できるようにしたいと考えています。

Oracle の SQL は、このような名前の競合を予測可能な方法で解決しますか?

つまり、別のユーザーが というパブリック シノニムを作成し、TRANSACTION私がこれを行うとします。

CREATE TABLE TRANSACTION (

ID NUMBER

);

私が書くとき

select * from TRANSACTION

オラクルが常にシノニムまたはローカルテーブルを解決するという保証はありますか?

(問題を強制するように技術的に指定できることは知っていますschema.TRANSACTIONが、私の場合、アプリケーションを変更/再構築する必要があり、いくつかの作業を節約したいと考えています。)

4

1 に答える 1

4

名前解決に関するあなたの理解は正しいです。Oracle は、最初に現在のスキーマを調べて、その名前のオブジェクトを見つけます。そのため、競合が発生した場合は、パブリック シノニムによって参照されるオブジェクトではなく、現在のスキーマ内のオブジェクトが選択されます。

http://docs.oracle.com/cd/B28359_01/server.111/b28310/general008.htm

Oracle Databaseは、SQL文で参照されている名前の最初の部分を修飾しようとします。たとえば、scott.emp では、scott が最初のピースです。ピースが 1 つしかない場合は、そのピースが最初のピースと見なされます。

データベースは、現在のスキーマで、オブジェクト名の最初の部分と名前が一致するオブジェクトを検索します。そのようなオブジェクトが見つからない場合は、ステップ b に進みます。

データベースは、名前の最初の部分に一致するパブリック シノニムを検索します。見つからない場合は、ステップ c に進みます。

データベースは、名前がオブジェクト名の最初の部分と一致するスキーマを検索します。見つかった場合は、手順 b に戻り、名前の 2 番目の部分をオブジェクトとして使用して、修飾されたスキーマで検索します。2 番目のピースが以前に修飾されたスキーマ内のオブジェクトに対応していない場合、または 2 番目のピースがない場合、データベースはエラーを返します。

手順 c でスキーマが見つからない場合、オブジェクトは修飾できず、データベースはエラーを返します。

そうは言っても、これはパブリックシノニムの問題の1つです。このようなオブジェクトを使用すると、開発とサポートの両方で混乱が生じます。どちらの場合も、所有者と名前でオブジェクトを参照することをお勧めします

于 2013-02-11T14:50:24.513 に答える