触发器、安全性设计、权限设计、加密设计、索引设计
触发器
- 触发器是建立在某个基本表上的一组语句的集合,并经预先编译后存储在数据库中,用于处理当数据更新时所执行的与该表相关的特定操作,触发器与表紧密联系在一起,该表称为触发器表,而触发器是在定义在触发器表上的。
- 可以说,触发器是一种特殊类型的存储过程,它不同于前面介绍过的存储过程,触发器不能由用户调用执行,而是在对触发器表进行操作时自动触发执行的,但存储过程可以通过存储过程名字而被直接调用。
- 当有操作针对触发器表时,如:在触发器表中插入、删除、修改数据时,如果该表有相应操作类型的触发器,那么触发器就自动触发执行。
- 触发器主要功能:
- 能够实现由主码和外码所不能保证的、复杂的完整性和数据的一致性。
- 强化约束:触发器能够实现更为复杂的约束。
- 跟踪变化:触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
- 级联运行:触发器可以自动地级联影响整个数据库的各项内容。例如,某个表上的触发器中包含有对另外一个表的数据操纵,而该操作又导致此表上定义的触发器被触发。
- 存储过程的调用:为了响应数据库更新触发器,可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在DBMS本身之外进行操作。
- 由此可见,触发器可以解决高级形式的业务规则、复杂行为限制以及实现定制记录等方面的问题。例如,触发器能够找出某一表在数据修改前后状态发生的差异,并根据这种差异执行一定的处理。此外一个表的同一类型的多个触发器能够对同一种数据操纵采取多种不同的处理。
安全性设计
- 数据库的安全性是指保护数据库以防止不合法的使用所造成的数据泄漏、更改或破坏。
- 安全性问题不是数据库系统所独有的,所有计算机系统都有这个问题,只是在数据库系统中大量数据集中存放,而且为许多最终用户直接共享,从而使安全性问题更为突出。
- 在数据库系统中,安全措施是分级设置的。在数据库系统这一级一般通过限定用户权限控制。在数据库数据存储这一级一般采用加密技术,当物理存储设备失窃后,它起到保密作用。
访问权限设计
- 一个用户能够连接到某个数据库上,但并不意味着他能够访问该数据库中的数据。用户对数据库数据的访问要受到其权限的限制。数据库操作权限有系统特权、隐含特权、对象特权三种。
- 隐含特权:是系统内置权限,是用户不需要进行授权就可拥有的数据操纵权。用户拥有的隐含特权与自己的身份有关,例如,DBA可进行数据库内的任何操作,数据库拥有者和数据库对象的拥有者可对自己的数据进行任何操作。
- 系统特权:又称为语句特权,是允许用户在数据库内部实施管理行为的特权,主要包括创建或删除数据库、创建或删除用户、创建或修改数据库对象等,不同的数据库系统规定的系统权限不同。系统特权包括定义数据库、定义默认值、定义存储过程、定义规则、定义基本表、定义视图、备份数据库、备份日志文件等。
- 对象特权:指用户对数据库中的表、视图、存储过程等对象的操作权限。对于不同类型的对象,有不同类型的对象特权。对于有些模式对象,如索引、触发器等没有相关的对象特权,它们由系统特权控制。对于包含在某用户名的模式中的对象,该用户对这些对象自动地具有全部对象特权,即模式的持有者对模式中的对象具有全部对象特权。这些对象的持有者可将这些对象上的任何对象特权可授权给其他用户。对象特权包括:对表或视图的查询、插入、修改和删除操作;对指定的字段查看或修改;运行存储过程等。
加密算法设计
目前数据库系统中常用的数据加密技术有以下几种:
- 私钥加密算法:私钥加密算法使用单个私钥来加密和解密数据,即同一密钥既用于加密又用于解密,所以私钥加密又称为对称加密。由于具有密钥的任意一方都可以使用该密钥解密数据,因此必须保护密钥不被未经授权的代理得到。
- 公钥加密算法:公钥加密算法使用一个必须对未经授权的用户保密的私钥和一个可以对任何人公开的公钥。公钥和私钥都在数学上相关联,用公钥加密的数据只能用私钥解密,而用私钥签名的数据只能用公钥验证。公钥可以被任何人使用,该密钥用于加密要发送到私钥持有者的数据。两个密钥对于通信会话都是唯一的。公钥加密算法也称为不对称算法,原因是需要用一个密钥加密数据而需要用另一个密钥来解密数据。通常将相关的公钥和私钥称为一个密钥对。
- 哈希算法:哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
- 数字签名验证:数字签名验证是通过发送方标识被发送的数据以保护数据的完整性。事实上数字签名不是一种具体的技术实现,它是基于以上各种加密技术组合的解决方案。通常一个基本的数字签名方案可能有如下步骤:
- 双方各自生成一个公钥/私钥对。
- 双方交换他们的公钥。
- 双方生成一个用于对称加密法的私钥,并使用该对
- 称私钥加密要发送的消息。
- 生成加密后消息的哈希值。
- 用对方的公钥加密对称私钥和哈希值(该组合密文即为签名),并将该签名附加在消息主体的密文后发送给对方。
- 由于数据加密和解密也是比较费时的操作,而且数据加密与解密程序会占用大量系统资源,因此数据加密功能通常也作为可选特征,允许用户自由选择,只对高度机密的数据加密。
索引设计
- 索引是一个单独的、物理的数据库结构,它是某个关系中,一列或若干列值的集合和相应的指向关系中物理标识这些值的数据页的逻辑指针清单。
- 索引依赖表建立,它提供了数据库中编排表中数据的内部方法。一个建立了索引的表的存储是由两部分组成的,一部分用来存放表的数据页面,另一部分存放索引页面。索引就存放在索引页面上,通常,索引页面相对于数据页面来说小得多。当进行数据检索时,系统先搜索索引页面,从中找到所需数据的指针,再直接通过指针从数据页面中读取数据。
- 索引是数据库随机检索的常用手段,它实际上就是记录的关键字与其相应地址的对应表。如果把数据库表比作一本书,则表的索引就如书的目录一样,通过索引可大大提高查询速度。
索引的概念
- 在关系数据库中按存储结构的不同,一般将索引分为两类:聚簇索引和非聚簇索引。
- 聚簇索引:在聚簇索引中,关系中记录的物理顺序与聚簇索引值的逻辑顺序相同。一个关系只能包含一个聚簇索引。许多关系型DBMS都提供了聚簇功能,即为了提高某个属性(或属性组)的查询速度,把在这个或这些属性上有相同值的元组集中存放在一个物理块中,如果存放不下,可以存放到预留的空白区或链接多个物理块。
- 非聚簇索引:按照索引的字段排列记录,但是排列的结果并不会存储在表中,而是另外存储。
- 索引的作用
- 使用索引可以明显加快数据查询的速度:由于基本表文件中的列比较多,元组也比较多,所以数据文件会很大。在进行数据查询时,如果不使用索引,则需要将数据文件分块,逐个读到内存,进行查找的比较操作。而使用索引后,先将索引文件读入内存,根据索引项找到元组的地址,然后再根据地址将元组数据直接读入计算机。由于索引文件中只含有索引项和元组地址,所以文件小,一般可一次读入内存,并且由于索引文件中的索引项是经过排序的,可以很快地找到索引项值和元组地址。显然,使用索引大大减少了磁盘的I/O次数,从而可以加快查询速度。
- 使用索引可以保证数据的唯一性:索引的定义中包括定义数据唯一性的内容。当定义了数据唯一性的功能后,在对相关的索引项进行数据输入或数据更改时,系统要进行检查,以确保其数据唯一性成立。
- 使用索引可以加快连接速度:在两个关系进行连接操作时,系统需要在连接关系中对每一个被连接字段进行查询操作,其查询工作量是非常可观的。显然,如果在连接字段上建有索引,则可以大大提高连接速度。
- 设计原则
- 如果一个(或一组)属性经常在查询条件中出现,则考虑在这个(或这组)属性上建立索引(或组合索引)。
- 如果一个属性经常作为最大值或最小值等聚集函数的参数,则考虑在这个属性上建立索引。
- 如果一个(或一组)属性经常在连接操作的连接条件中出现,则考虑在这个(或这组)属性上建立索引(或组合索引)。
- 大表应当建立索引,小表则不必建索引。在确定对基本表建立索引时,表的数据越多,记录越长,越有必要建立索引,建立索引后加快查询速度的效果也越明显。相反,对于记录比较少的基本表,建立索引的意义不大。