slacr_

Just to record my life and thoughts.
笔记/编程/杂乱/极简

[数据库]基础

May 22, 2023DB18108 words in 121 min

数据库系统概论, 复习用, 大都是概念性的东西

基本概念

数据(data)
  • 描述事物的符号
数据库(DataBase,DB)
  • 长期储存在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和储存,具有较小的冗余度(redundancy)、较高的数据独立性(data independency)和易扩展性(scalability),并可为各种用户共享
  • 具有永久存储、有组织和可共享三个基本特点。
数据库管理系统(DataBase Management System,DBMS)
  • 位于用户与操作系统之间的一层数据管理软件。主要功能: 数据定义功能; 数据组织、存储和管理; 数据操纵功能; 数据库的事务管理和运行管理; 数据库的建立和维护功能.
数据库系统(DataBase System,DBS)
  • 由数据库、数据库管理系统(及其应用开发工具)、应用程序和数据库管理员(DataBase Administrator,DBA)组成的存储、管理、处理和维护数据的系统。
  • 数据库管理系统提供以下几方面的数据控制功能: 数据的安全性(security)保护; 数据的完整性(integrity)检查; 并发(concurrency)控制; 数据库恢复(recovery)
数据模型(data model)
  • 对现实世界数据特征的抽象. 把现实世界中具体的人、物、活动、概念用数据模型这个工具来抽象、表示和处理。
  • 数据模型是数据库系统的核心和基础. 各种机器上实现的数据库管理系统软件都是基于某种数据模型或者说是支持某种数据模型的。
  • 根据模型应用的不同目的,可以将这些模型划分为两大类,它们分别属于两个不同的层次。第一类是概念模型,第二类是逻辑模型和物理模型
    • 概念模型(conceptual model)
      • 也称信息模型,它是按用户的观点来对数据和信息建模,主要用于数据库设计。
      • 实体(entity) 客观存在并可相互区别的事物称为实体。
      • 属性(attribute) 实体所具有的某一特性称为属性.
      • 码(key) 唯一标识实体的属性集称为码
      • 实体型(entity type) 用实体名及其属性名集合来抽象和刻画同类实体,称为实体型。例如,学生(学号,姓名,性别,出生年月,所在院系,入学时间)就是一个实体型。{就像类的声明}。
      • 实体集(entity set) 同一类型实体的集合称为实体集。例如,全体学生就是一个实体集。{相当于一组同类的对象的集合}
      • 联系(relationship) 组成实体的各属性之间的联系
      • 实体-联系方法(Entity-Relationship approach) P.P.S.Chen 于 1976 年提出, 用 E-R 图(E-R diagram)来描述现实世界的概念模型,E-R 方法也称为E-R模型
      逻辑模型
      • 按计算机系统的观点对数据建模,主要用于数据库管理系统的实现。
      物理模型
      • 是对数据最底层的抽象,它描述数据在系统内部的表示方式和存取方法,或在磁盘或磁带上的存储方式和存取方法,是面向计算机系统的。
数据模型的组成要素
  • 数据模型是严格定义的一组概念的集合。这些概念精确地描述了系统的静态特性、动态特性和完整性约束条件(integrity constraints)。因此数据模型通常由数据结构、数据操作和数据的完整性约束条件三部分组成。
  • 数据结构 数据结构描述数据库的组成对象以及对象之间的联系
  • 数据操作 指对数据库中各种对象(型)的实例(值)允许执行的操作的集合,包括操作及有关的操作规则。
  • 数据的完整性约束条件 数据的完整性约束条件是一组完整性规则.
常用的数据模型
  • 面向对象数据模型(object oriented data model)
  • 对象关系数据模型(object relational data model)
  • 半结构化数据模型(semistructure data model)
  • 层次模型(hierarchical model)
    • 层次模型用树形结构来表示各类实体以及实体间的联系. 结构简单, 查询效率高. {就比如说我这个目录树}
    网状模型(network model)
    • 存取效率较高。 DDL、DML 复杂,并且要嵌入某一种高级语言(如 COBOL、C)中。用户不容易掌握,不容易使用。
    关系模型(relational model)
      关系模型的数据结构
      • 关系模型要求关系必须是规范化的,即要求关系必须满足一定的规范条件,这些规范条件中最基本的一条就是,关系的每一个分量必须是一个不可分的数据项.
      • 关系(relation) 一个关系对应通常说的一张表.
      • 元组(tuple) 表中的一行即为一个元组。
      • 属性(attribute) 表中的一列即为一个属性
      • 码(key) 就是键, 唯一标识一个元组.
      • 域(domain) 一组具有相同数据类型的值的集合。属性的取值范围来自某个域.
      • 分量 元组中的一个属性值。
      • 关系模式 对关系的描述,一般表示为关系名(属性 1,属性 2,…,属性 n)
        {和实体型同理, 语言就是用一个词解释另一个词, 组成有向的网状结构, 虽然含义大致一样, 但还是能觉察到其在整个语言体系中的位置不同, 能感觉到存在差别. 关系模式是用来描述数据库的关系的组织形式, 实体型用来描述一组元组对应实例对象的共同特征}
      关系模型的数据操纵与完整性约束
      • 关系模型的数据操纵主要包括查询、插入、删除和更新数据。这些操作必须满足关系的完整性约束条件。关系的完整性约束条件包括三大类:实体完整性、参照完整性和用户定义的完整性
      • 关系模型的优缺点
        • 建立在严格的数学概念的基础上
        • 关系模型的概念单一。无论实体还是实体之间的联系都用关系来表示。对数据的检索和更新结果也是关系(即表)。所以其数据结构简单、清晰,用户易懂易用。
        • 存取路径对用户透明,从而具有更高的数据独立性、更好的安全保密性,也简化了程序员的工作和数据库开发建立的工作。
数据库系统的(模式结构)
  • {这里的’模式’是既是名词也是形容词,修饰’结构’, 或者说’模’是形容词, 数据库系统的结构可以有很多种不同角度的分法.}
  • 模式(schema)是数据库中全体数据的逻辑结构和特征的描述,它仅仅涉及型的描述,不涉及具体的值。模式的一个具体值称为模式的一个实例(instance)。同一个模式可以有很多实例。
  • 虽然实际的数据库管理系统产品种类很多,它们支持不同的数据模型,使用不同的数据库语言,建立在不同的操作系统之上,数据的存储结构也各不相同,但它们在体系结构上通常都具有相同的特征,即采用三级模式结构(早期微机上的小型数据库系统除外)并提供两级映像功能
      三级模式结构
      数据库系统是由外模式、模式和内模式三级构成
      • 外模式(external schema)
        外模式也称子模式(subschema)或用户模式,它是数据库用户(包括应用程序员和最终用户)能够看见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应用有关的数据的逻辑表示。外模式通常是模式的子集。
      • 模式(schema)
        模式也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有用户的公共数据视图。它是数据库系统模式结构的中间层,既不涉及数据的物理存储细节和硬件环境,又与具体的应用程序、所使用的应用开发工具及高级程序设计语言无关。模式实际上是数据库数据在逻辑级上的视图。
      • 内模式(internal schema)
        内模式也称存储模式(storage schema),一个数据库只有一个内模式。它是数据物理结构和存储方式的描述,是数据在数据库内部的组织方式.
      二级映像功能
      • 外模式/模式映像
        模式描述的是数据的全局逻辑结构,外模式描述的是数据的局部逻辑结构。对应于同一个模式可以有任意多个外模式。对于每一个外模式,数据库系统都有一个外模式/模式映像,它定义了该外模式与模式之间的对应关系。这些映像定义通常包含在各自外模式的描述中。
        当模式改变时(例如增加新的关系、新的属性、改变属性的数据类型等),由数据库管理员对各个外模式/模式的映像作相应改变,可以使外模式保持不变。应用程序是依据数据的外模式编写的,从而应用程序不必修改,保证了数据与程序的逻辑独立性,简称数据的逻辑独立性
      • 模式/内模式映像
        数据库中只有一个模式,也只有一个内模式,所以模式/内模式映像是唯一的,它定义了数据全局逻辑结构与存储结构之间的对应关系。当数据库的存储结构改变时(例如选用了另一种存储结构),由数据库管理员对模式/内模式映像作相应改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,简称数据的物理独立性
