例:sdetable コマンドを使用した DB2 でのデータベース ビューの作成

sdetable コマンドを使用して、IBM DB2 のジオデータベースにビューを作成できます。作成したビューは自動的に ArcSDE に登録されます。

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

CREATE TABLE employees(emp_id integer not null, name varchar(32), 
department smallint 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 "department = 101" 
–u gdb –p gdb.bdg –i sde:db2 -s mydb2server -D testdb

Attribute        Administration Utility
__________________________________
Successfully created view view_dept_101.

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

sdetable コマンドは、DB2 のシステム カタログにビューを定義します。これは、DB2 の CREATE VIEW ステートメントを使用してビューを作成した場合と同じです。これを表示するには、DB2 の SYSCAT.VIEWS システム ビューを検索します。

db2 => SELECT viewschema, viewname, text 
FROM syscat.views 
WHERE viewname = 'VIEW_DEPT_101';

VIEWSCHEMA

VIEWNAME

TEXT

GDB

VIEW_DEPT_101

CREATE VIEW view_dept_101 
AS SELECT = emp_id, name, department, hire_date 
FROM GDB.EMPLOYEES 
WHERE department = 101

SYSCAT.VIEW の View_dept_101

ArcSDE は、クエリのテーブル名に所有者の名前を追加します。ビューの作成時にテーブル名を修飾しない限り、独自のビューを SQL(Structured Query Language)で作成する場合、名前の追加は自動的には行われません。

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

注意注意:

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

ビューの権限の付与

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

db2 => connect to testdb user gdb using gdb.dbg
   Database Connection Information
 Database server        = DB2 9.5.5
 SQL authorization ID   = GDB
 Local database alias   = TESTDB

db2 => GRANT SELECT ON view_dept_101 TO USER mgr100;
DB20000I  The SQL command completed successfully.
メモメモ:

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

権限のテスト

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

db2 => connect to testdb user mgr100 using mgr100
   Database Connection Information
 Database server        = DB2 9.5.5
 SQL authorization ID   = MGR100
 Local database alias   = TESTDB

db2 => 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 CHOO    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 テーブルが存在しないことを示すメッセージが返されています。

db2 => SELECT * FROM gdb.employees;
SQL0551N  "MGR100" does not have the privilege to perform operation "SELECT" 
on object "GDB.EMPLOYEES".  SQLSTATE=42501

3/6/2012