文章目录
五、DM系统管理员
"三权分立":数据库管理员、数据库安全员和数据库审计员
"四权分立":新增用户——数据库对象操作员
在DM数据库中有一个特殊的预定义用户"SYS",仅用于保存系统内部对象,并非数据库管理员,也无法进行登录
5.1 DM系统管理员的类型
数据库管理员(DBA)
- 评估数据库运行所需的软、硬件环境、安装和升级 DM 数据库、配置 DM 数据库参数、创建主要的数据库存储结构(表空间)和对象(如表、视图、索引、角色、用户等)、监控和优化数据库性能、数据导入导出以及数据库的备份和恢复等
- “三权分立”时数据库管理员既可进行系统管理和维护工作,也可对数据内容进行增删查改动作
- 根据国产数据库军事使用要求,数据库管理员只能进行系统管理和维护工作,不能对数据内容进行增删查改,数据库应用人员则可操作数据内容,而不能管理和维护系统
- “四权分立”的安全机制,在原有“三权分立”基础上调整自主访问控制权限,只具有“三权分立‘中DBA角色预设的一部分与数据库管理相关的明确的数据库权限,如数据库创建、备份、还原和校验等
数据库安全员(SSO)
- 主要任务就是制定安全策略,定义新的数据库安全员,设置系统的安全等级、范围和组,并为主、客体定义安全标记,从而全面提升系统安全性
数据库审计员(AUDITOR)
- 设置要审计的对象和操作、定义新的数据库审计员、查看和分析审计记录
- 通过设置审计,几乎可以跟踪任何人在系统内执行的任何操作,为事后追查提供便利。
数据库对象操作员(DBO)
- "四权分立"新增加的一类用户
- 可以创建数据库对象,并对自己拥有的数据库对象(表、视图、存储过程、序列、包、外部链接)具有所有的对象权限并可以授出与回收,但其无法管理与维护数据库对象
5.2 数据库管理员的任务
评估数据库服务器所需的软、硬件运行环境
- DBA的目标就是保证在负载和费用基本不变的情况下,实现系统总体性能的最优化。DBA主要考虑的因素包括:
- 操作系统/中间件等通用软件的稳定性、性能、安全性;
- 处理器的个数和性能;
- 内存容量和性能;
- 网络带宽;
- 存储容量和读写性能;
- HBA卡传输性能。
安装和升级 DM 服务器
- 负责安装DM数据库服务器软件
- 正确地安装服务包和安全更新是至关重要的任务,它影响到系统的稳定性、性能和安全,DBA需要清楚地了解服务包和安全更新对现有系统的影响,然后考虑是否进行升级
数据库结构设计
- 安装DM数据库之后,DBA 就可以开始进行数据库结构设计。数据库的结构设计直接影响系统的综合性能,是 DBA 最为重要的工作任务之一
- DBA 可以依次参考第 7 章来创建和配置 DM 数据库,参考第 8 章来启动和关闭数据库,参考第 16 章来实施计划好的数据库存储结构部署工作,参考第 9-15 章、第 18-21 章为每个对象规划数据库对象和存储特性的相关性的设计,通过在创建对象之前规划每个对象和它的物理存储之间的关系,可以直接影响数据库的性能
监控和优化数据库的性能
- 对系统进行监控有助于在问题发生时识别它们,性能优化则有助于消除那些问题并防止它们发生
- 监视长时间运行的查询有助于发现可以改进的领域,如增加索引、重写查询、改进应用程序逻辑等,还可以发现由于缺少内存/内存分配不合理而导致的性能降低,以便调整 DM 数据库的内存使用参数,或为服务器增加更多的内存
计划和实施备份与故障恢复 - DM 数据库提供了最基本的故障恢复、备份与还原功能,另外还提供了数据守护、数据复制、共享存储集群等高可靠、高可用解决方案
5.3 数据库安全员的任务
制定并应用安全策略,强化系统安全机制
- 数据库安全员SYSSSO是DM数据库初始化的时候就已经创建好的,可以以该用户登录到 DM 数据库来创建新的数据库安全员
- SYSSSO或者新的数据库安全员都可以制定自己的安全策略,在安全策略中定义安全级别、范围和组,然后基于定义的安全级别、范围和组来创建安全标记,并将安全标记分别应用到主体(用户)和客体(表),以便启用强制访问控制功能
- 数据库安全员只负责制定安全机制,将合适的安全标记应用到主体和客体,通过这种方式可以有效的对 DBA 的权限进行限制
5.4 数据库审计员的任务
- 在 DM 数据库中还可以在系统建设初期,由数据库审计员(SYSAUDITOR或者其他由SYSAUDITOR创建的审计员)来设置审计策略(包括审计对象和操作),在需要时,数据库审计员可以查看审计记录,及时分析并查找出幕后真凶;
- 审计员的主要职责就是创建和删除数据库审计员,设置/取消对数据库对象和操作的审计设置,查看和分析审计记录等
六、创建和配置DM数据库
可以通过查询V$DM_INI动态视图查看建库参数的具体信息
6.1 创建DM数据库
- 创建数据库前需要规划数据库,如数据库名、实例名、端口、文件路径、簇大小、页大小、日志文件大小、SYSDBA和SYSAUDITOR等系统用户的密码等,然后可以使用图形化界面或者 dminit 创建数据库。用户可以在安装 DM 数据库软件时创建数据库,也可以在安装之后创建数据库
- 在创建数据库之前需要做如下准备工作:
- 规划数据库表和索引,并估算它们所需的空间大小;
- 确定字符集。所有字符集数据,包括数据字典中的数据,都存储在数据库字符集中,用户创建数据库时可指定数据库字符集,否则使用默认字符集GB18030;
- 规划数据库文件的存储路径,可以指定数据库存储路径、控制文件存放路径、日志文件存放路径等(尽量不要包含中文字符);
- 配置数据库时区,如中国是+8:00 时区;
- 设置数据库簇大小、页大小、日志文件大小,在数据库创建时由
EXTENT_SIZE
、PAGE_SIZE
、LOG_SIZE
初始化参数来指定,并且在数据库创建完成之后不修改此参数。
- 创建数据库之前,必须满足以下必要条件:
- 安装必需的DM软件,包括为操作系统设置各种环境变量,并为软件和数据库文件建立目录结构;
- 必须有足够的内存来启动 DM 数据库实例;
- 足够的磁盘存储空间来容纳规划的数据
6.2 使用数据库配置工具创建数据库
控制文件
- 控制文件中的控制信息一般在系统第一次创建完毕后就不能随意更改,所以控制文件不是一个文本文件,而是一个二进制文件;
- 一旦被破坏或丢失仍就无法手工重新创建,基于这一点,对控制文件的保护尤为重要;
- 整个系统中只有一个控制文件,其中存储的控制信息包括主要数据文件路径、日志文件路径、LSN信息等;
- 由于控制文件对系统至关重要,如果控制文件损坏,系统将无法启动,因此,DM允许在创建数据库时指定多个控制文件的镜像。这些控制文件的内容是一模一样的,系统每次写控制文件时会顺序对它们进行修改;
- 如果系统在写某一个控制文件时发生硬件故障导致该文件损坏,可以通过其他的控制文件来恢复这个损坏的控制文件,之后重新启动数据库;
数据文件
- “数据文件”选项卡用来指定 SYSTEM 表空间路径、MAIN 表空间路径、ROLL 表空间路径和 TEMP 表空间路径;
- 同时还可以指定 SYSTEM 表空间镜像、MAIN 表空间镜像、ROLL 表空间镜像路径,三个镜像文件是分别和 SYSTEM 表空间、MAIN 表空间、ROLL 表空间一模一样的文件,当 SYSTEM 表空间、MAIN 表空间、ROLL 表空间文件损坏时,就可以使用相应的镜像文件来替换
- 数据文件对空间的标识都以簇为单位,每个数据文件都维护着两条链,一条为半空簇的链,另一条为自由簇的链,
- 半空链用于标识文件中所有被用过一部分的簇
- 自由链则标识文件中所有未被用过的簇
日志文件
- 重做日志文件用于存储数据库的事务日志,以便系统在出现系统故障和介质故障时能够进行故障恢复;
- DM Server中任何修改数据库的操作都会产生重做日志,当系统出现故障时,通过分析日志可以知道在故障发生前系统做了哪些动作,并可以重做这些动作使系统恢复到故障之前的状态
初始化日志
- 初始化日志用来指定初始化过程中生成的日志文件所在路径。
6.4 注册数据库服务
该功能用于将使用命令行工具生成的数据库,重新注册成系统服务,方便用户管理与控制。
6.6 删除数据库
- 停止实例
- 删除实例
- 删除数据库
6.7删除数据库服务
- 只删除用于启动和停止数据库的服务文件,不会删除数据库的数据文件、日志文件、控制文件和初始化参数文件
七、启动和关闭数据库
7.1启动数据
Windows命令行(记住要以管理员身份运行cmd):
cd xxx\dmdbms\bin
dmserver.exe xxx\dmdbms\xxx\dameng\dm.ini
参数:dmserver.exe [[path=]ini_file_path][dcr_ini=dcr_path][-noconsole]
[mount][dpc_mode=mode][upd_lic=value]
ini_file_path:dm.ini 绝对路径。缺省为 dmserver 当前目录的 dm.ini;
dcr_ini:如果使用 css 集群环境,指定 dmdcr.ini 文件路径;
-noconsole:以服务方式启动。如果以此方式启动,则无法通过在控制台中输入服务
器命令;
mount:以 MOUNT 配置状态启动
dpc_mode:指定 DPC 中的实例角色,缺省为 0。0:无、1:MP、2:BP、3:SP,取
值 1/2/3 时也可以用 MP/BP/SP 代替;
upd_lic:是否升级服务器安全版本信息。0 否、1 是。缺省为 0(专用于将非安全版的系统升级为安全版的特殊场景中使用)
help:打印帮助信息。
Linux服务方式
在/etc/rc.d/init.d中有全名为DmService+实例名的文件,以 实 例 名 为DMSERVER 为 例 , 在 终 端 输入./DmServiceDMSERVER start
或者service DmServiceDMSERVER start
即可启动DM数据库
Linux命令行方式
bin目录下:
./dmsever 参数(同Windows)
检查LICENSE
- 无论何种操作系统,DM数据库在启动时都会进行LICENSE检查
- 若LICENSE 过期或安全版环境中KEY文件与实际运行环境不配套,DM 服务器会强制退出
- 当服务器以UPD_LIC参数启动服务器,如果之前是非安全版的环境,当前的 KEY 是安全版的 KEY,服务器将会从非安全版环境升级为安全版
- 可通过查看
V$LICENSE
了解所安装的 DM 数据库的 LICENSE 信息
7.2 数据库状态和模式
- DM数据库包含以下几种状态:
1. 配置状态(MOUNT):不允许访问数据库对象,只能进行控制文件维护、归档配置、数据库模式修改等操作;
2. 打开状态(OPEN):不能进行控制文件维护、归档配置等操作,可以访问数据库对象,对外提供正常的数据库服务;
3. 挂起状态(SUSPEND):与 OPEN 状态的唯一区别就是,限制磁盘写入功能;一旦修改了数据页,触发 REDO 日志、数据页刷盘,当前用户将被挂起。 - OPEN 状态与 MOUNT 和 SUSPEND 能相互转换,但是 MOUNT 和 SUSPEND 之间不能相互转换;
- DM 数据库包含以下几种模式:
1. 普通模式(NORMAL):用户可以正常访问数据库,操作没有限制;
2. 主库模式(PRIMARY):用户可以正常访问数据库,所有对数据库对象的修改强制生成 REDO 日志,在归档有效时,发送 REDO 日志到备库;
3. 备库模式(STANDBY):接收主库发送过来的 REDO 日志并重做。数据对用户只读 - 三种模式只能在MOUNT状态下设置,模式之间可以相互转换;
- 对于新初始化的库,首次启动不允许使用mount方式,需要先正常启动并正常退出,然后才允许mount方式启动;
- 一般情况数据库为NORMAL模式,如不指定MOUNT状态启动,则自动启动到OPEN状态;
- 在需要对数据库配置时(如配置数据守护、数据复制),服务器需要指定 MOUNT 状态启动;
- 当数据库模式为非 NORMAL 模式(PRIMARY、STANDBY 模式),无论是否指定启动状态,服务器启动时自动启动到 MOUNT 状态。
7.3关闭数据库
Linux服务方式
- 进入
/etc/rc.d/init.d
,以实例名为DMSERVER为例,在命令行工具中输入./DmServiceDMSERVER stop
即可关闭DM数据库
八、管理模式对象的空间
模式对象的空间管理关系到空间的有效使用和数据的合理分布
8.1设置存储参数
8.1.1 普通表和索引
- 初始簇数目INITIAL:指建表时分配的簇个数,(1~256的整数),缺省为 1;
- 下次分配簇数目NEXT:指表空间不够时,从数据文件中分配的簇个数,(1~256的整数),缺省为 1;
- 最小保留簇数目MINEXTENTS:删除表中的记录后,如果表使用的簇数目小于这
个值,就不再释放表空间,(1~256的整数),缺省为 1; - 填充比例FILLFACTOR:指定插入数据时数据页的充满程度。0 ~100,默认 0,等价于 100,表示全满填充,未充满空间可供页内的数据更新时使用。插入数据时填充比例的值越低,可由新数据使用的空间就越多;更新数据时填充比例的值越大,更新导致出现的页分裂的几率越大;
- 表空间名:在指定的表空间上建表或索引,表空间必须已存在,默认为用户缺省的表空间。
8.1.2 堆表
对于堆表可以指定并发分支BRANCH和非并发分支NOBRANCH的数目,其范围是(1=<BRANCH <= 64,1<=NOBRANCH<=64),堆表最多支持 128 个链表
8.1.3 HUGE表
- HUGE表需要建立在混合表空间上,建立HUGE表如果不使用默认的混合表空间MAIN,则必须要先创建一个混合表空间
- 参数:
- 区大小(数据行数):区大小可以通过设置表的存储属性来指定,区的大小必须是 2^n,如果不是则向上对齐。(1024 行~1024*1024,65536);
- 是否记录区统计信息,即在修改时是否做数据的统计;
- 所属的表空间:创建 HUGE 表,需要通过存储属性指定其所在的表空间,不指定则存储于默认表空间 MAIN 中;
- 文件大小:创建 HUGE 表时还可以指定单个文件的大小,通过表的存储属性来指定(16M~1024*1024M, 64M,必须是 2 ^n,不是则向上对齐);
- 日志属性:1)LOG NONE:不做镜像;2)LOG LAST:做部分镜像;3)LOG ALL:全部做镜像。
8.2 收回多余的空间
DM8中表和索引对象的所占用的簇要么是全满的状态要么是半满的状态,空闲的簇会被系统自动回收
8.3 用户和表上的空间限制
8.3.1 用户的空间限制
- 用户占用的空间是其下所有用户表对象占用空间的总和
- 可以限制用户使用空间的大小,当用户创建表,创建索引,或者插入更新数据超过了指定的空间限制时,会报空间不足的错误。
8.3.2 表对象的空间限制
- 表对象占用的空间是其上所有索引占用空间的总和
- 可以限制表对象使用空间的大小,当在表对象上创建索引或者插入更新数据超过了指定的空间限制时,会报空间不足的错误
8.4查看模式对象的空间使用
8.4.1 查看用户占用的空间
系统函数USER_USED_SPACE:用户占用空间的大小,函数参数为用户名,返回值为占用的页的数目
SELECT USER_USED_SPACE('TEST_USER');
实操:
8.4.2 查看表占用的空间
系统函数TABLE_USED_SPACE:表对象占用空间的大小,函数参数为模式名和表名,返回值为占用的页的数目
SELECT TABLE_USED_SPACE('SYSDBA', 'TEST');
实操:
8.4.3 查看表使用的页数
可以使用系统函数 TABLE_USED_PAGES 得到表对象实际使用页的数目,函数参数为模
式名和表名,返回值为实际使用页的数目。
SELECT TABLE_USED_PAGES('SYSDBA', 'TEST');
实操:
8.4.4 查看索引占用的空间
系统函数INDEX_USED_SPACE:索引占用空间的大小,函数参数为索引
ID,返回值为占用的页的数目。
SELECT INDEX_USED_SPACE(33555463);
实操:
8.4.5 查看索引使用的页数
系统函数 INDEX_USED_PAGES:索引实际使用页的数目,函数参数为索引
ID,返回值为实际使用页的数目。
SELECT INDEX_USED_PAGES(33555463);
实操:
8.5数据类型的空间使用
九、管理表
- 列的特性由两部分组成:数据类型(dataType)和长度(length);
- 为了确保数据库中数据的一致性和完整性,在创建表时可以定义表的实体完整性、域完整性和参考完整性;
- 实体完整性定义表中的所有行能唯一地标识,一般用主键、唯一索引、UNIQUE关键字及IDENTITY属性来定义;
- 域完整性通常指数据的有效性,限制数据类型、缺省值、规则、约束、是否可以为空等条件,域完整性可以确保不会输入无效的值;
- 参考完整性维护表间数据的有效性、完整性,通常通过建立外键联系另一表的主键来实现。
- 基表修改语句:可对基表的结构进行全面的修改,包括修改基表名、列名、增加列、删除列、修改列类型、增加表级约束、删除表级约束、设置列缺省值、设置触发器状态等一系列修改功能。
9.1 管理表的准则
9.1.1 设计表
要求:
- 规范化表,估算并校正表结构,使数据冗余达到最小;
- 为每个列选择合适的数据类型,是否允许为空等,并根据实际情况判断是否需要对列进行加密或压缩处理;
- 建立合适的完整性约束;
- 建立合适的聚集索引。每个表(列存储表,堆表除外)都含一个聚集索引,默认以ROWID建立,而建立合适的聚集索引,可以有效加快表的检索效率;
- 根据需要,建立合适类型的表。DM支持的表类型包括普通表、临时表、水平分区表、堆表和列存储表
9.1.2 指定表的存储空间上限
- 在创建表时指定SPACE LIMIT子句,可以对表的存储空间指定上限。
- DM 支持对表的存储空间指定大小,单位是MB,即表的大小可由管理员指定,便于表的规模管理。
- 当表的所有索引所占用的存储空间超过指定大小时,表将不能再新增数据。
9.1.3 指定表的存储位置
- 创建表时,在STORAGE子句中,可对表指定存储的表空间。如果没有指定,则该表将创建在用户的默认表空间中。
- 在创建表时,通过指定合适的表空间,有以下优点:
- 提高数据库系统的性能,因为不同的数据库表可能对应不同的数据文件,可减少对相同文件的竞争;
- 减少数据库管理的时间,数据库表分布在不同的表空间中,即使一个表空间损坏,也不影响其他表空间上数据库表的正常访问。
9.2 创建表
9.2.1 创建普通表
9.2.2 指定表的聚集索引
- 表(列存储表和堆表除外)都是使用 B 树索引结构管理的,每一个普通表都有一个聚集索引,数据通过聚集索引键排序,根据聚集索引键可以快速查询任何记录;
- 当建表语句未指定聚集索引键,DM的默认聚集索引键是ROWID,即记录默认以ROWID在页面中排序。ROWID是B树为记录生成的逻辑递增序号,表上不同记录的ROWID是不一样的,并且最新插入的记录 ROWID 最大
- DM提供三种方式供用户指定聚集索引键:
- CLUSTER PRIMARY KEY:指定列为聚集索引键,并同时指定为主键,称为聚集主键;
- CLUSTER KEY:指定列为聚集索引键,但是是非唯一的;
- CLUSTER UNIQUE KEY:指定列为聚集索引键,并且是唯一的。
- 指定聚集索引键后,如果查询条件中含有聚集索引键,可以定位记录在 B 树上的位置,使查询性能大大提高
- 插入记录也需要根据聚集索引键定位插入位置,有可能导致页面的分裂而影响插入性能
- 在 dm.ini配置文件中,可以通过指定PK_WITH_CLUSTER使表中的主键自动转化为聚集主键
- PK_WITH_CLUSTER对水平分区表、列存储表和堆表无效
9.2.3 指定表的填充因子
- 指定表的填充因子,即指定聚集索引的填充因子。索引的填充因子指在新建和重组索引时,页面记录存储空间占页面总大小的百分比。预留空间是为更新字段时使用的,一个有效的填充因子可以大大减少由更新记录导致的页面拆分
- 填充因子取值低,则需要更多的页来存储数据,因而读取范围大,会影响性能;
- 填充因子取值高,则在更新数据时可能造成大量的页拆分,页拆分需要消耗较多CPU和 I/O资源,同样会影响性能
- 原则上,在只读表上应该设置填充因子高,而有大量更新的表上应该设置较低的值
- 默认DM新建的表和索引的填充因子是100,可根据实际情况设置合适的填充因子大小
9.2.4 查询建表
- 为了创建一个与已有表相同的新表,或者为了创建一个只包含另一个表的一些行和列的新表,可以使用
CREATE TABLE AS SELECT(CTAS)
命令。使用该命令,可以通过使用 WHERE条件将已有表中的一部分数据装载到一个新表中,或者可以通过 SELECT * FROM 子句将已有表的所有数据装载到创建的表中
- 如果用户通过单表的全表查询进行建表操作,则可以通过将INI参数CTAB_SEL_WITH_CONS置为1进行原始表上约束的拷贝,列上能拷贝的约束包括默认值属性、自增属性、非空属性以及加密属性,表上能拷贝的约束包括唯一约束、PK约束以及CHECK约束。
- 也可将CTAB_SEL_WITH_CONS置为2进行原始表上表结构、分区信息、存储信息以及表约束的拷贝(仅限huge表与huge表之间或行表与行表之间进行拷贝),其中表约束包括唯一约束、PK 约束以及 CHECK 约束。
9.2.5 创建临时表
- 暂时存储一些行信息或需要保存查询的中间结果,可能需要一些表来临时存储这些数据。DM 允许创建临时表来保存会话甚至事务中的数据。在会话或事务结束时,这些表上的数据将会被自动清除。
- 临时表中的数据不能像在其它永久表中的数据那样进行备份,当事务结束或会话断开时,数据就会被清空。
- 在临时表创建过程中,不会像永久表和索引那样自动分配数据段,而是仅当第一次执行DML语句时,才会为临时表在临时表空间中分配空间
- 对不同会话,临时表上的数据是独享的,不会互相干扰,即会话A不能访问会话 B 临时表上的数据
- 对复杂查询的传统响应方式之一是使用一个视图,使复杂查询更易于操作。但是,视图在每次访问时都需要执行,因而大大降低了性能。而通过 AS SELECT 子句建立的临时表是将复杂查询的结果通过临时 B 树记录了下来,下次访问不用重新执行查询就可以获得数据,并且会话或事务结束后数据将自动删除,是复杂查询的一个优秀的解决方案,且提高了性能。
- DM临时表支持以下功能:
- 在临时表中,会话可以像普通永久表一样更新、插入和删除数据;
- 临时表的DML操作产生较少的REDO日志;
- 临时表支持建索引,以提高查询性能;
- 在一个会话或事务结束后,数据将自动从临时表中删除;
- 不同用户可以访问相同的临时表,每个用户只能看到自己的数据;
- 临时表的数据量很少,意味着更高效的查询效率;
- 临时表的表结构在数据删除后仍然存在,便于以后的使用;
- 临时表的权限管理跟普通表一致。
- 临时表ON COMMIT关键词指定表中的数据是事务级还是会话级的,默认情况下是事务级的。
- ON COMMIT DELETE ROWS:指定临时表是事务级的,每次事务提交或回滚之后,表中所有数据都被删除;
- ON COMMIT PRESERVE ROWS:指定临时表是会话级的,会话结束时才清空表,并释放临时 B 树。
9.3 更改表
- 想更改的表如果在所属的模式中,用户必须具有ALTER TABLE数据库权限;若在其他模式中,用户必须有ALTER ANY TABLE的数据库权限
- 通过更改表,用户可以对数据库中的表作如下修改:
- 添加或删除列,或修改现有的列的定义(列名、数据类型、长度、默认值);
- 添加、修改或删除与表相关的完整性约束;
- 重命名一个表;
- 启动或停用与表相关的完整性约束;
- 启动或停用与表相关的触发器;
- 修改表的SPACE LIMIT;
- 增删自增列。
- 其中,对于添加列,当设置INI参数
ALTER_TABLE_OPT
为1时,添加列采用查询插入实现,可能会导致ROWID的改变;ALTER_TABLE_OPT
为 2 时,系统开启快速加列功能,对于没有默认值或者默认值为NULL的新列,系统内部会标记为附加列,能够达到瞬间加列的效果,此时记录ROWID不会改变,若有默认值且默认值不为NULL,则默认值的存储长度不能超过4000字节,此时仍旧采取查询插入实现;ALTER_TABLE_OPT
为 3 时,系统会开启快速加列功能,允许指定新增列的默认值,系统会为该列设置附加列标记,查询表中已存在的数据时,会自动为记录设置追加列默认值,此时记录 ROWID 不会改变;
9.4 删除表
删除表时,将产生以下结果:
- 表的结构信息从数据字典中删除,表中的数据不可访问;
- 表上的所有索引和触发器被一起清除;
- 所有建立在该表上的同义词、视图和存储过程变为无效;
- 所有分配给表的簇标记为空闲,可被分配给其他的数据库对象。
一般情况下,普通用户只能删除自己模式下的表。若要删除其他模式下的表,则必须具有DROP ANY TABLE
数据库权限。
以下语句可删除employee表:
DROP TABLE employee;
删除不存在的表会报错。若指定IF EXISTS关键字,删除不存在的表,不会报错,如:
DROP TABLE IF EXISTS employee;
如果要删除的表被其他表引用,即其他表的外键引用了表的任何主键或唯一键,则需要在DROP TABLE语句中包含CASCADE选项,如:
DROP TABLE employee CASCADE;
9.5 清空表
有些情况下,当表的数据不再使用时,需要删除表的所有行,即清空该表。DM8 支持以
下方式来删除表中的所有的行:
- 使用 DELETE 语句;
DELETE FROM employee;
- 使用 DROP 和 CREATE 语句;
DROP TABLE employee; CREATE TABLE employee(…);
- 使用 TRUNCATE 语句
TRUNCATE TABLE EMPLOYEE;
- TRUNCATE是一个DDL语句,不会产生任何回滚信息,执行TRUNCATE会立即提交,而且不能回滚
- TRUNCATE 语句并不影响与被删除的表相关联的任何结构、约束、触发器或者授权
- DM数据库TRUNCATE表后,原来分配给该表的空间会被释放,供其他数据库对象使用,大大提高空间的利用效率
- 如果要清空的表被其他表引用,即其他表的外键引用了表的任何主键或唯一键,并且子表不为空或子表的外键约束未被禁用,则不能TRUNCATE该表
9.6 查看表信息
9.6.1 查看表定义
- 创建表后,可以通过
SP_TABLEDEF
系统过程查看表的定义 - DM 通过提供的TABLEDEF函数来显示当前表的定义
- 当表多次进行ALTER TABLE后,显示的表定义将是最后一次修改后的建表语句
9.6.2 查看自增列信息
- DM支持INT和BIGINT两种数据类型的自增列,并提供以下函数查看表上自增列的当前值、种子和增量等信息:
- IDENT_CURRENT:获得表上自增列的当前值;
- IDENT_SEED:获得表上自增列的种子信息;
- IDENT_INCR:获得表上自增列的增量信息。
9.6.3 查看表的空间使用情况
- DM使用段、簇和页实现数据的物理组织。DM支持查看表的空间使用情况,包括:
- TABLE_USED_SPACE:已分配给表的页面数;
- TABLE_USED_PAGES:表已使用的页面数。
十、管理索引
索引是为了快速检索和定位数据行而创建的一种数据结构
- 索引是由表中索引列数据进行排序后的集合和指向这些值的物理标识(例如:ROWID等聚集索引键)共同组成
- 在DM中,除了位图索引、位图连接索引、全文索引和空间索引外,索引数据都采用B+树结构进行存储,索引和表一样需要存储空间
- 索引相当于一本书的目录,根据目录中的页码标识快速检索并定位到的查找内容
- 索引可使SQL语句快速地定位到相关数据记录上。除了系统自动创建的聚集索引以外,其它索引均为可选项
- 创建或删除一个索引,不会影响基表、数据库应用或其它索引。
- 当插入、更改和删除相关表的行时,DM8 会自动管理索引。如果删除索引,所有的应用仍继续工作,但访问以前被索引了的数据时速度可能会变慢
10.1 索引分类
10.1.1 聚集索引和非聚集索引(物理角度)
- 聚集索引(又称为一级索引、主索引):按照聚集索引键构造一棵B树,表数据存储在B树叶子节点上,通过定位索引可直接在B树中找到数据。每一个表有且只有一个聚集索引
- 非聚集索引(又称为二级索引、辅助索引):将二级索引列和聚集索引列共同存储在 B 树叶子节点上。如果查找非聚集索引键值或聚集索引键值可直接在 B 树中找到;如果查找索引键值以外的数据,则需要回到一级索引中进行查找。每一个表可以有多个非聚集索引
10.1.2 功能索引(功能角度)
- 唯一索引:索引数据根据索引键唯一;
- 函数索引:包含函数/表达式的预先计算的值;
- 位图索引:对低基数的列创建位图索引;
- 位图连接索引:针对两个或者多个表连接的位图索引,主要用于数据仓库中;
- 全文索引:在表的文本列上而建的索引;
- 空间索引:在空间数据上创建的索引,专用于DMGEO包中;
- 数组索引:在一个只包含单个数组成员的对象列上创建的索引;
- 普通索引:除了以上索引以外的索引,均为普通索引。
10.1.3 虚索引和实索引(虚实角度)
- 虚索引:创建PRIMARY KEY主键约束或UNIQUE唯一约束时,系统会自动创建一个相关的唯一索引。因为不需要用户创建,因此称为虚索引
- 实索引:虚索引以外的索引均为实索引
10.1.5 单列索引和复合索引(索引键值的个数)
- 单列索引:只有一个索引键的索引
- 复合索引:含有多个索引键的索引
10.1.5 全局索引和局部索引(分区角度)
- 全局索引和局部索引均为二级索引,专门用于水平分区表中
- 当分区子表个数较多、索引列的选择率较好、没有使用分区裁剪优化等因素时,执行计划会倾向于使用全局索引进行查询。但由于全局索引的日常维护成本高于局部索引。因此用户可根据实际应用场景权衡利弊之后再在全局索引和局部索引中进行选择。
- 全局索引:全局索引是以整张表的数据为对象而建立的索引。指定GLOBAL关键字创建的索引即为全局索引。
- 局部索引:局部索引是在分区表的每个分区上创建的索引。未指定 GLOBAL 关键字创建的索引即为局部索引。
10.2 管理索引的准则
- 在表中插入数据后创建索引,效率更高,减少每次插入行时更改维护索引
- 使用下面的准则来决定何时创建索引:
- 如果需要经常地检索大表中的少量的行,就为查询键创建索引;
- 为了改善多个表的连接的性能,可为连接列创建索引;
- 主键和唯一键自动具有索引,在外键上很多情况下也创建索引;
- 小表不需要索引。
- 选取表中的索引列时可以考虑以下几点:
- 列中的值相对比较唯一 ;
- 取值范围大,适合建立索引;
- CLOB和TEXT只能建立全文索引、BLOB不能建立任何索引。
- 在CREATE INDEX语句中列的排序会影响查询的性能。通常,将最常用的列放在最前面
- 如果查询中有多个字段组合定位,则不应为每个字段单独创建索引,而应该创建一个组合索引
- 一个表可以有任意数量的索引。但索引越多,修改表数据开销越大。如果一个表主要仅用于读,则索引多就有好处;如果一个表经常被更新,则索引不宜多建
- 创建索引之前先估计索引的大小能更好地促进规划和管理磁盘空间
- 为每个索引指定表空间:可以在除临时表空间、日志表空间和回滚段表空间外的其他任何表空间中创建索引,也可以在其索引的表的相同或不同的表空间中创建索引
10.3 创建索引
要在用户自己的模式中创建索引,至少要满足如下条件之一:
1. 要被索引的表是在自己的模式中 ;
2. 在要被索引的表上有CREATE INDEX权限;
3. 具有CREATE ANY INDEX数据库权限。
要在其他模式中创建索引,用户必须具有 CREATE ANY INDEX 数据库权限。
10.3.1 显式地创建索引
用 CREATE INDEX 语句显式地创建索引
10.3.1.1 创建聚集索引
- 当建表语句未指定聚集索引键时,DM8的默认聚集索引键是ROWID。若指定索引键,表中数据都会根据指定索引键排序
- 建表后,DM8 也可以用创建新聚集索引的方式来重建表数据,并按新的聚集索引排序
- 新建聚集索引会重建这个表以及其所有索引,包括二级索引、函数索引,是一个代价非常大的操作。因此,最好在建表时就确定聚集索引键,或在表中数据比较少时新建聚集索引,而尽量不要对数据量非常大的表建立聚集索引。
- 创建聚集索引的约束条件:
- 每张表中只允许有一个聚集索引,如果之前已经指定过CLUSTER INDEX或者指定了CLUSTER PK,则用户新建立CLUSTER INDEX时系统会自动删除原先的聚集索引。但如果新建聚集索引时指定的创建方式(列,顺序)和之前的聚集索引一样,则会报错;
- 指定CLUSTER INDEX操作需要重建表上的所有索引,包括PK索引;
- 删除聚集索引时,缺省以ROWID排序,自动重建所有索引;
- 若聚集索引是默认的ROWID索引,不允许删除;
- 聚集索引不能应用到函数索引中;
- 不能在列存储表上新建/删除聚集索引;
- 建聚集索引语句不能含有partition_clause子句;
- 在临时表上增删索引会使当前会话上临时b树数据丢失。
10.3.1.2 创建唯一索引
- 索引可以是唯一的或非唯一的。唯一索引可以保证表上不会有两行数据在键列上具有相同的值,非唯一索引不会在键列上施加这个限制
- 可用
CREATE UNIQUE INDEX
语句来创建唯一索引 - 用户可以在希望的列上定义UNIQUE完整性约束,DM8 通过自动地在唯一键上定义一个唯一索引来保证UNIQUE完整性约束
10.3.1.3 创建基于函数的索引
- 基于函数的索引促进了限定函数或表达式的返回值的查询,该函数或表达式的值被预先计算出来并存储在索引中。正确使用函数索引,可以带来以下好处:
- 创建更强有力的分类,例如可以用 UPPER 和 LOWER 函数执行区分大小写的分类;
- 预先计算出计算密集的函数的值,并在索引中将其分类。可以在索引中存储要经常访问的计算密集的函数,当需要访问值时,该值已经计算出来了。因此,极大地改善了查询的执行性能;
- 增加了优化器执行范围扫描而不是全表扫描的情况的数量。
- 创建函数索引有以下约束条件:
- 表达式可以由多列组成,不同的列不能超过 63 个;
- 表达式不允许为时间间隔类型;
- 表达式中不允许出现半透明加密列;
- 函数索引表达式的长度理论值不能超过 816 个字符(包括生成后的指令和字符串);
- 函数索引不能为 CLUSTER 或 PRIMARY KEY 类型;
- 表达式不支持集函数和不确定函数,不确定函数为每次执行得到的结果不确定,系统中不确定函数包括:RAND、SOUNDEX、CURDATE、CURTIME、CURRENT_DATE、CURRENT_TIME 、 CURRENT_TIMESTAMP 、 GETDATE 、 NOW 、 SYSDATE 、CUR_DATABASE、DBID、EXTENT、PAGE、SESSID、UID、USER、VSIZE、SET_TABLE_OPTION、SET_INDEX_OPTION、UNLOCK_LOGIN、CHECK_LOGIN、GET_AUDIT 、CFALGORITHMSENCRYPT 、 SF_MAC_LABEL_TO_CHAR 、CFALGORITHMSDECRYPT 、 BFALGORITHMSENCRYPT 、SF_MAC_LABEL_FROM_CHAR、BFALGORITHMSDECRYPT、SF_MAC_LABEL_CMP;
- 快速装载不支持含有函数索引的表;
- 若函数索引中要使用用户自定义的函数,则函数必须是指定了DETERMINISTIC属性的确定性函数;
- 若函数索引中使用的确定性函数发生了变更或删除,用户需手动重建函数索引;
- 若函数索引中使用的确定性函数内有不确定因素,会导致前后计算结果不同的情况。在查询使用函数索引时,使用数据插入函数索引时的计算结果为 KEY 值;修改时可能会导致在使用函数索引过程中出现根据聚集索引无法在函数索引中找到相应记录的情况,对此进行报错处理;
- 临时表不支持函数索引。
10.3.1.4 创建位图索引
- 位图索引主要针对含有大量相同值的列而创建。位图索引被广泛引用到数据仓库中,创建方式和普通索引一致,对低基数(不同的值很少)的列创建位图索引,能够有效提高基于该列的查询效率。且执行查询语句的 where 子句中带有 AND 和 OR 谓词时,效率更加明显。
- 位图索引具有以下约束:
- 支持普通表、堆表和水平分区表创建位图索引;
- 不支持对大字段创建位图索引;
- 不支持对计算表达式列创建位图索引;
- 不支持在 UNIQUE 列和 PRIMARY KEY 上创建位图索引;
- 不支持对存在 CLUSTER KEY 的表创建位图索引;
- 仅支持单列或者不超过 63 个组合列上创建位图索引;
- MPP 环境下不支持位图索引的创建;
- 不支持快速装载建含有位图索引的表;
- 不支持全局位图索引;
- 包含位图索引的表不支持并发的插入、删除和更新操作。
10.3.1.5 创建位图连接索引
- 位图连接索引是一种提高通过连接实现海量数据查询效率的有效方式,主要用于数据仓库环境中。区别于上一节所说的建立在单表上的位图索引,位图连接索引是针对两个或者多个表的连接而建立的位图索引,同时保存了连接的位图结果。对于索引列中的每一个值,位图连接索引在索引表中保存了对应行的 ROWID。
- 使用说明
- 适用于常规索引的基本限制也适用于位图连接索引;
- 用于连接的列必须是维度表中的主键或存在唯一约束;如果是复合主键,则必须使用复合主键中的所有列;
- 当多个事务同时使用位图连接索引时,同一时间只允许更新一个表;
- 连接索引创建时,基表只允许出现一次;
- 不允许对存在 cluster key 的表创建位图连接索引;
- 位图连接索引表(内部辅助表,命名为 BMJ$_索引名)仅支持 select 操作,其他操作都不支持:如 insert、delete、update、alter、drop 和建索引等;
- 不支持对位图连接索引所在事实表和维度表的备份还原,不支持位图连接索引表的表级备份还原;
- 不支持位图连接索引表、位图连接索引以及虚索引的导出导入;
- 位图连接索引及其相关表不支持快速装载;
- 位图连接索引名称的长度限制为:事实表名的长度+索引名称长度+6<128;
- 仅支持普通表、堆表和 HUGE 表;
- WHERE 条件只能是列与列之间的等值连接,并且必须含有所有表;
- 事实表上聚集索引和位图连接索引不能同时存在;
- 不支持对含有位图连接索引的表中的数据执行 DML,如需要执行 DML,则先删除该索引;
- 含有位图连接索引的表不支持下列 DDL 操作:删除、修改表约束,删除、修改列,更改表名。另外,含位图连接索引的堆表不支持添加列操作;
- 不允许对含有位图连接索引的表并发操作;
- 创建位图连接索引时,在存储参数中可指定存储位图的字节数,有效值为:1~ 128,服务器自动校正为 4 的倍数,默认值为 48。如STORAGE(SECTION(4)),表示使用 4 个字节存储位图信息。
10.3.2 隐式地创建索引
- 隐式创建方式只支持创建唯一索引
- DM8是通过在唯一键或主键上创建一个唯一索引来在表上实施UNIQUE KEY或PRIMARY KEY完整性约束。因此当创建UNIQUE KEY或PRIMARY KEY约束时,DM8会隐式地自动创建唯一索引。
10.4 如何在SQL语句中使用索引
- 如果SQL语句想使用某一个索引,则SQL语句的查询项和WHERE子句的过滤项中必须包含该索引的全部索引键
- 当同时包含了多个索引的索引键时,系统会选择一个最优的索引进行查询,最少的查找即可得到所需数据,即为最优索引。
10.5 重建索引
- 当一个表经过大量的增删改操作后,表的数据在物理文件中可能存在大量碎片,从而影响访问速度。另外,当删除表的大量数据后,若不再对表执行插入操作,索引所处的段可能占用了大量并不使用的簇,从而浪费存储空间。可以使用重建索引来对索引的数据进行重组,使数据更加紧凑,并释放不需要的空间,从而提高访问效率和空间效率。
- DM8 提供的重建索引的系统函数为:
SP_REBUILD_INDEX(SCHEMA_NAME varchar(256), INDEX_ID int);
- 使用说明:
- 水平分区子表,临时表和系统表上建的索引不支持重建
- 虚索引和聚集索引不支持重建
10.6删除索引
- 用户可能出于以下某项原因需要删除一个索引:
- 不再需要该索引;
- 该索引没有为针对其相关的表所发布的查询提供所期望的性能改善;
- 应用没有用该索引来查询数据。
- 要想删除索引,则该索引必须包含在用户的模式中或用户必须具有DROP ANY INDEX数据库权限
- 索引删除之后,该索引的段的所有簇都返回给包含它的表空间,并可用于表空间中的其他对象
10.7 查看索引信息
创建索引后,可以通过INDEXDEF系统函数查看索引的定义。
INDEXDEF(INDEX_ID int, PREFLAG int);
INDEX_ID为索引ID,PREFLAG表示返回信息中是否增加模式名前缀。
十一、管理触发器
- DM主动特征:约束机制、触发器机制。约束机制主要用于对某些列进行有效性和完整性验证;**触发器(TRIGGER)**定义当某些与数据库有关的事件发生时,数据库应该采取的操作
- 通过触发器机制,用户可以定义、删除和修改触发器。DM自动管理和运行这些触发器,从而体现系统的主动性,方便用户使用
- 触发器是一种特殊的存储过程,它在创建后就存储在数据库中
- 触发器的特殊性在于它是建立在某个具体的表或视图之上的,或者是建立在各种事件前后的,而且是自动激发执行的,如果用户在这个表上执行了某个 DML 操作(INSERT、DELETE、UPDATE),触发器就被激发执行
- 触发器常用于自动完成一些数据库的维护工作。例如,触发器可以具有以下功能:
- 可以对表自动进行复杂的安全性、完整性检查;
- 可以在对表进行DML操作之前或者之后进行其它处理;
- 进行审计,可以对表上的操作进行跟踪;
- 实现不同节点间数据库的同步更新。
- 触发器与存储模块类似,都是在服务器上保存执行的一段DMSQL程序语句
- 触发器为用户提供了一种自己扩展数据库功能的方法,可以使用触发器来扩充引用完整性,实施附加的安全性或增强可用的审计选项
- 关于触发器应用的例子有:
- 利用触发器实现表约束机制无法实现的复杂的引用完整性;
- 利用触发器实现复杂的事务规则;
- 利用触发器维护复杂的缺省值;
- 利用触发器实现复杂的审计功能;
- 利用触发器防止非法的操作。
- 触发器是应用程序分割技术的一个基本组成部分,它将事务规则从应用程序的代码中移到数据库中,从而可确保加强这些事务规则并提高它们的性能
- DM提供了三种类型的触发器:
- 表级触发器:基于表中的数据进行触发;
- 事件触发器:基于特定系统事件进行触发;
- 时间触发器:基于时间而进行触发。
11.1 触发器的使用
- 触发器是依附于某个具体的表或视图的特殊存储过程,它在某个DML操作的激发下自动执行。
- 创建触发器时应该仔细考虑:
- 触发器应该建立在哪个表/视图之上;
- 触发器应该对什么样的DML操作进行响应;
- 触发器在指定的 DML 操作之前激发还是在之后激发;
- 对每次DML响应一次,还是对受DML操作影响的每一行数据都响应一次。
- 在确定了触发器的实现细节后,现在就可以创建触发器了,创建触发器的语法格式为:
CREATE [OR REPLACE] TRIGGER 触发器名 [WITH ENCRYPTION] BEFORE | AFTER | INSTEAD OF DELETE | INSERT | UPDATE [OF 列名] ON 表名 [FOR EACH ROW [WHEN 条件]] BEGIN DMSQL 程序语句 END;
- 用户如果要在自己的模式中创建触发器,需要具有CREATE TRIGGER数据库权限。如果希望能够在其它用户的模式中创建触发器,需要具有CREATE ANY TRIGGER数据库权限
- 在触发器中可以定义变量,但必须以DECLARE开头
- 触发器也可以进行异常处理,如果发生异常,就执行相应的异常处理程序
11.2 表级触发器
表级触发器都是基于表中数据的触发器,它通过针对相应表对象的插入/删除/修改等DML语句触发
- 触发动作:激发表级触发器的触发动作是三种数据操作命令,即
INSERT
、DELETE
和UPDATE
操作。在触发器定义语句中用关键字INSERT
、DELETE
和UPDATE
指明构成一个触发器事件的数据操作的类型,其中UPDATE
触发器会依赖于所修改的列,在定义中可通过UPDATE OF <触发列清单>
的形式来指定所修改的列,<触发列清单>
指定的字段数不能超过 128 个。 - 触发级别
根据触发器的级别可分为元组级(也称行级)和语句级。元组级触发器,对触发命令所影响的每一条记录都激发一次,假如一个DELETE命令从
表中删除了 1000 行记录,那么这个表上的元组级DELETE触发器将被执行 1000 次。元组级触发器常用于数据审计、完整性检查等应用中。元组级触发器是在触发器定义语句中通过FOR EACH ROW
子句创建的。对于元组级触发器,可以用一个WHEN子句来限制针对当前记录是否执行该触发器。WHEN子句包含一条布尔表达式,当它的值为TRUE时,执行触发器;否则,跳过该触发器。
语句级触发器,对每个触发命令执行一次。语句级触发器一般用于对表上执行的操作类型引入附加的安全措施。语句级触发器是在触发器定义语句中通过FOR EACH STATEMENT
子句创建的,该子句可缺省。 - 触发时机
- 指定
BEFORE
或AFTER
关键字,选择在触发动作之前或之后运行触发器; - 是通过指定
INSTEAD OF
关键字,选择在动作触发的时候,替换原始操作,允许建立在视图上,并且只支持行级触发。
- 指定
- 在元组级触发器中可以引用当前修改的记录在修改前后的值,修改前的值称为旧值,修改后的值称为新值。对于插入操作不存在旧值,而对于删除操作则不存在新值
- 对于新、旧值的访问请求常常决定一个触发器是 BEFORE 类型还是 AFTER 类型
- 如果需要通过触发器对插入的行设置列值,那么为了能设置新值,需要使用一个BEFORE触发器,因为在AFTER触发器中不允许用户设置已插入的值
- 在审计应用中则经常使用AFTER触发器,因为元组修改成功后才有必要运行触发器,而成功地完成修改意味着成功地通过了该表的引用完整性约束
11.3事件触发器
事件触发器包括库级和模式级触发器,这类触发器并不依赖于某个表,而是基于特定系统事件触发的,通过指定DATABASE或某个SCHEMA来表示事件触发器的作用区域
- 创建事件触发器的用户需有CREATE_TRIGGER或CREATE_ANY_TRIGGER 权限
- 可以触发的事件包含以下两类:
- DDL事件,包括CREATE、ALTER、DROP、GRANT、REVOKE以及 TRUNCATE;
- 系统事件,包括LOGIN/LOGON、LOGOUT/LOGOFF、AUDIT、NOAUDIT、BACKUP DATABASE、RESTORE DATABASE、TIMER、STARTUP、SHUTDOWN 以及 SERERR(即执行错误事件)。
- 所有DDL事件触发器都可以设置BEFORE或AFTER的触发时机,但系统事件中LOGOUT,SHUTDOWN 仅能设置为BEFORE,而其它则只能设置为 AFTER。模式级触发器不能是LOGIN/LOGON、LOGOUT/LOGOFF、SERERR、BACKUP DATABASE、RESTORE DATABASE、
STARTUP 和 SHUTDOWN 事件触发器 - 与数据触发器不同,事件触发器不能影响对应触发事件的执行,它的主要作用是帮助管理员监控系统运行发生的各类事件,进行一定程度的审计和监视工作。
11.4时间触发器
- 时间触发器是一种特殊的事件触发器
- 时间触发器的特点是用户可以定义在任何时间点、时间区域、每隔多长时间等等的方式来激发触发器,而不是通过数据库中的某些操作包括DML、DDL 操作等来激发,它的最小时间精度为分钟
- 时间触发器与其它触发器的不同只是在触发事件上,在 DMSQL 语句块(BEGIN和END之间的语句)的定义是完全相同的
时间触发器的创建语句如下:CREATE [OR REPLACE] TRIGGER 触发器名 WITH ENCRYPTION AFTER TIMER ON DATABASE {时间定义语句} BEGIN 执行语句 END;
11.5 触发器总结
-表级触发器的触发事件包括某个基表上的INSERT、DELETE和UPDATE操作,无论对于哪种操作,都能够为其创建BEFORE触发器和AFTER触发器。如果触发器的动作代码不取决于受影响的数据,语句级触发器就非常有用
- 每张基表上可创建的触发器的个数没有限制,但是触发器的个数越多,处理DML语句所需的时间就越长
- 创建触发器的用户必须是基表的创建者,或者拥有DBA权限(不存在触发器的执行权限)
- 对于语句级和元组级的触发器来说,都是在 DML 语句运行时激发的
- 在执行 DML 语句的过程中,基表上所创建的触发器按照下面的次序依次执行:
- 如果有语句级前触发器的话,先运行该触发器;
- 对于受语句影响每一行:
1) 如果有行级前触发器的话,运行该触发器;
2) 执行该语句本身;
3) 如果有行级后触发器的话,运行该触发器; - 如果有语句级后触发器的话,运行该触发器。
- 同类触发器的激发顺序没有明确的定义。如果顺序非常重要的话,应该把所有的操作组合在一个触发器中
- 过多的触发器或复杂触发器过程脚本会降低数据库的运行效率
- DM的数据守护环境下,备库上定义的触发器是不会被触发的
十二、管理视图、序列和同义词
12.1管理视图
- 视图是关系数据库系统提供给用户以多种角度观察数据库中数据的重要机制,它简化了用户数据模型,提供了逻辑数据独立性,实现了数据共享和数据的安全保密
- 从系统实现的角度讲,视图是从一个或几个基表(或视图)导出的表,但它是一个虚表,即数据字典中只存放视图的定义(由视图名和查询语句组成),而不存放对应的数据,这些数据仍存放在原来的基表中
- 视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据和变化。当用户所需的数据是一张表的部分列、或部分行,或者数据是分散在多个表中,那么就可以创建视图来将这些满足条件的行和列组织到一个表,而不需要修改表的属性、甚至创建新的表。这样不仅简化了用户的操作,还可以提高数据的逻辑独立性,实现数据的共享和保密
- 用户也可以对那些经常进行的查询建立相应视图,如果经常使用的查询语句较庞大,这样可以节省繁琐语句的书写
- 由于视图没有直接相关的物理数据,所以不能被索引
- DM提供了以
V$
开头的视图查看当前服务器的使用情况。这些视图的数据在服务器运行期间一直变化,并且数据反映的主要是系统的性能信息,因此它们被称为动态性能视图。用户对动态性能视图只能进行查询操作
12.2 管理序列
- 序列(sequence)是DM数据库中的数据库实体之一
- 使用序列,多个用户可以产生和使用一组不重复的有序整数值。比如可以用序列来自动地生成主关键字值;序列通过提供唯一数值的顺序表来简化程序设计工作。
- 当一个序列第一次被查询调用时,它将返回一个预定值,该预定值就是在创建序列时所指定的初始值
- 在随后的每一次查询中,序列将产生一个按其指定的增量增长的值。增量可以是任意的正整数或负整数,增加缺省为1
- 一旦序列生成,用户就可以在SQL语句中用以下伪列来存取序列的值:
- CURRVAL返回当前的序列值;
- NEXTVAL如果为升序序列,序列值增加并返回增加后的值;如果为降序序列,序列值减少并返回减少后的值
- 序列可以是循环的,当序列的值达到最大/小值时,序列将从最小/大值计数
- 使用一个序列时,不保证将生成一串连续不断递增的值
12.3 管理同义词
- 同义词相当于模式对象的别名,起着连接数据库模式对象和应用程序的作用。假如模式对象需要更换或者修改,则不用修改应用程序而直接修改同义词就可以了
- 同义词是用来实现下列用途的数据库对象:
- 为可以存在于本地或远程服务器上的其他数据库对象(称为基础对象)提供备用名称;
- 提供抽象层以免客户端应用程序对基础对象的名称或位置进行更改。
- 同义词的好处在于用户可能需要某些对象在不同的场合采用不用的名字,使其适合不同人群的应用环境
12.4查看视图、序列和同义词信息
- 视图、序列以及同义词的定义信息可以通过查看系统表SYSOBJECTS和SYSTEXTS得到
- 视图的定义信息也可以通过SP_VIEWDEF系统过程来查看
十三、模式对象的常规管理
- 模式(SCHEMA)指的是用户账号拥有的对象集,在概念上可将其看作是包含表、视图、索引和权限定义的对象。
- 系统为每一个用户自动建立了一个与用户名同名的模式作为其默认模式,用户还可以用模式定义语句建立其它模式
- 采用模式的原因有几点:
1. 允许多个用户使用一个数据库而不会干扰其它用户;
2. 把数据库对象组织成逻辑组,让它们更便于管理;
3. 第三方的应用可以放在不同的模式中,这样可以避免和其它对象的名字冲突。模式类似于操作系统层次的目录,只不过模式不能嵌套。 - DM 模式可通过 SQL 语句进行操作。DM 模式主要包含以下的模式对象:
1. 表;
2. 视图;
3. 索引;
4. 触发器;
5. 存储过程/函数;
6. 序列;
7. 全文索引;
8. 包;
9. 同义词;
10. 类;
11. 外部链接。
引用模式对象: [模式名].对象名(当前模式和要引用的模式对象所属的模式相同时,可以省略模式名)
- 模式对象之外的其他对象统称为非模式对象,非模式对象主要包括:
- 用户;
- 角色;
- 权限;
- 表空间。
13.1在单个操作中创建多个模式对象
在DM数据库中,使用CREATE SCHEMA语句就可以创建一个空的模式对象,也可以在创建模式时,同时创建多个模式对象。
13.2 重命名模式对象
- 要重命名一个模式对象,那么这个模式对象必须在指定的模式里面。用户可以采用下面几种方式来重命名模式对象:
- 删除原有的模式对象,重新创建;
- 使用ALTER … RENAME语句(TABLE)。
- 如果采用的是删除并重建模式对象的方式来重命名模式对象,那么所有的基于这个模式对象的授权都将失效。在模式对象重建之后,基于原对象的权限和角色必须重新授予。
- 如果使用的是 ALTER … RENAME 语句来重命名模式对象,那么所有基于原模式对象的权限将转移到重命名后的模式对象上,不需要重新授权。如重命名 TEST 上的 ADDRESS表:
ALTER TABLE TEST.ADDRESS RENAME TO ADDRESS1;
- 如果一个用户USER1在ADDRESS上拥有查询、插入的权限,那么重命名之后,USER1在ADDRESS1上同样拥有查询、插入权限。
- 在重命名一个模式对象之前,需要考虑以下影响:
- 所有基于重命名模式对象的视图和 DMSQL 语句块都将失效,在使用之前,必须重新编译;
- 所有基于重命名模式对象的同义词在使用的时候都会报错。
13.3 启用和停用触发器
- 触发器(TRIGGER)定义当某些与数据库有关的事件发生时,数据库应该采取的操作。
- 触发器是在相关的事件发生时由服务器自动地隐式激发的。触发器是激发它们的语句的一个组成部分,即直到一个语句激发的所有触发器执行完成之后该语句才结束,而其中任何一个触发器执行的失败都将导致该语句的失败,触发器所做的任何工作都属于激发该触发器的语句。
//启用 addr_trig 触发器:
ALTER TRIGGER addr_trig ENABLED;
//禁用 addr_trig 触发器:
ALTER TRIGGER addr_trig DISABLED;
13.4 管理完整性约束(限制表中一个或者多个列的值)
- 用户可以指定一个约束是启用(ENABLE)或禁止(DISABLED)。如果启用一个约束,那么在插入数据或者是更新数据时会对数据进行检查,不符合约束的数据被阻止进入。如果约束是禁止(DISABLED)的,不符合约束的数据被允许进入数据库。
- 查看所有的约束信息:
13.5 管理对象依赖性
在实际应用中,许多模式对象需要引用其他的对象。
一个模式对象引用了别的对象被称为依赖对象,被引用的对象称为被依赖对象。
达梦数据库在对象被调用的时候自动重新编译,确保对象有效。
13.6 管理对象名称解析
- DM数据库对象名字是由两部分组成,之间用点号隔开
对象分为两大类:一是SQL语句中的对象;二是DMSQL程序中的对象
13.6.1 SQL 语句对象
在 SQL 语句中,对象名字的解析规则如下:
- 如果只有一个名字,而没有点号。在当前模式下寻找是否存在相同名字的对象,如果找到,则返回;否则报错。
- 如果有点号,首先检测对象名的第一部分,例如:在 TEST.ADDRESS 中,TEST 就是第一部分。具体步骤下面详细介绍:
- 寻找哪一个模式的名字和第一部分相同,如果找到,以此模式进行步骤 2);否则,以当前模式进行步骤 2)。
- 在模式中需找是否有与对象名第二部分同名的对象,如果找到且待解析对象名只有两个部分,则返回;如果找到但待解析对象名多于两个部分,则转步骤 3);否则报错。
- 在模式中查找包含在前一个对象中并且和待解析对象名当前解析部分相同名字的对象,如果找到,循环步骤 3),直至所有的部分检测结束后再返回;如果没有找到,则直接报错。如TEST.SCHOOL.CLASS.STUDENT,在TEST模式下中的SCHOOL对象中寻找CLASS的对象,然后在 CLASS 对象中寻找 STUDENT 对象。
13.6.2 DMSQL 程序对象
在 DMSQL 程序中,对象名字的解析规则如下:
- 如果只有一个名字,而没有点号。在当前模式下寻找是否存在相同名字的对象,如果找到,则返回;否则报错。这一点与SQL 语句对象一致。
- 如果有点号,首先检测对象名的第一部分,如在 TEST.ADDRESS 中,TEST 就是第一部分。具体步骤下面详细介绍:
- 寻找当前模式下是否存在包名与第一部分相同,如果找到,进行步骤 2),否则进行步骤 4)。
- 在步骤 1 的包中查找是否有与对象名第二部分同名的对象,若找到且待解析对象名只有两个部分,则返回。若找到但待解析的对象名多于两个,则进行步骤 3)。若包中不存在与第二部分同名的对象则报错。
- 查找包含在前一个对象中并且和待解析对象名当前解析部分相同名字的对象,如果找到,循环步骤 3),直至所有的部分检测结束后再返回;如果没有找到,则直接报错。
- 查找是否存在模式名与对象名的第一部分相同,如果找到,以此模式进行步骤 5),否则以当前模式进行步骤 5)。
- 在模式中需找是否有与对象名第二部分同名的对象,如果找到且待解析对象名只有两个部分,则返回;如果找到但待解析对象名多于两个部分,则转步骤 6);否则报错;
- 在模式中查找包含在前一个对象中并且和待解析对象名当前解析部分相同名字的对象,如果找到,循环步骤 6),直至所有的部分检测结束后再返回;如果没有找到,则直接报错。如TEST.SCHOOL.CLASS.STUDENT,在TEST模式下中的SCHOOL对象中寻找CLASS的对象,然后在CLASS对象中寻找STUDENT对象。
13.7 显示有关模式对象的信息
模式对象的信息主要记录在SYSOBJECTS系统表中:
SELECT * FROM SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' OR TYPE$ = 'TABOBJ';
SYSOBJECTS系统表并不能将模式对象的所有信息存储起来,用户应该和其它系统表一起获得更加详细的信息:
- 索引更详细的信息:SYSINDEXES表
存储过程、函数等的定义信息:SYSTEXTS表
更详细的约束的相关信息:SYSCONS表
实操: