示例:使用 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 行 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 "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';

schemaname

viewname

viewowner

定义

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 或 ArcSDE 客户端(如 ArcGIS Desktop)中运行良好。

授予视图权限

视图所有者可将视图权限授予特定用户,而无需授予这些用户对基表 (employees) 的访问权限。在本例中,将视图 view_dept_101 的 select 权限授予用户 mgr100:

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

testdb=> GRANT SELECT ON view_dept_101 TO mgr100;
注意注意:

在本例中,表所有者与视图所有者是同一位用户。如果不是同一位用户,表所有者需要授予视图所有者相应的权限,使其能够在表中进行选择并且还能将 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

像预期一样,只返回了 department 101 中的雇员记录。

视图以方案对象形式存在,与填充视图的表无关。在以下查询中,用户 mgr100 无权访问 gdb.employees 表;因此他无法查询该表。

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

3/7/2012