例:sdetable コマンドを使用して SQL Server でデータベース ビューを作成する
sdetable コマンドを使用して、Microsoft SQL Server のジオデータベースにビューを作成することができます。この操作により、ビューは自動的に ArcSDE に登録されます。
このトピックの例では、特定のデータへのユーザ アクセスを制限するために sdetable コマンドを使用してビューを作成する方法を示します。例は次のように定義されたテーブルに基づいています。
CREATE TABLE employees( emp_id integer not null, name nvarchar(32), department smallint not null, hire_date datetime2 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:sqlserver:server1\ssinstance2 -D testdb Attribute Administration Utility __________________________________ Successfully created view view_dept_101.
sdetable コマンドの詳細については、『コマンド リファレンス』をご参照ください。
sdetable コマンドは、SQL Server データベース 内のビューを定義します。SQL Server の INFORMATION_SCHEMA.VIEWS システム ビューを検索して、データベースの定義を確認することができます。
USE testdb; SELECT table_name,view_definition FROM information_schema.view_dept_101 WHERE table_name = 'view_dept_101';
TABLE_NAME | VIEW_DEFINITION |
---|---|
view_dept_101 | CREATE VIEW view_dept_101 AS SELECT emp_id,name,department,hire_date FROM employees WHERE department=101 |
sdetable -o create_view コマンドを使用して登録済みのビューを作成した後、SQL を使用してビューの定義を変更することがあります。これは、複雑な sdetable -o create_view コマンド ライン構文(特に -c オプション)を避けるためか、外部データベースへの接続を使用するものなど、より複雑または拡張されたビュー定義を使用するためです。ビューを変更することで問題を解決できることもありますが、それにより ArcSDE や、ArcGIS Desktop などの ArcSDE クライアントにうまく対応しないビューが作成される可能性があります。
ビューに関する権限の付与
ビューの所有者は、ビューの権限を特定のユーザに付与することができます。また、これらのユーザにベース テーブル(employees)へのアクセスを許可する必要はありません。この例では、ユーザ mgr100 はビュー view_dept_101 の SELECT 権限を付与されています。
GRANT SELECT ON view_dept_101 TO mgr100;
この例では、テーブルの所有者とビューの所有者は同じユーザです。これらの所有者が異なるユーザである場合、テーブルの所有者はビューの所有者にテーブルの SELECT 権限と、他のユーザに SELECT 権限を付与する権限を与えます。SQL を使用して権限を付与する場合は、ステートメントに WITH GRANT OPTION を指定します。sdetable コマンドに grant 操作を指定して権限を付与する場合は、継承(-I)オプションを指定します。
権限のテスト
mgr100 としてログインし、view_dept_101 のレコードを選択します。
EXECUTE AS USER = 'mgr100'; SELECT * FROM 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 テーブルが存在しないことを示すメッセージが返されています。
SELECT * FROM gdb.employees; Message 208, Level 16, State 1, Line 1 Invalid object name 'gdb.employees'