例:sdetable コマンドを使用して Oracle でデータベース ビューを作成する

難易度: 初級 データ要件 独自のデータを使用

sdetable コマンドを使用して、Oracle のジオデータベースにビューを作成することができます。この操作により、ビューは自動的に ArcSDE に登録されます。

このトピックの例では、特定のデータへのユーザ アクセスを制限するために sdetable コマンドを使用してビューを作成する方法を示します。例は次のように定義されたテーブルに基づいています。

CREATE TABLE employees (
  emp_id      number(38) unique not null,
  name        varchar2(32),
  department  number not null,
  hire_date   date not null);

テーブルには ArcSDE の RowID として使用できる、非 NULL の数値列が含まれている点に注目してください。

sdetable コマンドを使用したビューの作成

部署 101 の管理者に、employees テーブルで部署 101 の従業員の行についてのみ、すべての列を表示させたい場合を考えます。sdetable コマンドを使用して、部署番号が 101 のすべての行からなるビューを作成します。-w オプションは、ビューの定義に格納されるクエリの WHERE 句を指定します。

sdetable –o create_view –T view_dept_101 –t employees 
–c 'emp_id,name,department,hire_date' -w "where department = 101" 
–u gdb –p gdb.bdg –i sde:oracle11g:ora1 -s myodbserver

Attribute        Administration Utility
__________________________________
Successfully created view view_dept_101.
ヒントヒント:

sdetable コマンドの詳細については、『コマンド リファレンス』をご参照ください。

これにより、ALL_VIEWS にクエリを実行して、view_dept_101 の定義を確認できるようになります。

set lines 60
set pages 10000
set long 2000
column text format a60 wrapped;

SELECT view_name, text_length, text 
FROM all_views
WHERE owner = 'GDB' and view_name = 'VIEW_DEPT_101';

VIEW_NAME

TEXT_LENGTH

TEXT

VIEW_DEPT_101

112

SELECT "EMP_ID","NAME","DEPARTMENT","HIRE_DATE", 
FROM GDB.EMPLOYEES 
WHERE department = 101

この例では、クエリのテーブル名に所有者の名前が追加されています。SQL を使用してカスタム ビューを作成する場合、これは自動的に実行されません。

ビューとその所有者の名前は、ALL_VIEWS に格納される前に、大文字に変換されます。これは ArcSDE ではなく Oracle によって実行されています。したがって、これらのテキスト値を検索する場合には、大文字で入力する必要があります。

注意注意:

sdetable -o create_view コマンドを使用して登録済みのビューを作成した後、SQL を使用してビューの定義を変更することがあります。これは、複雑な sdetable -o create_view コマンド ライン構文(特に -c オプション)を避けるためか、外部データベースへの接続を使用するものなど、より複雑または拡張されたビュー定義を使用するためです。ビューを変更することで問題を解決できることもありますが、それにより ArcSDE や、ArcGIS Desktop などの ArcSDE クライアントにうまく対応しないビューが作成される可能性があります。

ビューに関する権限の付与

ビューの所有者は、ビューの権限を特定のユーザに付与することができます。また、これらのユーザにベース テーブル(employees)へのアクセスを許可する必要はありません。この例では、ユーザ mgr100 はビュー view_dept_101 の SELECT 権限を付与されています。

SQL> GRANT SELECT ON view_dept_101 TO mgr100;

Grant succeeded.
メモメモ:

この例では、テーブルの所有者とビューの所有者は同じユーザです。これらの所有者が異なるユーザである場合、テーブルの所有者はビューの所有者にテーブルの SELECT 権限と、他のユーザに SELECT 権限を付与する権限を与えます。SQL を使用して権限を付与する場合は、ステートメントに WITH GRANT OPTION を指定します。sdetable コマンドに grant 操作を指定して権限を付与する場合は、継承(-I)オプションを指定します。

権限のテスト

mgr100 としてログインし、view_dept_101 のレコードを選択します。

conn mgr100/mgr100
Connected.
SQL> SELECT * FROM gdb.view_dept_101;

EMP_ID   NAME       DEPT     HIRE_DATE 
29       YAN WU     101      04/15/2002 
67       LEE VAN    101      11/01/2004 
78       SUE CHO    101      05/31/2005 
105      DAN HO     101      10/01/2006 
111      ANN ANG    101      12/15/2006 
135      BILL BO    101      10/15/2007

期待どおり、部署 101 の従業員のレコードだけが返されます。

ビューはそれらに設定されるテーブルにかかわらず、スキーマ オブジェクトとして存在します。次のクエリでは、ユーザ mgr100 に employees テーブルにアクセスする権限がないため、employees テーブルが存在しないことを示すメッセージが返されています。

SQL> SELECT * FROM gdb.employees;
select * from gdb.employees
                  *
ERROR at line 1:
ORA-00942: table or view does not exist

3/6/2012