数据库系统的组成
  • 硬件平台及数据库 \ 软件 \ 人员

关系数据库

关系数据库系统是支持关系模型的数据库系统.

关系数据结构及形式化定义
  • 关系模型的数据结构非常简单,只包含单一的数据结构——关系。在用户看来,关系模型中数据的逻辑结构是一张扁平的二维表。
  • 域(domain) 组具有相同数据类型的值的集合。
  • 笛卡儿积(cartesian product)
    • 给定一组域 D1,D2,…,Dn,允许其中某些域是相同的,D1,D2,…,Dn,的笛卡儿积为: -
    • 每一个元素(d1,d2,…,dn)叫作一个 n 元组(n-tuple),或简称元组(tuple)。元素中的每一个值 d,叫做一个分量(component)。一个域允许的不同取值个数称为这个域的基数(cardinal number)。
    关系(relation)
    • 笛卡尔积的子集
    • 关系也是一张二维表,表的每行对应一个元组,表的每列对应一个域。由于域可以相同,为了加以区分,必须对每列起一个名字,称为属性(attribute)。n 目关系必有 n 个属性。
    候选码(candidate key)
    • 某一属性组的值能唯一地标识一个元组,而其子集不能,则称该属性组为候选码 (candidate key)。 - 若一个关系有多个候选码,则选定其中一个为主码(primary key)
    • 候选码的诸属性称为主属性(prime attribute)。不包含在任何候选码中的属性称为非主属性(non-prime attribute)或非码属性(non-key attribute)。
    • 在最简单的情况下,候选码只包含一个属性。在最极端的情况下,关系模式的所有属性是这个关系模式的候选码,称为全码(all-key)。
  • 关系可以有三种类型:基本关系(通常又称为基本表或基表)、查询表和视图表
  • 基本表是实际存在的表,它是实际存储数据的逻辑表示;查询表是查询结果对应的表;视图表是由基本表或其他视图表导出的表,是虚表,不对应实际存储的数据。
关系模式
  • 关系模式是型,关系是值。关系模式是对关系的描述
  • 关系是元组的集合,因此关系模式必须指出这个元组集合的结构,即它由哪些属性构成,这些属性来自哪些域,以及属性与域之间的映像关系。
  • 关系的描述称为关系模式(relation schema)。它可以形式化地表示为
    R(U,D,DOM,F)
    R 为关系名,U 为组成该关系的属性名集合,D 为 U 中属性所来自的域,DOM 为属性向域的映像集合,F 为属性间数据的依赖关系集合。
关系数据库
  • 关系数据库的型也称为关系数据库模式,是对关系数据库的描述。
  • 关系数据库的值是这些关系模式在某一时刻对应的关系的集合,通常就称为关系数据库。
关系操作
  • 常用的关系操作包括查询(query)操作和插入(insert)、删除(delete)、修改(update)操作两大部分。
  • 查询操作又可以分为选择(select)、投影(project)、连接(join)、除(divide)、并(union)、差(except)、交(intersection)、笛卡儿积等。其中选择、投影、并、差、笛卡儿积是 5 种基本操作,其他操作可以用基本操作来定义和导出
  • 关系操作的特点是集合操作方式,即操作的对象和结果都是集合.
  • 关系数据语言的分类
      • 早期的关系操作能力通常用代数方式或逻辑方式来表示,分别称为关系代数(relationalalgebra)和关系演算(relational calculus)。关系代数用对关系的运算来表达查询要求,关系演算则用谓词来表达查询要求。关系演算又可按谓词变元的基本对象是元组变量还是域变量分为元组关系演算和域关系演算。一个关系数据语言能够表示关系代数可以表示的查询,称为具有完备的表达能力,简称关系完备性。已经证明关系代数、元组关系演算和域关系演算三种语言在表达能力上是等价的,都具有完备的表达能力。
      • 关系代数、元组关系演算和域关系演算均是抽象的查询语言,这些抽象的语言与具体的关系数据库管理系统中实现的实际语言并不完全一样。但它们能用作评估实际系统中查询语言能力的标准或基础。
      • 结构化查询语言(Sructured QueryLanguage,SQL)。SQL 不仅具有丰富的查询功能,而且具有数据定义和数据控制功能,是集查询、数据定义语言、数据操纵语言和数据控制语言(Data Control Language,DCL)于一体的关系数据语言。它充分体现了关系数据语言的特点和优点,是关系数据库的标准语言。
