视图、序列和同义词是数据库中比较重要的模式对象概念,达梦数据库支持这些模式对象的管理。
12.1 管理视图
视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,它简化了用户数据模型,提供了逻辑数据独立性,实现了数据共享和数据的安全保密。视图是数据库技术中一个十分重要的功能。从系统实现的角度讲,视图是从一个或几个基表(或视图)导出的表,但它是一个虚表,即数据字典中只存放视图的定义(由视图名和查询语句组成),而不存放对应的数据,这些数据仍存放在原来的基表中。当对一个视图进行查询时,视图将查询其对应的基表,并且将所查询的结果以视图所规定的格式和次序进行返回。因此当基表中的数据发生变化时,从视图中查询出的数据也随之改变了。从用户的角度来讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据和变化。当用户所需的数据是一张表的部分列、或部分行,或者数据是分散在多个表中,那么就可以创建视图来将这些满足条件的行和列组织到一个表,而不需要修改表的属性、甚至创建新的表。这样不仅简化了用户的操作,还可以提高数据的逻辑独立性,实现数据的共享和保密。
例 为了防止非公司人员查询供应商的具体信息,包括 email、phone 等,这时可以建立视图,针对不用的用户建立查询供应商信息的视图
CREATE VIEW normal_view AS SELECT name FROM person;
CREATE VIEW special_view AS SELECT name, sex, email, phone FROM person;
然后把视图 normal_view 的权限授予普通用户,只允许他们查询供应商的姓名信息,把 special_view 视图的权限授予高级用户,允许他们查看供应商的 email、电话等信息,这样就较好地实现了供应商信息的安全与保密。
关于视图的定义、删除、查询和修改可以参考《DM8_SQL 语言使用手册》。
用户也可以对那些经常进行的查询建立相应视图,如果经常使用的查询语句较庞大,这样可以节省繁琐语句的书写。
由于视图没有直接相关的物理数据,所以不能被索引。
DM 提供了一些以"V$"开头的视图来供用户了解当前服务器的使用情况。这些视图的数据在服务器运行期间一直变化,并且数据反映的主要是系统的性能信息,因此它们被称为动态性能视图。用户对动态性能视图只能进行查询操作,动态视图的具体内容可参考附录 2。
12.2 管理序列
序列(sequence)是 DM 数据库中的数据库实体之一。通过使用序列,多个用户可以产生和使用一组不重复的有序整数值。比如可以用序列来自动地生成主关键字值。序列通过提供唯一数值的顺序表来简化程序设计工作。
当一个序列第一次被查询调用时,它将返回一个预定值,该预定值就是在创建序列时所指定的初始值。默认情况下,对于升序序列,序列的缺省初始值为序列的最小值,对于降序序列,缺省初始值为序列的最大值。可以指定序列能生成的最大值,默认情况下,降序序列的最大值缺省为-1,升序序列的最大值缺省为 2^63-1;也可以指定序列能生成的最小值,默认情况下,升序序列的最小值缺省为 1,降序序列的最小值缺省为-2^63。序列的最大值和最小值可以指定为 bigint(8 个字节)所能表示的最大和最小有符号整数。
在随后的每一次查询中,序列将产生一个按其指定的增量增长的值。增量可以是任意的正整数或负整数,但不能为 0。如果此值为负,序列是下降的,如果此值为正,序列是上升的。默认情况下,增加缺省为 1。
一旦序列生成,用户就可以在 SQL 语句中用以下伪列来存取序列的值:
- CURRVAL 返回当前的序列值;
- NEXTVAL 如果为升序序列,序列值增加并返回增加后的值;如果为降序序列,序列值减少并返回减少后的值。
序列可以是循环的,当序列的值达到最大值/最小值时,序列将从最小值/最大值计数。使用一个序列时,不保证将生成一串连续不断递增的值。例如,如果查询一个序列的下一个值供 insert 使用,则该查询是能使用这个序列值的唯一会话。如果未能提交事务处理,则序列值就不被插入表中,以后的 insert 将继续使用该序列随后的值。
序列在对编号的使用上具有很大用处,如果想对表建立一个列专门用来表示编号,如订单号,这样就可以使用序列,依次递增生成,用户不需进行特殊管理,这给用户带来了很大方便。如果用户需要间隔的编号,创建序列时指定 INCREMENT,就可以生成用户需要的编号。关于序列的具体使用,请参考《DM8_SQL 语言使用手册》。
12.3 管理同义词
同义词相当于模式对象的别名,起着连接数据库模式对象和应用程序的作用。假如模式对象需要更换或者修改,则不用修改应用程序而直接修改同义词就可以了。
同义词是用来实现下列用途的数据库对象:
- 为可以存在于本地或远程服务器上的其他数据库对象(称为基础对象)提供备用名称;
- 提供抽象层以免客户端应用程序对基础对象的名称或位置进行更改。
同义词的好处在于用户可能需要某些对象在不同的场合采用不用的名字,使其适合不同人群的应用环境。例如,创建表 product,如果客户不认识这个英文词,这时可以增加同义词,命名“产品”,这样客户就有较直观的观念,一目了然。
关于同义词的具体使用,请参考《DM8_SQL 语言使用手册》。
12.4 查看视图、序列和同义词信息
视图、序列以及同义词的定义信息可以通过查看系统表 SYSOBJECTS 和 SYSTEXTS 得到,如查看普通视图 view_1 的信息,可以执行:
SELECT b.* FROM SYS.SYSOBJECTS a, SYS.SYSTEXTS b WHERE a.ID = b.ID and a.NAME LIKE 'VIEW_1%';
可以得到:
ID SEQNO TXT
1 16778216 0 create view view_1 as select id from sysobjects;
2 16778216 1 SELECT ID FROM SYSOBJECTS
这样可以很明确知道 VIEW_1 视图的定义。
视图的定义信息也可以通过 SP_VIEWDEF 系统过程来查看。对于物化视图而言,其定义只有通过该系统函数才能完整地获取。
CALL SP_VIEWDEF('SYSDBA', 'VIEW1');