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

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

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

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

CREATE TABLE employees(
  emp_id integer not null, 
  name varchar(32), 
  department smallint not null, 
  hire_date timestamp without time zone 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:postgresql:mypgdbserver 
-s mypgdbserver -D testdb

Attribute        Administration Utility
__________________________________
Successfully created view view_dept_101.

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

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

SELECT schemaname,viewname,viewowner,definition
FROM pg_views
WHERE pg_views.viewname = 'view_dept_101';

スキーマ名

ビュー名

ビュー所有者

定義

gdb

view_dept_101

gdb

SELECT employees.emp_id,employees.name,employees.department,employees.hire_date FROM gdb.employees WHERE (employees.department = 101);

ビューの名前とビューの所有者は小文字で格納されることに注意してください。したがって、これらの特定のテキスト値を検索する場合は、小文字で入力する必要があります。

注意注意:

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

ビューの権限の付与

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

c:\work>psql testdb gdb
Enter password for gdb:

testdb=> GRANT SELECT ON view_dept_101 TO mgr100;
メモメモ:

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

権限のテスト

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

c:\work> psql testdb mgr100
 Enter password for mgr100:

testdb=> SELECT * FROM gdb.view_dept_101;

emp_id    name        dept    hire_date
29        YAN WU      101     2002-04-15 08:11:27
67        LEE VAN     101     2004-11-01 09:32:01
78        SUE CHOO    101     2005-05-31 08:26:05
105       DAN HO      101     2006-10-01 10:19:52
111       ANN ANG     101     2006-12-15 14:02:03
135       BILL BO     101     2007-10-15 07:57:30

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

ビューはそれらに設定されるテーブルにかかわらず、スキーマ オブジェクトとして存在します。次のクエリでは、ユーザ mgr100 はテーブル gdb.employees にアクセスできないため、このユーザはテーブルを検索できません。

testdb=> SELECT * FROM gdb.employees;
ERROR: permission denied for relation employees

3/6/2012