y-matsui::weblog

電子楽器、音楽、コンピュータ、プログラミング、雑感。面倒くさいオヤジの独り言

完全装飾のオブジェクト名じゃない場合に、MS-SQLではdboで名前解決しているとの記述があった。やっぱりそうなのね。
またMS-SQLスキーマはMS-SQL 2000からMS-SQL 2005で大きく変更されたらしい
MSDN ユーザとスキーマの分離

TBL_***は、ユーザADMINが、スキーマADMIN中に所有する表である。→ADMIN.TBL_***

ユーザADMINには、すべての権限が与えてある。
 GRANT SELECT, INSERT, UPDATE, DELETE ON ADMIN.TBL_*** TO ADMIN ;
ユーザWEBUSERには、参照(SELECT)のみの権限が与えてある。
 GRANT SELECT ON ADMIN.TBL_*** TO WEBUSER ;

この状態で、WEBUSERは、ADMIN.TBL_***というスキーマ情報付きのオブジェクト名でアクセスできる。

次に、スキーマWEBUSER中のオブジェクトとしてADMIN.TBL_***の別名(シノニム)TBL_***を定義する。

   CREATE SYNONYM TBL_*** FOR ADMIN.TBL_*** ;


この段階で、WEBUSER権限で接続すると、TBL_***→ADMIN.TBL_***と読み替えられる。

これでめでたく、スキーマを指定しないで、同一のSQL文でアクセスできるようになった。
WEBUSERからは、スキーマADMINが所有するオブジェクトが隠蔽されるし、制限されたアクセス権でしか表にアクセスできない。

しかし、気になることがある。
「インデックスのシノニムを作成しないと、WEBUSERからの検索は遅くなるのか?」
→心配ご無用であった。インデックスはテーブルの下位オブジェクトらしく、テーブルのシノニムが定義されていれば、そのまま透過的に使われる。

■参考サイト
シノニム Oracle/オラクルをマスターするための基本と仕組み
オラクル通信 基礎から始めるデータベース入門セミナー

■その他の方法
DEFAULT_SCHAMA(MS-SQL)、CURRENT_SCHAMA(ORACLE)を設定するという方法もある(?)
・オラクルの場合
スキーマ Oracle/オラクルをマスターするための基本と仕組み
ALTER SESSION SET CURRENT_SCHEMA=schema_name ;

・MS-SQLの場合
MSDN ユーザとスキーマの分離

既定のスキーマ
セキュリティ保護可能なリソースの名前が完全修飾されていない場合、SQL Server 2000 ではこれを解決するため名前解決が使用され、呼び出し側のデータベース ユーザーが所有するスキーマと dbo が所有するスキーマが照合されます。

SQL Server 2005 では、各ユーザーに既定のスキーマを割り当てることができます。既定のスキーマは、CREATE USER や ALTER USER の DEFAULT_SCHEMA オプションを使用して、設定および変更できます。DEFAULT_SCHEMA が定義されていない場合、SQL Server 2005 では dbo スキーマが既定のスキーマと見なされます。