示例:使用 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 行 ID 的非空整型列。
使用 sdetable 命令创建视图
假设您想让 department 101 的管理者查看 employees 表中的所有列,但只查看 department 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 |
ArcSDE 在查询中将所有者名称添加到表名称中。如果使用结构化查询语言 (SQL) 创建自己的视图,此操作将不会自动进行,除非在创建视图时限定表名。
请注意,视图及其所有者的名称会转换为大写字母后再存储到 SYSCAT.VIEWS 中。此操作由 DB2 而非 ArcSDE 来执行。因此,在查询这些特定文本值时,必须以大写形式输入。
一些用户使用 sdetable –o create_view 创建注册视图并使用 SQL 更改视图定义。这样做是为了避免使 sdetable –o create_view 命令行语法(特别是 -c 选项)更复杂,也是为了包含更复杂或扩展的视图定义,例如使用到外部数据库的连接等。虽然更改视图可以解决一些问题,但是也有可能创建的视图不能在 ArcSDE 或 ArcSDE 客户端(如 ArcGIS Desktop)中运行良好。
授予视图权限
视图所有者可将视图权限授予特定用户,而无需授予这些用户对基表 (employees) 的访问权限。在本例中,将视图 view_dept_101 的 select 权限授予用户 mgr100:
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 权限授予其他用户。如果使用 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
像预期一样,只返回了 department 101 中的雇员记录。
视图以方案对象形式存在,与填充视图的表无关。在以下查询中,由于用户 mgr100 无权访问 employees 表,所以会向用户 mgr100 显示 employees 表不存在。
db2 => SELECT * FROM gdb.employees; SQL0551N "MGR100" does not have the privilege to perform operation "SELECT" on object "GDB.EMPLOYEES". SQLSTATE=42501