关系的完整性
    关系模型中有三类完整性约束:实体完整性(entity integrity)、参照完整性(referential integrity)和用户定义的完整性(user-defined integrity)
      实体完整性规则
      • 若属性(指一个或一组属性)A 是基本关系 R 的主属性,则 A 不能取空值(null value). {即主码非空}
      参照完整性规则
      • 若属性(或属性组)F 是基本关系 R 的外码,它与基本关系 S 的主码 Ks 相对应(基本关系 R 和 S 不一定是不同的关系),则对于 R 中每个元组在 F 上的值必须: 或者取空值(F 的每个属性值均为空值); 或者等于 S 中某个元组的主码值。
      • 外码
        设 F 是基本关系 R 的一个或一组属性,但不是关系 R 的码,Ks,是基本关系 S 的主码。如果 F 与 Ks,相对应,则称 F 是 R 的外码(foreign key),并称基本关系 R 为参照关系(referencing relation),基本关系 S 为被参照关系(referenced relation)或目标关系(target relation)。关系 R 和 S 不一定是不同的关系。 { 多个表联结后的表除了主码以外引用其他表的主码都是外码, 包括自联结 }
    • 用户定义的完整性
  • 实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。用户定义的完整性是应用领域需要遵循的约束条件,体现了具体领域中的语义约束。
  • 关系代数
    • 并、差、笛卡儿积、选择和投影这 5 种运算为基本的运算。其他三种运算,即交、连接和除,均可以用这 5 种基本运算来表达。这些运算经有限次复合后形成的表达式称为关系代数表达式。
    • 基本概念
      • (1)设关系模式为 R(A1,A2,…,An),它的一个关系设为 R。t∈R 表示 t 是 R 的一个元组。t[Ai]则表示元组 t 中相应于属性 Ai 的一个分量。
        (2)若 A={Ai1,Ai2,…,Aik}, 其中 Ai1,Ai2,…,Aik 是 A1,A2,…,An,中的一部分,则 A 称为属性列或属性组。t[A]=(t[Ai1],t[Ai2],…,t[Aik])表示元组 t 在属性列 A 上诸分量的集合, \overline{A} 则表示{A1,A2,…,An}中去掉{Ai1,Ai2,…,Aik}后剩余的属性组。
        (3)R 为 n 目关系,S 为 m 目关系. t_r ∈R, t_s ∈S, \overset{\LARGE{\frown}}{t_{r}t_{s}} 称为元组的连接(concatenation)或元组的串接。它是一个 n+m 列的元组,前 n 个分量为 R 中的一个 n 元组,后 m 个分量为 S 中的一个 m 元组。
        (4)给定一个关系 R(X,Z),X 和 Z 为属性组。当 t[X]=x 时,x 在 R 中的象集(images set)定义为
        Z_x={t[Z]|t∈R,t[X]=x} 它表示 R 中属性组 X 上值为 x 的诸元组在 Z 上分量的集合。
      选择(selection)
      • 选择又称为限制(restriction)。它是在关系 R 中选择满足给定条件的诸元组,记作


        F 表示选择条件.
      投影(projection)
      • 关系 R 上的投影是从 R 中选择出若干属性列组成新的关系。记作

      连接(join)
        连接也称为 θ 连接。它是从两个关系的笛卡儿积中选取属性间满足一定条件的元组。记作:

        A 和 B 分别为 R 和 S 上列数相等且可比的属性组,θ 是比较运算符。连接运算从 R 和 S 的笛卡儿积 R×S 中选取 R 关系在 A 属性组上的值与 S 关系在 B 属性组上的值满足比较关系 θ 的元组。
        连接运算中有两种最为重要也最为常用的连接,一种是等值连接(equijoin),另一种是自然连接(naturaljoin)。
        • 等值连接
          θ 为“=”的连接运算称为等值连接。它是从关系R与S的广义笛卡儿积中选取A、B属性值相等的那些元组,即等值连接为
        • 自然连接
          自然连接是一种特殊的等值连接。它要求两个关系中进行比较的分量必须是同名的属性组,并且在结果中把重复的属性列去掉。即若 R 和 S 中具有相同的属性组 B,U 为 R 和 S 的全体属性集合,则自然连接可记作


          关系 R 中某些元组有可能在 S 中不存在公共属性上值相等的元组,从而造成 R 中这些元组在操作时被舍弃了,同样,S 中某些元组也可能被舍弃。这些被舍弃的元组称为悬浮元组(dangling tuple).
    除运算(division)
    • 设关系 R 除以关系 S 的结果为关系 T,则 T 包含所有在 R 但不在 S 中的属性及其值,且 T 的元组与 S 的元组的所有组合都在 R 中。
      给定关系 R(X,Y)和 S(Y,Z),其中 X、Y、Z 为属性组。R 中的 Y 与 S 中的 Y 可以有不同的属性名,但必须出自相同的域集。
      R 与 S 的除运算得到一个新的关系 P(X),P 是 R 中满足下列条件的元组在 X 属性列上的投影:元组在 X 上分量值 x 的象集 Y,包含 S 在 Y 上投影的集合。记作

      Yx 为 x 在 R 中的象集, x=t_{r}[x]
    关系演算
    • 关系演算是以数理逻辑中的谓词演算为基础的。按谓词变元的不同,关系演算可分为元组关系演算和域关系演算
    • 元组关系演算语言ALPHA
      • 元组关系演算以元组变量作为谓词变元的基本对象。
        ALPHA 语言主要有 GET、PUT、HOLD、UPDATE、DELETE、DROP 6 条语句,语句的基本格式为
        操作语句 工作空间名 (表达式):操作条件

        在元组关系演算系统中,称{t | φ(t)}为元组演算表达式。表示了使 φ(t)为真的元组集合。
      域关系演算语言QBE
      • 域关系演算以元组变量的分量(即域变量)作为谓词变元的基本对象. QBE 是 Query By Example(即通过例子进行查询)的简称,它最突出的特点是操作方式。它是一种高度非过程化的基于屏幕表格的查询语言,用户通过终端屏幕编辑程序,以填写表格的方式构造查询要求,而查询结果也是以表格形式显示.

    关系数据库标准语言 SQL

    SQL
    • 结构化查询语言(Structured Query Language,SQL)是关系数据库的标准语言,也是一个通用的、功能极强的关系数据库语言。其功能不仅仅是查询,而是包括数据库模式创建、数据库数据的插入与修改、数据库安全性完整性定义与控制等一系列功能。
    • SQL 是在 1974 年由 Boyce 和 Chamberlin 提出的,最初叫 Sequel,并在 IBM 公司研制的关系数据库管理系统原型 System R 上实现。
    • SQL 集数据查询(data query)、数据操纵(data manipulation)、数据定义(data definition)和数据控制(data control)功能于一体.
    • 支持 SQL 的关系数据库管理系统同样支持关系数据库三级模式结构其中外模式包括若干视图(view)和部分基本表(base table),数据库模式包括若干基本表,内模式包括若干存储文件(stored file)。
    • SQL 特点
        综合统一
        • 非关系模型(层次模型、网状模型)的数据语言一般都分为:
          (1)模式数据定义语言(Schema Data Definition Language,模式 DDL)。
          (2)外模式数据定义语言(Subschema Data Definition Language,外模式 DDL 或子模式 DDL)。
          (3)数据存储有关的描述语言(Data Storage Description Language, DSDL)。
          (4)数据操纵语言(Data Manipulation Language,DML)。
          它们分别用于定义模式、外模式、内模式和进行数据的存取与处置。当用户数据库投入运行后,如果需要修改模式,必须停止现有数据库的运行,转储数据,修改模式并编译后再重装数据库.
        • SQL 集数据定义语言、数据操纵语言、数据控制语言的功能于一体,语言风格统一,可以独立完成数据库生命周期中的全部活动.
        高度非过程化
        • 非关系数据模型的数据操纵语言是“面向过程”的语言,用“过程化”语言完成某项请求必须指定存取路径。而用 SQL 进行数据操作时,只要提出“做什么",而无须指明“怎么做",因此无须了解存取路径。存取路径的选择以及SQL的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。
      • 面向集合的操作方式
      • 以同一种语法结构提供多种使用方式
        • SQL 既是独立的语言,又是嵌入式语言。作为独立的语言,它能够独立地用于联机交互的使用方式,用户可以在终端键盘上直接键入 SQL 命令对数据库进行操作;作为嵌入式语言,SQL 语句能够嵌入到高级语言(例如 C、C++、Java)程序中,供程序员设计程序时使用。而在两种不同的使用方式下,SQL 的语法结构基本上是一致的。
      • 语言简洁,易学易用
    数据定义

    • 一个关系数据库管理系统的实例(instance)中可以建立多个数据库,一个数据库中可以建立多个模式,一个模式下通常包括多个表、视图和索引等数据库对象。
    • 模式
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        CREATE SCHEMA<模式名>AUTHORIZATION<用户名>;
        -- CREATE SCHEMA"S-T"AUTHORIZATION WANG;

        CREATE SCHEMA<模式名>AUTHORIZATION<用户名>[<表定义子句><视图定义子句<授权定义子句>];
        -- CREATE SCHEMA TEST AUTHORIZATION ZHANG -- 创建模式同时创建表
        -- CREATE TABLE TABI(COL1 SMALLINT,
        -- COL2 INT,
        -- COL3 CHAR(20),
        -- COL4 NUMERIC(10.3).
        -- COL5 DECIMAL(5,2)
        -- );
        DROP SCHEMA<模式名><CASCADE|RESTRICT>;
        CASCADE(级联),表示在删除模式的同时把该模式中所有的数据库对象全部删除;选择了 RESTRICT(限制),表示如果该模式中已经定义了下属的数据库对象(如表、视图等),则拒绝该删除语句的执行。只有当该模式中没有任何下属的对象时才能执行 DROP SCHEMA 语句。
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        CREATE TABLE<表名>(<列名><数据类型>[列级完整性约束条件]
        [,<列名><数据类型>[列级完整性约束条件]]
        ...
        [,<表级完整性约束条件>]);
        -- CREATE TABLE"S-T".Student(…); /*Student所属的模式是S-T*/

        ALTER TABLE<表名>
        [ADD [COLUMN]<新列名><数据类型>[完整性约束]]
        [ADD<表级完整性约束>]
        [DROP[COLUMN]<列名>[CASCADE| RESTRICT]]
        [DROP CONSTRAINT<完整性约束名>[RESTRICT|CASCADE ]]
        [ALTER COLUMN<列名><数据类型>];
        -- DROP CONSTRAINT子句用于删除指定的完整性约束条件

        DROP TABLE<表名>[RESTRICT|CASCADE];
        -- 若选择RESTRICT,则该表的删除是有限制条件的。欲删除的基本表不能被其他表的约束所引用(如CHECK,FOREIGN KEY等约束),不能有视图,不能有触发器(trigger),不能有存储过程或函数等。如果存在这些依赖该表的对象,则此表不能被删除。
        --若选择CASCADE,则该表的删除没有限制条件。在删除基本表的同时,相关的依赖对象,例如视图,都将被一起删除。
      • 当用户创建基本表(其他数据库对象也一样)时若没有指定模式,系统根据搜索路径(search path)来确定该对象所属的模式。搜索路径包含一组模式列表,关系数据库管理系统会使用模式列表中第一个存在的模式作为数据库对象的模式名。
      数据类型
      数据字典
      • 数据字典是关系数据库管理系统内部的一组系统表,它记录了数据库中所有的定义信息,包括关系模式定义、视图定义、索引定义、完整性约束定义、各类用户对数据库的操作权限、统计信息等。关系数据库管理系统在执行 SQL 的数据定义语句时,实际上就是在更新数据字典表中的相应信息。
      • {数据库存储用户数据, 数据字典存储定义数据库的数据}
      索引
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        CREATE [UNIQUE][CLUSTER] INDEX<索引名>
        ON<表名>(<列名>[<次序>],<列名>[<次序>]]…);
        -- UNIQUE 表明此索引的每一个索引值只对应唯一的数据记录。CLUSTER 表示要建立的索引是聚簇索引。
        -- 用<次序>指定索引值的排列次序,可选 ASC(升序)或 DESC(降序),默认值为 ASC。
        -- CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);

        ALTER INDEX<旧索引名> RENAME TO <新索引名>;

        DROP INDEX<索引名>;
      • 建立索引是加快查询速度的有效手段。能快速定位到需要查询的内容。
      • 数据库索引有多种类型,常见索引包括顺序文件上的索引、B+树索引、散列(hash)索引、位图索引等。
      • 索引虽然能够加速数据库查询,但需要占用一定的存储空间,当基本表更新时,索引要进行相应的维护,这些都会增加数据库的负担,因此要根据实际应用的需要有选择地创建索引。目前SQL标准中没有涉及索引,但商用关系数据库管理系统一般都支持索引机制,只是不同的关系数据库管理系统支持的索引类型不尽相同。
    数据查询
    •  
      1
      2
      3
      4
      5
      6
      -- SELECT语句的一般格式:
      SELECT [ALL/DISTINCT]<目标列表达式>[别名][,<目标列表达式>[别名]]…
      FROM<表名或视图名>[别名][,<表名或视图名>[别名]]…|(<SELECT语句>)[AS]<别名>
      [WHERE<条件表达式>]
      [GROUP BY<列名1>[HAVING<条件表达式>]]
      [ORDER BY<列名2>[ASC | DESC]];
        more
    • 单表查询
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        SELECT Cno,Ccredit
        FROM Course
        WHERE Cname LIKE 'DB\_Des_gn%' ESCAPE'\';
        -- ESCAPE'\'表示'\'为换码字符。这样匹配串中紧跟在\后面的字符“_”不再具有通配符的含义,转义为普通的“_”字符。

        SELECT*
        FROM Student
        ORDER BY Sdept,Sage DESC;
        -- 用ORDER BY子句对查询结果按照一个或多个属性列的升序(ASC)或降序(DESC)排列,默认值为升序。

        -- 聚集函数
        COUNT(*) -- 统计元组个数
        COUNT([DISTINCTIALL]<列名>) -- 统计一列中值的个数
        SUM([DISTINCT]ALL)<列名>)
        AVG([DISTINCT]ALL)<列名>)
        MAX([DISTINCT|ALL]<列名>)
        MIN([DISTINCT]ALL)<列名>)

        -- GROUP BY 分组
        SELECT Sno
        FROM SC
        GROUP BY Sno
        HAVING COUNT(*)>3;
      连接查询
        等值与非等值连接查询
        •  
          1
          2
          3
          4
          5
          6
          7
          8
          9
          -- 连接查询的WHERE子句中用来连接两个表的条件称为连接条件或连接谓词
          [<表名1>.]<列名1><比较运算符>[<表名2>.]<列名2>
          [<表名1>.]<列名I>BETWEEN [<表名2>.]<列名2>AND [<表名2>.]<列名3>
          -- 当连接运算符为=时,称为等值连接。使用其他运算符称为非等值连接。
          -- 连接谓词中的列名称为连接字段。连接条件中的各连接字段类型必须是可比的,但名字不必相同。

          SELECT Student.*,SC.*
          FROM Student,SC
          WHERE Student.Sno=SC.Sno;
        • 若在等值连接中把目标列中重复的属性列去掉则为自然连接
        自身连接
        • 连接操作不仅可以在两个表之间进行,也可以是一个表与其自己进行连接,称为表的自身连接。
        •  
          1
          2
          3
          SELECT FIRST.Cno,SECOND.Cpno
          FROM Course AS FIRST,Course AS SECOND -- AS 可无, 为表取别名以区分
          WHERE FIRST.Cpno = SECOND.Cno;
        外连接
        •  
          1
          2
          3
          SELECT Student.Sno,Sname,Ssex,Sage,Sdept,Cno,Grade
          FROM Student LEFT OUTER JOIN SC ON (Student.Sno=SC.Sno);
          -- 左外连接列出左边关系(如本例Student)中所有的元组,右外连接列出右边关系中所有的元组。
        多表连接
        • 两个以上的表进行连接
          1
          2
          3
          SELECT Student.Sno,Sname,Cname,Grade
          FROM Student,SC,Course
          WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno;
    集合查询
    • SELECT 语句的查询结果是元组的集合,所以多个 SELECT 语句的结果可进行集合操作。集合操作主要包括并操作UNION、交操作INTERSECT和差操作EXCEPT
      1
      2
      3
      4
      5
      6
      7
      SELECT
      FROM Student
      WHERE Sdept='CS'
      UNION
      SELECT
      FROM Student
      WHERE Sage<=19;
    基于派生表的查询
    • 子查询不仅可以出现在 WHERE 子句中,还可以出现在 FROM 子句中,这时子查询生成的临时派生表(derived table)成为主查询的查询对象
      1
      2
      3
      4
      SELECT Sno,Cno
      FROM SC,(SELECT Sno,Avg(Grade) FROM SC GROUP BY Sno)
      AS Avg_sc(avg_sno,avg_grade)
      WHERE SC.Sno=Avg_sc.avg_sno and SC.Grade>=Avg_sc.avg_grade;
    嵌套查询
    • 一个 SELECT-FROM-WHERE 语句称为一个查询块。将一个查询块嵌套在另一个查询块的 WHERE 子句或 HAVING 短语的条件中的查询称为嵌 套查询(nested query)。上层的查询块称为外层查询或父查询,下层查询块称为内层查询或子查询。
      1
      2
      3
      4
      5
      6
      SELECT Sname
      FROM Student
      WHERE Sno IN
      (SELECT Sno
      FROM SC
      WHERE Cno='2');
    • 带有IN谓词的子查询
      • 在嵌套查询中,子查询的结果往往是一个集合,所以谓词 IN 是嵌套查询中最经常使用的谓词。
        1
        2
        3
        4
        5
        6
        7
        SELECT Sno,Sname,Sdept
        FROM Student
        WHERE Sdept IN
        (SELECT Sdept
        FROM Student
        WHERE Sname='刘晨');
        -- 子查询的查询条件不依赖于父查询,称为不相关子查询。
      带有比较运算符的子查询
      •  
        1
        2
        3
        4
        5
        6
        SELECT Sno,Cno
        FROM SC x
        WHERE Grade>=(SELECT AVG(Grade)
        FROM SC y
        WHERE y.Sno=x.Sno);
        -- 如果子查询的查询条件依赖于父查询,这类子查询称为相关子查询(correlated subquery),整个查询语句称为相关嵌套查询(correlated nested query)语句。
      带有ANY(SOME)或ALL谓词的子查询
      •  
        1
        2
        3
        4
        5
        6
        SELECT Sname,Sage
        FROM Student
        WHERE Sage<ANY (SELECT Sage
        FROM Student
        WHERE Sdept='CS')
        AND Sdept<>'CS';
      带有EXISTS谓词的子查询
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        SELECT Sname
        FROM Student
        WHERE EXISTS
        (SELECT*
        FROM SC
        WHERE Sno=StudentSnO AND Cno='1');
        SELECT Sname
        FROM Student
        WHERE NOT EXISTS
        (SELECT*
        FROM SC
        WHERE Sno=Student.Sno AND Cno='1');
      • 一些带 EXISTS 或 NOT EXISTS 谓词的子查询不能被其他形式的子查询等价替换,但所有带 IN 谓词、比较运算符、ANY 和 ALL 谓词的子查询都能用带 EXISTS 谓词的子查询等价替换。
      • SQL 中没有全称量词(for all),但是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词:
      • SQL 语言中没有蕴涵(implication)逻辑运算,但是可以利用谓词演算将一个逻辑蕴涵的谓词等价转换为
    数据更新
      插入数据
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        -- 插入一个元组,
        INSERT
        INTO<表名>[(<属性列1>[,<属性列2>]…)]
        VALUES(<常量1>[,<常量2>]…);

        INSERT
        INTO Student (Sno,Sname,Ssex,Sdept,Sage)
        VALUES('201215128','陈冬','男','IS',18);

        -- 插入子查询结果
        INSERT
        INTO<表名>[(<属性列1>[,<属性列2>…])
        子查询;

        INSERT
        INTO Dept_age(Sdept,Avg_age)
        SELECT Sdept,AVG(Sage)
        FROM Student
        GROUP BY Sdept;
        -- 把另一个表中查询结果插入本表
      修改数据
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        UPDATE<表名>
        SET<列名>=<表达式>[,<列名>-<表达式>]…
        WHERE<条件>];

        UPDATE SC
        SET Grade=0
        WHERE Sno IN
        (SELECT Sno
        FROM Student
        WHERE Sdept='CS');
      删除数据
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        DELETE
        FROM<表名>
        [WHERE<条件>];

        DELETE
        FROM Student
        WHERE Sno='201215128';
        -- DELETE语句的功能是从指定表中删除满足WHERE子句条件的所有元组。如果省略WHERE子句则表示删除表中全部元组,但表的定义仍在字典中。
        -- 也就是说,DELETE语句删除的是表中的数据,而不是关于表的定义。
    空值处理
    • 判断一个属性的值是否为空值,用IS NULLIS NOT NULL来表示。
    • 属性定义(或者域定义)中有NOT NULL约束条件的不能取空值,加了UNIQUE限制的属性不能取空值,码属性不能取空值。
    • 空值与另一个值(包括另一个空值)的算术运算的结果为空值,空值与另一个值(包括另一个空值)的比较运算的结果为 UNKNOWN
    视图
      创建视图
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        CREATE VIEW<视图名>[(<列名>[,<列名>]…)]
        AS<子查询>
        [WITH CHECK OPTION];
        -- WITH CHECK OPTION表示对视图进行UPDATE、INSERT和DELETE操作时要
        -- 保证更新、插入或删除的行满足视图定义中的谓词条件(即子查询中的条件表达式)。

        CREATE VIEW IS_Student
        AS
        SELECT Sno.Sname,Sage
        FROM Student
        WHERE Sdept='IS'
        WITH CHECK OPTION;
        -- 由于在定义IS_Student视图时加上了WITH CHECK OPTION子句,以后对该视图进行插入、修改和删除操作时,关系数据库管理系统会自动加上Sdept='IS'的条件。

        -- 明确定义组成视图的各个属性列名
        CREATE VIEW S_G(Sno,Gavg)
        AS
        SELECT Sno,AVG(Grade)
        FROM SC
        GROUP BY Sno;
        -- 带有聚集函数和GROUP BY子句的查询来定义视图,这种视图称为分组视图。
        若一个视图是从单个基本表导出的,并且只是去掉了基本表的某些行和某些列,但保留了主码,则称这类视图为行列子集视图
      删除视图
      •  
        1
        2
        3
        DROP VIEW<视图名>[CASCADE];

        DROP VIEW IS_S1 CASCADE; /*删除了视图IS_S1和由它导出的所有视图*/
      查询视图
      • 像对基本表一样
      • 关系数据库管理系统执行对视图的查询时,首先进行有效性检查,检查查询中涉及的表、视图等是否存在。如果存在,则从数据字典中取出视图的定义,把定义中的子查询和用户的查询结合起来,转换成等价的对基本表的查询,然后再执行修正了的查询。这一转换过程称为视图消解(view resolution)
      • 目前多数关系数据库系统对行列子集视图的查询均能进行正确转换。但对非行列子集视图的查询就不一定能做转换了,因此这类查询应该直接对基本表进行。
      • 定义视图并查询视图与基于派生表的查询是有区别的。视图一旦定义,其定义将永久保存在数据字典中,之后的所有查询都可以直接引用该视图。而派生表只是在语句执行时临时定义,语句执行后该定义即被删除。
      更新视图
      • 更新视图是指通过视图来插入(INSERT)、删除(DELETE)和修改(UPDATE)数据。由于视图是不实际存储数据的虚表,因此对视图的更新最终要转换为对基本表的更新。像查询视图那样,对视图的更新操作也是通过视图消解,转换为对基本表的更新操作
      • 为防止用户通过视图对数据进行增加、删除、修改时,有意无意地对不属于视图范围内的基本表数据进行操作,可在定义视图时加上WITH CHECK OPTION子句。这样在视图上增、删、改数据时,关系数据库管理系统会检查视图定义中的条件,若不满足条件则拒绝执行该操作
      视图的作用
      • 简化用户的操作
      • 使用户能以多种角度看待同一数据
      • 对重构数据库提供了一定程度的逻辑独立性
        • {重构数据库的时候可以更改模式-外模式映射,即数据库到视图的映射使得用户的外模式保持不变}
      • 对机密数据提供安全保护
      • 更清晰地表达查询

    数据库安全性

    数据库安全性概述
    • 数据库的安全性是指保护数据库以防止不合法使用所造成的数据泄露、更改或破坏。
    • 数据库的不安全因素
      • 非授权用户对数据库的恶意存取和破坏
      • 数据库中重要或敏感的数据被泄露
      • 安全环境的脆弱性
        • 数据库的安全性与计算机系统的安全性,包括计算机硬件、操作系统、网络系统等的安全性是紧密联系的。操作系统安全的脆弱,网络协议安全保障的不足等都会造成数据库安全性的破坏。
      安全标准简介
      • 计算机以及信息安全技术方面有一系列的安全标准,最有影响的当推TCSEC和CC这两个标准。
      • TCSEC是指1985年美国国防部(Department of Defense,DoD)正式颁布的《DoD 可信计算机系统评估准则》(Trusted Computer System Evaluation Criteria,TCSEC或DoD85)。
      • 在 TCSEC 推出后的 10 年里,不同的国家都开始启动开发建立在 TCSEC 概念上的评估准则,如欧洲的信息技术安全评估准则(Information Technology Security Evaluation Criteria,ITSEC)、加拿大的可信计算机产品评估准则(Canadian Trusted Computer Product Evaluation Criteria,CTCPEC)、美国的信息技术安全联邦标准(Federal Criteria,FC)草案等。这些准则比 TCSEC 更加灵活,适应了 IT 技术的发展。
      • 为满足全球 IT 市场上互认标准化安全评估结果的需要,CTCPEC、FC、TCSEC和 ITSEC的发起组织于 1993 年起开始联合行动,解决原标准中概念和技术上的差异,将各 自独立的准则集合成一组单一的、能被广泛使用的 IT 安全准则,这一行动被称为通用准则(Common Criteria,CC)项目。项目发起组织的代表建立了专门的委员会来开发通用准则,历经多次讨论和修订,CCV2.1 版于 1999 年被 ISO 采用为国际标准,2001 年被我国采用为国家标准。
      • 目前CC已经基本取代了TCSEC,成为评估信息产品安全性的主要标准。
      • TCSEC
        • TCSEC 又称桔皮书。1991 年 4 月,美国国家计算机安全中心(National Computer Security Center,NCSC)颁布了《可信计算机系统评估准则关于可信数据库系统的解释》(TCSEC/Trusted Database Interpretation,TCSEC/TDI,即紫皮书),将 TCSEC 扩展到数据库管理系统。TCSEC/TDI中定义了数据库管理系统的设计与实现中需满足和用以进行安全性级别评估的标准,从 4 个方面来描述安全性级别划分的指标,即安全策略、责任、保证和文档。每个方面又细分为若干项。
        • 根据计算机系统对各项指标的支持情况,TCSEC/TDI 将系统划分为 4 组(division)7 个等级,依次是 D、C(Cl,C2)、B(B1,B2,B3)、A(A1),按系统可靠或可信程度逐渐增高
        CC
        • CC 是在上述各评估准则及具体实践的基础上通过相互总结和互补发展而来的。和早期的评估准则相比,CC 具有结构开放、表达方式通用等特点。CC 提出了目前国际上公认的表述信息技术安全性的结构,即把对信息产品的安全要求分为安全功能要求和安全保证要求。安全功能要求用以规范产品和系统的安全行为,安全保证要求解决如何正确有效地实施这些功能。安全功能要求和安全保证要求都以"类-子类-组件"的结构表述,组件是安全要求的最小构件块。
        • CC 的文本由三部分组成
        • 第一部分是简介和一般模型,介绍 CC 中的有关术语、基本概念和一般模型以及与评估有关的一些框架。
        • 第二部分是安全功能要求,列出了一系列类、子类和组件。由 11 大类、66 个子类和 135 个组件构成。
        • 第三部分是安全保证要求,列出了一系列保证类、子类和组件,包括 7 大类、26 个子类和 74 个组件。根据系统对安全保证要求的支持情况提出了评估保证级(Evaluation Assurance Level,EAL),从 EAL1 至 EAL7 共分为 7 级,按保证程度逐渐增高。
    数据库安全性控制
      包括用户身份鉴别、多层存取控制、审计、视图和数据加密等安全技术。
      用户身份鉴别
      • 用户身份鉴别是数据库管理系统提供的最外层安全保护措施。每个用户在系统中都有一个用户标识。每个用户标识由用户名(user name)和用户标识号(UID)两部分组成。UID 在系统的整个生命周期内是唯一的。系统内部记录着所有合法用户的标识,系统鉴别是指由系统提供一定的方式让用户标识自己的名字或身份。每次用户要求进入系统时,由系统进行核对,通过鉴定后才提供使用数据库管理系统的权限。
      • 常用的用户身份鉴别方法: 静态口令鉴别; 动态口令鉴别; 生物特征鉴别; 智能卡鉴别
      存取控制
      • 确保只授权给有资格的用户访问数据库的权限,同时令所有未被授权的人员无法接近数据,这主要通过数据库系统的存取控制机制实现。
      • 存取控制机制主要包括定义用户权限合法权限检查两部分。定义用户权限和合法权限检查机制一起组成了数据库管理系统的存取控制子系统。
      • C2 级的数据库管理系统支持自主存取控制(Discretionary Access Control,DAC),B1 级的数据库管理系统支持强制存取控制(Mandatory Access Control, MAC)。
      • 自主存取控制方法DAC
        • 用户对于不同的数据库对象有不同的存取权限,不同的用户对同一对象也有不同的权限,而且用户还可将其拥有的存取权限转授给其他用户。因此自主存取控制非常灵活。
        • 大型数据库管理系统都支持自主存取控制,SQL 标准也对自主存取控制提供支持,这主要通过 SQL 的GRANT语句和REVOKE语句来实现。
        • 用户权限是由两个要素组成的:数据库对象和操作类型。定义一个用户的存取权限就是要定义这个用户可以在哪些数据库对象上进行哪些类型的操作。在数据库系统中,定义存取权限称为授权(authorization)
        • 在非关系系统中,用户只能对数据进行操作,存取控制的数据库对象也仅限于数据本身。在关系数据库系统中,存取控制的对象不仅有数据本身(基本表中的数据、属性列上的数据),还有数据库模式(包括数据库、基本表、视图和索引的创建等)
        • 授权:授予与收回
          • GRANT
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            13
            14
            15
            16
            GRANT<权限>[,<权限>]…
            ON<对象类型><对象名>[,<对象类型><对象名>]
            TO<用户>[,<用户>]…
            [WITH GRANT OPTION];

            GRANT ALL PRIVILEGES
            ON TABLE Student, Course
            TO U2,U3;

            GRANT UPDATE(Sno),SELECT
            ON TABLE Student
            TO U4;

            GRANT UPDATE(Sno),SELECT
            ON TABLE Student
            TO U4;
          • REVOKE
            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            REVOKE<权限>[,<权限>]…
            ON<对象类型><对象名>[,<对象类型><对象名>]…
            FROM<用户>[,<用户>]…[CASCADE | RESTRICT];

            REVOKE INSERT
            ON TABLE SC
            FROM U5 CASCADE;

            REVOKE UPDATE(Sno)
            ON TABLE Student
            FROM U4;
            -- CASCADE级联收回本权限的同时必须先收回此权限所有者授予的其他用户权限, 否则报错;RESTRICT自动执行级联操作.
          创建数据库模式的权限
          • GRANT 和 REVOKE 语句向用户授予或收回对数据的操作权限。对创建数据库模式一类的数据库对象的授权则由数据库管理员在创建用户时实现
          1
          CREATE USER <usermame>[WITH][DBA|RESOURCE|CONNECT];
          数据库角色
          • 数据库角色是被命名的一组与数据库操作相关的权限,角色是权限的集合。因此,可以为一组具有相同权限的用户创建一个角色,使用角色来管理数据库权限可以简化授权的过程。在 SQL 中首先用 CREATE ROLE 语句创建角色,然后用 GRANT 语句给角色授权,用 REVOKE 语句收回授予角色的权限。
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          -- 角色的创建
          CREATE ROLE<角色名>

          CREATE ROLE R1;

          -- 给角色授权
          GRANT<权限>[<权限>]…
          ON<对象类型>对象名
          TO<角色>[,<角色>]…

          GRANT SELECT,UPDATE,INSERT
          ON TABLE Student
          TO RI;

          -- 将一个角色授予其他的角色或用户
          GRANT<角色1>[,<角色2>]…
          TO<角色3>[,<用户1>]…
          [WITH ADMIN OPTION]

          GRANT RI
          TO 王平,张明,赵玲
          -- 把角色授予某用户,或授予另一个角色。这样,一个角色(例如角色3)所拥
          -- 有的权限就是授予它的全部角色(例如角色1和角色2)所包含的权限的总和。
          -- 授予者或者是角色的创建者,或者拥有在这个角色上的ADMIN OPTION。
          -- 如果指定了WITH ADMIN OPTION子句,则获得某种权限的角色或用户还可以把这
          -- 种权限再授予其他的角色。

          -- 角色权限的收回
          REVOKE<权限>[,<权限>]…
          ON<对象类型><对象名>
          FROM<角色>[<角色>]…

          REVOKE SELECT
          ON TABLE Student
          FROM R1;

          REVOKE R1
          FROM 王平;
        强制存取控制方法MAC
        • 每一个数据库对象被标以一定的密级,每一个用户也被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。强制存取控制因此相对比较严格。
        • 所谓强制存取控制是指系统为保证更高程度的安全性,按照 TDI/TCSEC 标准中安全策略的要求所采取的强制存取检查手段。它不是用户能直接感知或进行控制的。强制存取控制适用于那些对数据有严格而固定密级分类的部门,例如军事部门或政府部门。
        • 在强制存取控制中,数据库管理系统所管理的全部实体被分为主体和客体两大类。
        • 主体是系统中的活动实体,既包括数据库管理系统所管理的实际用户,也包括代表用户的各进程。客体是系统中的被动实体,是受主体操纵的,包括文件、基本表、索引、视图等。对于主体和客体,数据库管理系统为它们每个实例(值)指派一个敏感度标记(label)。
        • 敏感度标记被分成若干级别,例如绝密(Top Secret,TS)、机密(Secret,S)、可信(Confidential,C)、公开(Public,P)等。密级的次序是TS>=S>=C>=P。主体的敏感度标记称为许可证级别(clearance level),客体的敏感度标记称为密级(classification level)。强制存取控制机制就是通过对比主体的敏感度标记和客体的敏感度标记,最终确定主体是否能够存取客体。
        • 客体的存取规则
          • (1)仅当主体的许可证级别大于或等于客体的密级时,该主体才能读取相应的客体。
          • (2)仅当主体的许可证级别小于或等于客体的密级时,该主体才能写相应的客体。
          • 强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体,只有符合密级标记要求的用户才可以操纵数据,从而提供了更高级别的安全性。较高安全性级别提供的安全保护要包含较低级别的所有保护,因此在实现强制存取控制时要首先实现自主存取控制(DAC),即自主存取控制与强制存取控制共同构成数据库管理系统的安全机制
    视图机制
    • 还可以为不同的用户定义不同的视图,把数据对象限制在一定的范围内。通过视图机制把要保密的数据对无权存取的用户隐藏起来,从而自动对数据提供一定程度的安全保护。视图机制间接地实现支持存取谓词的用户权限定义。
    审计
    • 如按照 TDITCSEC 标准中安全策略的要求,审计(audit)功能就是数据库管理系统达到 C2 以上安全级别必不可少的一项指标。
    • 审计功能把用户对数据库的所有操作自动记录下来放入审计日志(audit log)中。审计员可以利用审计日志监控数据库中的各种行为,重现导致数据库现有状况的一系列事件,找出非法存取数据的人、时间和内容等。还可以通过对审计日志分析,对潜在的威胁提前采取措施加以防范。
    • 可审计事件有服务器事件、系统权限、语句事件及模式对象事件,还包括用户鉴别、自主访问控制和强制访问控事件。换句话说,它能对普通和特权用户行为、各种表操作、身份鉴别、自主和强制访问控制等操作进行审计。它既能审计成功操作,也能审计失败操作
    • 数据库安全审计系统提供了一种事后检查的安全机制。
    • AUDIT 语句和 NOAUDIT 语句
      1
      2
      3
      4
      5
      6
      -- 对指定操作开启审计
      AUDIT ALTER, UPDATE
      ON SC;
      -- 关闭审计
      NOAUDIT ALTER,UPDATE
      ON SC;
    数据加密
      加密的基本思想是根据一定的算法将原始数据——明文(plain text)变换为不可直接识别的格式——密文(cipher text),从而使得不知道解密算法的人无法获知数据的内容。数据加密主要包括存储加密和传输加密
      • 存储加密
        对于存储加密,一般提供透明和非透明两种存储加密方式。透明存储加密是内核级加密保护方式,对用户完全透明;非透明存储加密则是通过多个加密函数实现的。
        透明存储加密是数据在写到磁盘时对数据进行加密,授权用户读取数据时再对其进行解密。由于数据加密对用户透明,数据库的应用程序不需要做任何修改,只需在创建表语句中说明需加密的字段即可。数据库管理系统将自动对数据进行加、解密工作。基于数据库内核的数据存储加密、解密方法性能较好,安全完备性较高。
      • 传输加密
        常用的传输加密方式如链路加密端到端加密。其中,链路加密对传输数据在链路层进行加密,它的传输信息由报头和报文两部分组成,前者是路由选择信息,而后者是传送的数据信息。这种方式对报文和报头均加密。
        相对地,端到端加密对传输数据在发送端加密,接收端解密。它只加密报文,不加密报头。与链路加密相比,它只在发送端和接收端需要密码设备,而中间节点不需要密码设备,因此它所需密码设备数量相对较少。但这种方式不加密报头,从而容易被非法监听者发现并从中获取敏感信息。
      • SSL
        • 一种基于基于安全套接层协议(Security Socket Layer,SSL)的数据库管理系统可信传输方案。它采用的是一种端到端的传输加密方式。在这个方案中,通信双方协商建立可信连接,一次会话采用一个密钥,传输数据在发送端加密,接收端解密,有效降低了重放攻击和恶意篡改的风险。此外,出于易用性考虑,这个方案的通信加密还对应用程序透明。它的实现思路包含以下三点。
        • (1)确认通信双方端点的可靠性
          数据库管理系统采用基于数字证书的服务器和客户端认证方式实现通信双方的可靠性确认。用户和服务器各自持有由知名数字证书认证书认证(Certificate Authority,CA)或企业内建 CA 颁发的数字证书,双方在进行通信时均首先向对方提供己方证书,然后使用
          本地的 CA 信任列表和证书撤销列表(Certificate Revocation List,CRL)对接收到的对方证书进行验证,以确保证书的合法性和有效性,进而保证对方确系通信的目的端。
        • (2)协商加密算法和密钥
          确认双方端点的可靠性后,通信双方协商本次会话的加密算法与密钥。在这个过程中,通信双方利用公钥基础设施(Public Key Infrastructure,PKI)方式保证了服务器和客户端的协商过程通信的安全可靠。
        • (3)可信数据传输
          在加密算法和密钥协商完成后,通信双方开始进行业务数据交换。与普通通信路径不同的是,这些业务数据在被发送之前将被用某一组特定的密钥进行加密和消息摘要计算,以密文形式在网络上传输。当业务数据被接收的时候,需用相同一组特定的密钥进行解密
          和摘要计算。所谓特定的密钥,是由先前通信双方磋商决定的,为且仅为双方共享,通常称之为会话密钥。第三方即使窃取传输密文,因无会话密钥也无法识别密文信息。一旦第三方对密文进行任何篡改,均将会被真实的接收方通过摘要算法识破。另外,会话密钥的生命周期仅限于本次通信,理论上每次通信所采用的会话密钥将不同,因此避免了使用固定密钥而引起的密钥存储类问题。
  • 其他安全性保护 - 为满足较高安全等级数据库管理系统的安全性保护要求,在自主存取控制和强制存取控制之外,还有推理控制以及数据库应用中隐蔽信道数据隐私保护等技术。
  • 数据库完整性

    概述
    • 数据库的完整性(integrity)是指数据的正确性(correctness)和相容性(compat-ability)。数据的正确性是指数据是符合现实世界语义、反映当前实际状况的;数据的相容性是指数据库同一对象在不同关系表中的数据是符合逻辑的。
    • 为维护数据库的完整性,数据库管理系统必须能够实现如下功能:提供定义完整性约束条件的机制;提供完整性检查的方法;进行违约处理
    实体完整性
    • 关系模型的实体完整性在 CREATE TABLE 中用 PRIMARY KEY 定义。对单属性构成的码有两种说明方法,一种是定义为列级约束条件,另一种是定义为表级约束条件。对多个属性构成的码只有一种说明方法,即定义为表级约束条件。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      CREATE TABLE Student
      (Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/
      Sname CHAR(20) NOT NULL,
      Ssex CHAR(2),
      Sage SMALLINT,
      Sdept CHAR(20)
      );

      CREATE TABLE Student
      (Sno CHAR(9),
      Sname CHAR(20) NOT NULL
      Ssex CHAR(2),
      Sage SMALLINT,
      Sdept CHAR(20).
      PRIMARY KEY(Sno); /*在表级定义主码*/
      );
      CREATE TABLE SC
      (Sno CHAR(9) NOT NULL,
      Cno CHAR(4) NOT NULL,
      Grade SMALLINT,
      PRIMARY KEY (Sno,Cno) /*只能在表级定义主码*/
      );
    • 实体完整性检查和违约处理
      • 每当用户程序对基本表插入一条记录或对主码列进行更新操作时,实体完整性规则自动进行检查。
      • (1)检查主码值是否唯一,如果不唯一则拒绝插入或修改。
      • (2)检查主码的各个属性是否为空,只要有一个为空就拒绝插入或修改。从而保证了实体完整性。
    参照完整性
    • 关系模型的参照完整性在 CREATE TABLE 中用 FOREIGN KEY 短语定义哪些列为外码,用 REFERENCES 短语指明这些外码参照哪些表的主码。
      1
      2
      3
      4
      5
      6
      7
      8
      CREATE TABLE SC
      (Sno CHAR(9) NOT NULL,
      Cno CHAR(4) NOT NULL,
      Grade SMALLINT,
      PRIMARY KEY (Sno,Cno), /*在表级定义实体完整性*/
      FOREIGN KEY(Sno) REFERENCES Student(Sno), /*在表级定义参照完整性*/
      FOREIGN KEY (Cno) REFERENCES Course(Cno), /*在表级定义参照完整性*/
      );
    • 参照完整性检查和违约处理
      • 参照完整性将两个表中的相应元组联系起来了。因此,对被参照表和参照表进行增、删、改操作时有可能破坏参照完整性,必须进行检查以保证这两个表的相容性。
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        -- 一般地,当对参照表和被参照表的操作违反了参照完整性时,系统选用默认策略,即
        -- 拒绝执行。如果想让系统采用其他策略则必须在创建参照表时显式地加以说明。
        CREATE TABLE SC
        (Sno CHAR(9),
        Cno CHAR(4),
        Grade SMALLINT,
        PRIMARY KEY(Sno,Cno), /*在表级定义实体完整性,Sno、Cno都不能取空值*/
        FOREIGN KEY(Sno)REFERENCES Student(Sno) /*在表级定义参照完整性*/
        ON DELETE CASCADE
        /*产当删除Student表中的元组时,级联删除SC表中相应的元组*/
        ON UPDATE CASCADE,
        /*户当更新Student表中的sno时,级联更新SC表中相应的元组*/
        FOREIGN KEY (Cno) REFERENCES Course(Cno) /*在表级定义参照完整性*/
        ON DELETE NO ACTION
        /*当删除Course表中的元组造成与SC表不一致时,拒绝删除*/
        ON UPDATE CASCADE
        /*当更新Course表中的cno时,级联更新SC表中相应的元组*/
        );
    用户定义的完整性
    • 用户定义的完整性就是针对某一具体应用的数据必须满足的语义要求。
    • 用户定义完整性的检查和违约处理
      • 数据库管理系统检查, 不满足元组或属性上的约束条件的, 该操作拒绝执行.
      属性上的约束条件
      •  
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        -- 不允许空值
        CREATE TABLE SC
        (Sno CHAR(9) NOT NULL, /*Sno属性不允许取空值*/
        Cno CHAR(4) NOT NULL, /*Cno属性不允许取空值*/
        Grade SMALLINT NOT NULL, /*Grade属性不允许取空值*/
        PRIMARY KEY (Sno,Cno), /*在表级定义实体完整性,隐含了Sno、Cno不允
        许取空值,在列级不允许取空值的定义可不写*/
        );
        -- 列值唯一
        CREATE TABLE DEPT
        (Deptno NUMERIC(2),
        Dname CHAR(9) UNIQUE NOT NULL,/*要求Dname列值唯一,且不能取空值*/
        Location CHAR(10),
        PRIMARY KEY(Deptno)
        );
        -- CHECK 短语指定列值 应该满足的条件
        CREATE TABLE Student
        (Sno CHAR(9) PRIMARY KEY, /*在列级定义主码*/
        Sname CHAR(8) NOT NULL, /* Sname属性不允许取空值*/
        Ssex CHAR(2)CHECK (SsexIN (男,女)), /*性别属性Sscx只允许取男或女*/
        Sage SMALLINT,
        Sdept CHAR(20)
        );
      元组上的约束条件
      • 同属性值限制相比,元组级的限制可以设置不同属性之间的取值的相互约束条件。
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        CREATE TABLE Student
        (Sno CHAR(9),
        Sname CHAR(8) NOT NULL,
        Ssex CHAR(2),
        Sage SMALLINT,
        Sdept CHAR(20),
        PRIMARY KEY (Sno),
        CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')
        ); /*定义了元组中Sname和Ssex两个属性值之间的约束条件*/
        -- 性别是女性的元组都能通过该项CHECK检查,因为Ssex='女'成立;当性别是男性时,
        -- 要通过检查则名字一定不能以Ms.打头,因为Ssex='男'时,条件要想为真值,Sname NOT
        -- LIKE'Ms.%'须为真值。
    完整性约束命名子句
    • SQL 还在 CREATE TABLE 语句中提供了完整性约束命名子句 CONSTRAINT(n.限制;限定;),用来对完整性约束条件命名,从而可以灵活地增加、删除一个完整性约束条件。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      -- 完整性约束命名子句
      CONSTRAINT<完整性约束条件名><完整性约束条件>
      CREATE TABLE Student
      (Sno NUMERIC(6)
      CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),
      Sname CHAR(20)
      CONSTRAINT C2 NOT NULL,
      Sage NUMERIC(3)
      CONSTRAINT C3 CHECK (Sage<30),
      Ssex CHAR(2)
      CONSTRAINT C4 CHECK (Ssex IN(男,女)),
      CONSTRAINT StudentKey PRIMARY KEY(Sno) -- 主码约束(命名为StudentKey)
      );
      -- 修改表中的完整性限制
      ALTER TABLE Student
      DROP CONSTRAINT C1;
      ALTER TABLE Student
      ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999);
      ALTER TABLE Student
      DROP CONSTRAINT C3;
      ALTER TABLE Student
      ADD CONSTRAINT C3 CHECK(Sage<40);
    域中定义完整性
    • 域是一组具有相同数据类型的值的集合。SQL 支持域的概念,并可以用 CREATE DOMAIN 语句建立一个域以及该域应该满足的完整性约束条件,然后就可以用域来定义属性。这样定义的优点是,数据库中不同的属性可以来自同一个域,当域上的完整性约束条件改变时只要修改域的定义即可,而不必一一修改域上的各个属性。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      -- 建立一个性别域GenderDomain,并对其中的限制命名。
      CREATE DOMAIN GenderDomain CHAR(2)
      CONSTRAINT GD CHECK(VALUE IN(男,女));
      -- 删除域GenderDomain的限制条件GD。
      ALTER DOMAIN GenderDomain
      DROP CONSTRAINT GD;
      -- 在域GenderDomain上增加性别的限制条件GDD。
      ALTER DOMAIN GenderDomain
      ADD CONSTRAINT GDD CHECK (VALUE IN('1','0'));
    断言
    • SQL 中可以使用数据定义语言中的 CREATE ASSERTION 语句,通过声明性断言(declarative assertions)来指定更具一般性的约束。可以定义涉及多个表或聚集操作的比较复杂的完整性约束。断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行. 断言为真才会继续执行.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      -- 创建断言
      CREATE ASSERTION <断言名><CHECK子句>

      -- 制每一门课程最多60名学生选修。
      CREATE ASSERTIONASSE_SC_CNUM1
      CHECK( 60>=ALL(SELECT count(*) /*此断言的谓词,涉及聚集操作count*/
      FROM SC /*和分组函数group by的SQL语句*/
      GROUP by cno)
      );

      -- 删除断言
      DROP ASSERTION<断言名>;
    触发器
    • 触发器(trigger)是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,触发器将被保存在数据库服务器中。任何用户对表的增、删、改操作均由服务器自动激活相应的触发器,在关系数据库管理系统核心层进行集中的完整性控制。触发器类似于约束,但是比约束更加灵活,可以实施更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
    • 触发器又叫做事件一条件-动作(event-condition-action)规则.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      CREATE TRIGGER<触发器名> /*每当触发事件发生时,该触发器被激活*/
      {BEFORE|AFTER}<触发事件>ON<表名> /*指明触发器激活的时间是在执行触发事件前或后*/
      REFERENCING NEW|OLD ROW AS<变量> /*REFERENCING指出引用的变量*/
      FOR EACH {ROW | STATEMENT} /*定义触发器的类型,指明动作体执行的频率*/
      [WHEN<触发条件>]<触发动作体> /*仅当触发条件为真时才执行触发动作体*/

      -- 当对表SC的Grade属性进行修改时,若分数增加了10则将此次操作记录到另一个表SC_U(Sno、Cno、Oldgrade、Newgrade)中
      CREATE TRIGGER SC_T /*SC_T是触发器的名字*/
      AFTER UPDATE OF Grade ON SC /*UPDATE OF Grade ON SC是触发事件,*/
      /*AFTER是触发的时机,表示当对SC的Grade属性修改完后再触发下面的规则*/
      REFERENCING
      OLDROW AS OldTuple,
      NEWROW AS NewTuple
      FOR EACH ROW /*行级触发器,即每执行一次Grade的更新,下面的规则就执行一次*/
      WHEN (NewTuple.Grade>=1.1*OldTuple.Grade) /*触发条件,只有该条件为真时才执行*/
      INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade)
      VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade);

      -- 每次对表Student的插入操作所增加的学生个数记录到表StudentInsertLog中。
      CREATE TRIGGER Student_Count
      AFTER INSERT ON Student 指明触发器激活的时间是在执行INSERT*
      REFERENCING
      NEWTABLE AS DELTA
      FOR EACH STATEMENT /*语句级触发器,即执行完INSERT语句后下面的触发动作体才执行一次*/
      INSERT INTO StudentInsertLog(Numbers)
      SELECT COUNT(*)FROM DELTA;

      CREATE TRIGGER Insert_Or_Update_Sal /*对教师表插入或更新时激活触发器*/
      BEFORE INSERT OR UPDATE ON Teacher
      REFERENCING NEW row AS newTuple
      FOR EACH ROW
      BEGIN /*定义触发动作体,这是一个PLSQL过程块*/
      IF(newtuple.Job='教授') AND (newtuple.Sal<4000) /*因为是行级触发器,可在过程体中*/
      THEN newtuple.Sal:=4000; /*使用插入或更新操作后的新值*/
      END IF;
      END

      -- 删除触发器
      DROP TRIGGER<触发器名>ON<表名>;

    参考

    1. 数据库系统概论/王珊 第五版
    • Author:

      slacr_

    • Copyright:

    • Published:

      May 22, 2023

    • Updated:

      May 22, 2023

    Buy me a cup of coffee ☕.

    1000000