数 据 库 系 统 基 础 1/54 数 据 库 系 统 基 础 哈 尔 滨 工 业 大 学 2011.~2012.
数 据 库 系 统 基 础 2/54 第 6 章 数 据 库 管 理 与 维 护
数 据 库 系 统 基 础 3/54 第 6 章 数 据 库 管 理 与 维 护 6.1 数 据 库 管 理 员 的 基 本 职 责 6.2 数 据 库 存 储 与 性 能 管 理 6.3 数 据 库 完 整 性 与 安 全 性 控 制 ---- 数 据 库 完 整 性 的 概 念 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ---- 数 据 库 安 全 性 的 概 念 ---- SQL-DCL 中 关 于 安 全 性 的 命 令 ---- 数 据 字 典 / 系 统 目 录 和 模 式 6.4 数 据 库 故 障 恢 复
数 据 库 系 统 基 础 4/54 ---- 数 据 库 完 整 性 的 概 念 第 2 章 介 绍 的 关 系 模 型 中 有 完 整 性 要 求 实 体 完 整 性 参 照 完 整 性 用 户 自 定 义 完 整 性 第 5 章 介 绍 的 数 据 库 设 计 中, 在 E-R 图 /IDEF1X 图 中 有 很 多 的 完 整 性 约 束 条 件, 如 何 施 加 到 数 据 库 的 定 义 中, 如 何 起 作 用 呢?
数 据 库 系 统 基 础 5/54 ---- 数 据 库 完 整 性 的 概 念 ( 续 ) 数 据 库 完 整 性 DB Integrity 是 指 DBMS 应 保 证 DB 在 任 何 情 况 下 的 正 确 性 有 效 性 和 一 致 性 广 义 完 整 性 : 语 义 完 整 性 并 发 控 制 安 全 控 制 DB 故 障 恢 复 等 狭 义 完 整 性 : 专 指 语 义 完 整 性,DBMS 通 常 有 专 门 的 完 整 性 管 理 机 制 与 程 序 来 处 理 语 义 完 整 性 问 题 ( 本 讲 义 指 语 义 完 整 性 )
数 据 库 系 统 基 础 6/54 ---- 数 据 库 完 整 性 的 概 念 ( 续 ) 为 什 么 会 引 发 数 据 库 完 整 性 的 问 题 呢? 不 正 当 的 数 据 库 操 作, 如 输 入 错 误 操 作 失 误 程 序 处 理 失 误 等 数 据 库 完 整 性 管 理 的 作 用 防 止 和 避 免 数 据 库 中 不 合 理 数 据 的 出 现 DBMS 应 尽 可 能 地 自 动 防 止 DB 中 语 义 不 合 理 现 象 如 DBMS 不 能 自 动 防 止, 则 需 要 应 用 程 序 员 和 用 户 在 进 行 数 据 库 操 作 时 处 处 加 以 小 心, 每 写 一 条 SQL 语 句 都 要 考 虑 是 否 符 合 语 义 完 整 性, 这 种 工 作 负 担 是 非 常 沉 重 的, 因 此 应 尽 可 能 多 地 让 DBMS 来 承 担
数 据 库 系 统 基 础 7/54 ---- 数 据 库 完 整 性 的 概 念 ( 续 ) DBMS 怎 样 自 动 保 证 完 整 性 呢? DBMS 允 许 用 户 定 义 一 些 完 整 性 约 束 规 则 ( 用 SQL-DDL 来 定 义 ) 当 有 DB 更 新 操 作 时,DBMS 自 动 按 照 完 整 性 约 束 条 件 进 行 检 查, 以 确 保 更 新 操 作 符 合 语 义 完 整 性 完 整 性 约 束 条 件 ( 或 称 完 整 性 约 束 规 则 ) 的 一 般 形 式 Integrity Constraint ::= ( O,P,A,R) O 数 据 集 合 : 约 束 的 对 象? 列 多 列 ( 元 组 ) 元 组 集 合 P 谓 词 条 件 : 什 么 样 的 约 束? A 触 发 条 件 : 什 么 时 候 检 查? R 违 约 响 应 : 不 满 足 时 怎 么 办?
数 据 库 系 统 基 础 8/54 ---- 数 据 库 完 整 性 的 概 念 ( 续 ) 完 整 性 约 束 条 件 的 类 别 域 完 整 性 约 束 条 件 施 加 于 某 一 列 上, 对 给 定 列 上 所 要 更 新 的 某 一 候 选 值 是 否 可 以 接 受 进 行 约 束 条 件 判 断, 这 是 孤 立 进 行 的 关 系 完 整 性 约 束 条 件 施 加 于 关 系 /table 上, 对 给 定 table 上 所 要 更 新 的 某 一 候 选 元 组 是 否 可 以 接 受 进 行 约 束 条 件 判 断, 或 是 对 一 个 关 系 中 的 若 干 元 组 和 另 一 个 关 系 中 的 若 干 元 组 间 的 联 系 是 否 可 以 接 受 进 行 约 束 条 件 判 断
数 据 库 系 统 基 础 9/54 ---- 数 据 库 完 整 性 的 概 念 ( 续 ) 完 整 性 约 束 条 件 的 进 一 步 分 类 约 束 来 源 分 类 结 构 约 束 : 来 自 于 模 型 的 约 束, 例 如 函 数 依 赖 约 束 主 键 约 束 ( 实 体 完 整 性 ) 外 键 约 束 ( 参 照 完 整 性 ), 只 关 心 数 值 相 等 与 否 是 否 允 许 空 值 等 ; 内 容 约 束 : 来 自 于 用 户 的 约 束, 如 用 户 自 定 义 完 整 性, 关 心 元 组 或 属 性 的 取 值 范 围 例 如 Student 表 的 Sage 属 性 值 在 15 岁 至 40 岁 之 间 等
数 据 库 系 统 基 础 10/54 ---- 数 据 库 完 整 性 的 概 念 ( 续 ) 完 整 性 约 束 条 件 的 进 一 步 分 类 约 束 状 态 分 类 静 态 约 束 : 要 求 DB 在 任 一 时 候 均 应 满 足 的 约 束 ; 例 如 Sage 在 任 何 时 候 都 应 满 足 大 于 0 而 小 于 150( 假 定 人 活 最 大 年 龄 是 150) 动 态 约 束 : 要 求 DB 从 一 状 态 变 为 另 一 状 态 时 应 满 足 的 约 束 ; 例 如 工 资 只 能 升, 不 能 降 : 工 资 可 以 是 800 元, 也 可 以 是 1000 元 ; 可 以 从 800 元 更 改 为 1000 元, 但 不 能 从 1000 元 更 改 为 800 元
数 据 库 系 统 基 础 11/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 SQL-DDL 提 供 了 诸 多 完 整 性 约 束 的 定 义, 首 先 完 整 性 约 束 定 义 体 现 在 Create Table 语 句 中 CREATE TABLE tablename ( ( colname datatype [ DEFAULT { default_constant NULL} ] [ col_constr {col_constr...} ], table_constr {, { colname datatype [DEFAULT { default_constant NULL} ] [col_constr {col_constr...} ], table_constr }... } );
数 据 库 系 统 基 础 12/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) Col_constr 列 约 束 : 一 种 域 约 束 类 型, 对 单 一 列 的 值 进 行 约 束 { NOT NULL // 列 值 非 空 [ CONSTRAINT constraintname ] // 为 约 束 命 名, 便 于 以 后 撤 消 { UNIQUE // 列 值 是 唯 一 PRIMARY KEY // 列 为 主 键 CHECK (search_cond) // 列 值 满 足 条 件, 条 件 只 能 使 用 列 当 前 值 REFERENCES tablename [(colname) ] [ON DELETE CASCADE] } } // 引 用 另 一 表 tablename 的 列 colname 的 值, 如 有 ON DELETE CASCADE 语 句, 则 删 除 被 引 用 表 的 某 列 值 v 时, 要 将 本 表 的 该 列 值 为 v 的 列 值 更 新 为 null; 缺 省 为 无 操 作 Col_constr 列 约 束 : 只 能 应 用 在 单 一 列 上, 其 后 面 的 约 束 如 UNIQUE, PRIMARY 及 search_cond 只 能 是 单 一 列 唯 一 单 一 列 为 主 键 和 单 一 列 相 关
数 据 库 系 统 基 础 13/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) Col_constr 列 约 束 示 例 Create Table Student ( S# char(8) not null unique, Sname char(10), Ssex char(2) constraint ctssex check (Ssex= 男 or Ssex= 女 ), Sage integer check (Sage>=1 and Sage<150), D# char(2) references Dept(D#) on delete cascade, Sclass char(6) ); // 假 定 Ssex 只 能 取 { 男, 女 }, 1=<Sage<=150 Create Table Course ( C# char(3), Cname char(12), Chours integer, Credit float(1) constraint ctcredit check (Credit >=0.0 and Credit<=5.0 ), T# char(3) references Teacher(T#) on delete cascade ); // 假 定 每 门 课 学 分 最 多 5 分, 最 少 0 分
数 据 库 系 统 基 础 14/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) table_constr 表 约 束 : 一 种 关 系 约 束 类 型, 对 多 列 或 元 组 的 值 进 行 约 束 [ CONSTRAINT constraintname ] // 为 约 束 命 名, 便 于 以 后 撤 消 { UNIQUE (colname {, colname...}) // 几 列 值 组 合 在 一 起 是 唯 一 PRIMARY KEY (colname {, colname...}) // 几 列 联 合 为 主 键 CHECK (search_condition) // 元 组 多 列 值 共 同 满 足 条 件 // 条 件 中 只 能 使 用 同 一 元 组 的 不 同 列 当 前 值 FOREIGN KEY (colname {, colname...}) REFERENCES tablename [(colname {, colname...})] [ON DELETE CASCADE] } // 引 用 另 一 表 tablename 的 若 干 列 的 值 作 为 外 键 table_constr 表 约 束 : 是 应 用 在 关 系 上, 即 对 关 系 的 多 列 或 元 组 进 行 约 束, 列 约 束 是 其 特 例
数 据 库 系 统 基 础 15/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) table_constr 表 约 束 示 例 Create Table Student ( S# char(8) not null unique, Sname char(10), Ssex char(2) constraint ctssex check (Ssex= 男 or Ssex= 女 ), Sage integer check (Sage>1 and Sage<150), D# char(2) references Dept(D#) on delete cascade, Sclass char(6), primary key(s#) ); Create Table Course ( C# char(3), Cname char(12), Chours integer, Credit float(1) constraint ctcredit check (Credit >=0.0 and Credit<=5.0 ), T# char(3) references Teacher(T#) on delete cascade, primary(c#), constraint ctcc check(chours/credit = 20) ); // 假 定 严 格 约 束 20 学 时 一 个 学 分
数 据 库 系 统 基 础 16/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) table_constr 表 约 束 示 例 Create Table SC ( S# char(8), C# char(3), Score float(1) constraint ctscore check (Score>=0.0 and Score<=100.0), forergn key (S#) references student(s#) on delete cascade, forergn key (C#) references course(c#) on delete cascade ); check 中 的 条 件 可 以 是 Select-From-Where 内 任 何 Where 后 的 语 句, 包 含 子 查 询 比 如 SC 定 义 中 不 使 用 外 键, 则 可 如 下 约 束 : Create Table SC ( S# char(8) check( S# in (select S# from student)), C# char(3) check( C# in (select C# from course)), Score float(1) constraint ctscore check (Score>=0.0 and Score<=100.0),
数 据 库 系 统 基 础 17/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) Create Table 中 定 义 的 表 约 束 或 列 约 束 可 以 在 以 后 根 据 需 要 进 行 撤 消 或 追 加 撤 消 或 追 加 约 束 的 语 句 是 Alter Table( 不 同 系 统 可 能 有 差 异 ) ALTER TABLE tblname [ADD ( { colname datatype [DEFAULT {default_const NULL} ] [col_constr {col_constr...} ], table_constr } {, colname...}) ] [DROP { COLUMN columnname (columnname {, columnname })}] [MODIFY ( columnname data-type [DEFAULT {default_const NULL } ] [ [ NOT ] NULL ] {, columnname...})] [ADD CONSTRAINT constr_name] [DROP CONSTRAINT constr_name] [DROP PRIMARY KEY ] ;
数 据 库 系 统 基 础 18/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 例 如, 撤 消 SC 表 的 ctscore 约 束 ( 由 此 可 见, 未 命 名 的 约 束 是 不 能 撤 消 ) Alter Table SC DROP CONSTRAINT ctscore; 例 如, 若 要 再 对 SC 表 的 score 进 行 约 束, 比 如 分 数 在 0~150 之 间, 则 可 新 增 加 一 个 约 束 在 Oracle 中 增 加 新 约 束, 需 要 通 过 修 改 列 的 定 义 来 完 成 Alter Table SC Modify ( Score float(1) constraint nctscore check (Score>=0.0 and Score<=150.0) ); 有 些 DBMS 支 持 独 立 的 追 加 约 束, 注 意 书 写 格 式 可 能 有 些 差 异 Alter Table SC Add Constraint nctscore check (Score>=0.0 and Score<=150.0) );
数 据 库 系 统 基 础 19/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) SQL-DDL 提 供 的 另 一 种 完 整 性 保 证 机 制 是 触 发 器 Trigger Create Table 中 的 表 约 束 和 列 约 束 基 本 上 都 是 静 态 的 约 束, 也 基 本 上 都 是 对 单 一 列 或 单 一 元 组 的 约 束 ( 尽 管 有 参 照 完 整 性 ), 为 实 现 动 态 约 束 以 及 多 个 元 组 之 间 的 完 整 性 约 束, 就 需 要 触 发 器 技 术 Trigger Trigger 是 一 种 过 程 性 完 整 性 约 束 ( 相 比 之 下,Create Table 中 定 义 的 都 是 非 过 程 性 约 束 ), 是 一 段 程 序, 该 程 序 可 以 在 特 定 的 时 刻 被 自 动 触 发 执 行, 比 如 在 一 次 更 新 操 作 之 前 执 行, 或 在 更 新 操 作 之 后 执 行
数 据 库 系 统 基 础 20/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger CREATE TRIGGER trigger_name BEFORE AFTER { INSERT DELETE UPDATE [OF colname {, colname...}] } ON tablename [REFERENCING corr_name_def {, corr_name_def...} ] [FOR EACH ROW FOR EACH STATEMENT] [WHEN // 对 更 新 操 作 的 每 一 条 结 果 ( 前 者 ), 或 整 个 更 新 操 作 完 成 ( 后 者 ) (search_condition)] // 检 查 条 件, 如 满 足 执 行 下 述 程 序 { statement // 单 行 程 序 直 接 书 写, 多 行 程 序 要 用 下 行 方 式 BEGIN ATOMIC statement; { statement;...} END } 触 发 器 Trigger 意 义 : 当 某 一 事 件 发 生 时 (Before After), 对 该 事 件 产 生 的 结 果 ( 或 是 每 一 元 组, 或 是 整 个 操 作 的 所 有 元 组 ), 检 查 条 件 search_condition, 如 果 满 足 条 件, 则 执 行 后 面 的 程 序 段 条 件 或 程 序 段 中 引 用 的 变 量 可 用 corr_name_def 来 限 定
数 据 库 系 统 基 础 21/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger( 续 ) 事 件 :BEFORE AFTER { INSERT DELETE UPDATE } 当 一 个 事 件 (Insert, Delete, 或 Update) 发 生 之 前 Before 或 发 生 之 后 After 触 发 操 作 发 生, 执 行 触 发 器 操 作 需 处 理 两 组 值 : 更 新 前 的 值 和 更 新 后 的 值, 这 两 个 值 由 corr_name_def 的 使 用 来 区 分
数 据 库 系 统 基 础 22/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger( 续 ) corr_name_def 的 定 义 { OLD [ROW] [AS] old_row_corr_name // 更 新 前 的 旧 元 组 命 别 名 为 NEW [ROW] [AS] new_row_corr_name // 更 新 后 的 新 元 组 命 别 名 为 OLD TABLE [AS] old_table_corr_name // 更 新 前 的 旧 Table 命 别 名 为 NEW TABLE [AS] new_table_corr_name // 更 新 后 的 新 Table 命 别 名 为 } corr_name_def 将 在 检 测 条 件 或 后 面 的 动 作 程 序 段 中 被 引 用 处 理
数 据 库 系 统 基 础 23/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger 示 例 一 设 计 一 个 触 发 器 当 进 行 Teacher 表 更 新 元 组 时, 使 其 工 资 只 能 升 不 能 降 create trigger teacher_chgsal before update of salary on teacher referencing new x, old y for each row when (x.salary < y.salary) begin raise_application_error(-20003, 'invalid salary on update'); end; // 此 条 语 句 为 Oracle 的 错 误 处 理 函 数
数 据 库 系 统 基 础 24/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger 示 例 二 假 设 student(s#, Sname, SumCourse), SumCourse 为 该 同 学 已 学 习 课 程 的 门 数, 初 始 值 为 0, 以 后 每 选 修 一 门 都 要 对 其 增 1 设 计 一 个 触 发 器 完 成 上 述 功 能 create trigger sumc after insert on sc referencing new row newi for each row begin update student set SumCourse = SumCourse + 1 where S# = :newi.s# ; end;
数 据 库 系 统 基 础 25/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger 示 例 三 假 设 student(s#, Sname, Sage, Ssex, Sclass) 中 某 一 学 生 要 变 更 其 主 码 S# 的 值, 如 使 其 原 来 的 98030101 变 更 为 99030131, 此 时 sc 表 中 该 同 学 已 选 课 记 录 的 S# 也 需 自 动 随 其 改 变 设 计 一 个 触 发 器 完 成 上 述 功 能 create trigger upds# after update of S# on student referencing old oldi, new newi for each row begin update sc set S# = newi.s# where S# = :oldi.s# ; end;
数 据 库 系 统 基 础 26/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger 示 例 四 假 设 student(s#, Sname, SumCourse), 当 删 除 某 一 同 学 S# 时, 该 同 学 的 所 有 选 课 也 都 要 删 除 设 计 一 个 触 发 器 完 成 上 述 功 能 create trigger dels# after delete on Student referencing old oldi for each row begin delete sc where S# = :oldi.s# ; end;
数 据 库 系 统 基 础 27/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger 示 例 五 假 设 student(s#, Sname, SumCourse), 当 删 除 某 一 同 学 S# 时, 该 同 学 的 所 有 选 课 中 的 S# 都 要 置 为 空 值 设 计 一 个 触 发 器 完 成 上 述 功 能 create trigger dels# after delete on Student referencing old oldi for each row begin update sc set S# = Null where S# = :oldi.s# ; end;
数 据 库 系 统 基 础 28/54 ---- SQL-DDL 中 关 于 完 整 性 的 命 令 ( 续 ) 触 发 器 Trigger 示 例 六 假 设 Dept(D#, Dname, Dean), 而 Dean 一 定 是 该 系 教 师 Teacher(T#, Tname, D#, Salary) 中 工 资 最 高 的 教 师 设 计 一 个 触 发 器 完 成 上 述 功 能 create trigger upddean after insert on Dept, update of Dean on Dept, referencing old oldi, new newi for each row when ( dean not in (select Tname from Teacher where D# = :newi.d# and salary >all(select salary from Teacher where D# = :newi.d#)) begin raise_application_error(-20003, 'invalid Dean on update'); end;
数 据 库 系 统 基 础 29/54 ---- 数 据 库 安 全 性 的 概 念 数 据 库 安 全 性 是 指 DBMS 能 够 保 证 使 DB 免 受 非 法 非 授 权 用 户 的 使 用 泄 漏 更 改 或 破 坏 的 机 制 和 手 段 数 据 库 安 全 性 管 理 涉 及 许 多 方 面 社 会 法 律 及 伦 理 方 面 : 私 人 信 息 受 到 保 护, 未 授 权 人 员 访 问 私 人 信 息 会 违 法 公 共 政 策 / 制 度 方 面 : 例 如, 政 府 或 组 织 的 信 息 公 开 或 非 公 开 制 度 安 全 策 略 : 政 府 企 业 或 组 织 所 实 施 的 安 全 性 策 略, 如 集 中 管 理 和 分 散 管 理, 需 者 方 知 策 略 ( 也 称 最 少 特 权 策 略 ) 数 据 库 系 统 DBS 的 安 全 级 别 : 物 理 控 制 网 络 控 制 操 作 系 统 控 制 DBMS 控 制 数 据 的 安 全 级 别 : 绝 密 (Top Secret), 机 密 (Secret), 可 信 (Confidential) 和 无 分 类 (Unclassified)
数 据 库 系 统 基 础 30/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) DBMS 的 安 全 机 制 : 自 主 安 全 性 机 制 : 存 取 控 制 (Access Control) 通 过 权 限 在 用 户 之 间 的 传 递, 使 用 户 自 主 管 理 数 据 库 安 全 性 强 制 安 全 性 机 制 : 通 过 对 数 据 和 用 户 强 制 分 类, 使 得 不 同 类 别 用 户 能 够 访 问 不 同 类 别 的 数 据 推 断 控 制 机 制 :( 可 参 阅 相 关 文 献 ) 防 止 通 过 历 史 信 息, 推 断 出 不 该 被 其 知 道 的 信 息 ; 防 止 通 过 公 开 信 息 ( 通 常 是 一 些 聚 集 信 息 ) 推 断 出 私 密 信 息 ( 个 体 信 息 ), 通 常 在 一 些 由 个 体 数 据 构 成 的 公 共 数 据 库 中 此 问 题 尤 为 重 要 数 据 加 密 存 储 机 制 :( 可 参 阅 相 关 文 献 ) 通 过 加 密 解 密 保 护 数 据, 密 钥 加 密 / 解 密 方 法 与 传 输
数 据 库 系 统 基 础 31/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) DBA 在 安 全 性 方 面 的 责 任 和 义 务 熟 悉 相 关 的 法 规 政 策, 协 助 组 织 的 决 策 者 制 定 好 相 关 的 安 全 策 略 规 划 好 安 全 控 制 保 障 措 施, 例 如, 系 统 安 全 级 别 不 同 级 别 上 的 安 全 控 制 措 施, 对 安 全 遭 破 坏 的 响 应, 划 分 好 数 据 的 安 全 级 别 以 及 用 户 的 安 全 级 别 实 施 安 全 性 控 制 :DBMS 专 门 提 供 一 个 DBA 帐 户, 该 帐 户 是 一 个 超 级 用 户 或 称 系 统 用 户 DBA 利 用 该 帐 户 的 特 权 可 以 进 行 用 户 帐 户 的 创 建 以 及 权 限 授 予 和 撤 消 安 全 级 别 控 制 调 整 等
数 据 库 系 统 基 础 32/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) 自 主 安 全 性 机 制 通 常 情 况 下, 自 主 安 全 性 是 通 过 授 权 机 制 来 实 现 的 用 户 在 使 用 数 据 库 前 必 须 由 DBA 处 获 得 一 个 帐 户, 并 由 DBA 授 予 该 帐 户 一 定 的 权 限, 该 帐 户 的 用 户 依 据 其 所 拥 有 的 权 限 对 数 据 库 进 行 操 作 ; 同 时, 该 帐 户 用 户 也 可 将 其 所 拥 有 的 权 利 转 授 给 其 他 的 用 户 ( 帐 户 ), 由 此 实 现 权 限 在 用 户 之 间 的 传 播 和 控 制 授 权 者 : 决 定 用 户 权 利 的 人 授 权 : 授 予 用 户 访 问 的 权 利
数 据 库 系 统 基 础 33/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) DBMS 将 权 利 和 用 户 ( 帐 户 ) 结 合 在 一 起, 形 成 一 个 访 问 规 则 表, 依 据 该 规 则 表 可 以 实 现 对 数 据 库 的 安 全 性 控 制 AccessRule ::= ( S, O, t, P) S: 请 求 主 体 ( 用 户 ) O: 访 问 对 象 t: 访 问 权 利 P: 谓 词 { AccessRule} 通 常 存 放 在 数 据 字 典 或 称 系 统 目 录 中, 构 成 了 所 有 用 户 对 DB 的 访 问 权 利 ; 用 户 多 时, 可 以 按 用 户 组 建 立 访 问 规 则 访 问 对 象 可 大 可 小 ( 目 标 粒 度 Object granularity): 属 性 / 字 段 记 录 / 元 组 关 系 数 据 库
数 据 库 系 统 基 础 34/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) 访 问 权 利 被 分 成 以 下 几 种 ( 级 别 1)Select : 读 ( 读 DB, Table, Record, Attribute, ) ( 级 别 2)Modify : 更 新 Insert : 插 入 ( 插 入 新 元 组, ) Update : 更 新 ( 更 新 元 组 中 的 某 些 值, ) Delete : 删 除 ( 删 除 元 组, ) ( 级 别 3)Create : 创 建 ( 创 建 表 空 间 模 式 表 索 引 视 图 等 ) Create : 创 建 Alter : 更 新 Drop : 删 除 级 别 高 的 权 利 自 动 包 含 级 别 低 的 权 利 如 某 人 拥 有 更 新 的 权 利, 它 也 自 动 拥 有 读 的 权 利 在 有 些 DBMS 中, 将 级 别 3 的 权 利 称 为 帐 户 级 别 的 权 利, 而 将 级 别 1 和 2 称 为 关 系 级 别 的 权 利 超 级 用 户 (DBA) 帐 户 级 别 ( 程 序 员 用 户 ) 关 系 级 别 ( 普 通 用 户 )
数 据 库 系 统 基 础 35/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) 数 据 库 安 全 性 访 问 规 则 示 例 一 个 员 工 管 理 数 据 库 Employee(P#, Pname, Page, Psex, Psalary, D#, HEAD) 有 如 下 的 安 全 性 访 问 要 求 : 员 工 管 理 人 员 能 访 问 该 数 据 库 的 所 有 内 容, 具 有 所 有 权 利 收 发 人 员 也 需 访 问 该 数 据 库 以 确 认 某 员 工 是 哪 一 个 部 门 的, 便 于 工 作, 只 能 访 问 基 本 信 息, 其 他 信 息 不 允 许 其 访 问 每 个 员 工 允 许 其 访 问 自 己 的 记 录, 以 便 查 询 自 己 的 工 资 情 况, 但 不 能 修 改 部 门 领 导, 能 够 查 询 其 所 领 导 部 门 人 员 的 所 有 情 况 高 层 领 导 能 访 问 该 数 据 库 的 所 有 内 容, 但 只 能 读
数 据 库 系 统 基 础 36/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) 安 全 性 访 问 规 则 示 例 按 名 控 制 安 全 性 按 内 容 控 制 安 全 性
数 据 库 系 统 基 础 37/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) DBMS 安 全 性 访 问 规 则 的 存 储 方 式 第 1 种 : 存 储 矩 阵 请 同 学 们 给 出 一 个 算 法 : 已 知 如 上 形 式 的 一 个 存 储 矩 阵, 某 用 户 提 交 了 一 条 SQL 语 句 (Select-From-Where), 设 计 一 个 算 法, 判 断 是 否 允 许 该 用 户 检 索 到 相 应 的 结 果?
数 据 库 系 统 基 础 38/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) DBMS 安 全 性 访 问 规 则 的 存 储 方 式 第 2 种 : 视 图 视 图 是 安 全 性 控 制 的 重 要 手 段 通 过 视 图 可 以 限 制 用 户 对 关 系 中 某 些 数 据 项 的 存 取, 例 如 : 视 图 1:Create EmpV1 as select * from Employee 视 图 2:Create EmpV2 as select Pname, D# from Employee 通 过 视 图 可 将 数 据 访 问 对 象 与 谓 词 结 合 起 来, 限 制 用 户 对 关 系 中 某 些 元 组 的 存 取, 例 如 : 视 图 1: Create EmpV3 as select * from Employee where P# = :UserId 视 图 2: Create EmpV4 as select * from Employee where Head = :UserId 用 户 定 义 视 图 后, 视 图 便 成 为 一 新 的 数 据 对 象, 参 与 到 存 储 矩 阵 与 能 力 表 中 进 行 描 述
数 据 库 系 统 基 础 39/54 ---- SQL-DCL 中 关 于 安 全 性 的 命 令 授 权 命 令 GRANT {all PRIVILEGES privilege {,privilege }} ON [TABLE] tablename viewname TO {public user-id {, user-id }} [WITH GRANT OPTION]; user-id, 某 一 个 用 户 帐 户, 由 DBA 创 建 的 合 法 帐 户 public, 允 许 所 有 有 效 用 户 使 用 授 予 的 权 利 privilege 是 下 面 的 权 利 SELECT INSERT UPDATE DELETE ALL PRIVILEDGES WITH GRANT OPTION 选 项 是 允 许 被 授 权 者 传 播 这 些 权 利
数 据 库 系 统 基 础 40/54 ---- SQL-DCL 中 关 于 安 全 性 的 命 令 授 权 命 令 示 例, 假 定 高 级 领 导 为 Emp0001, 部 门 领 导 为 Emp0021, 员 工 管 理 员 为 Emp2001, 收 发 员 为 Emp5001( 均 为 UserId, 也 即 员 工 的 P#) Grant All Priviledges ON Employee TO Emp2001; Grant SELECT ON EmpV2 TO Emp5001 ; Grant SELECT ON EmpV3 TO public; Grant SELECT ON EmpV4 TO Emp0021; 授 予 视 图 访 问 的 权 利, 并 不 意 味 着 授 予 基 本 表 访 问 的 权 利 ( 两 个 级 别 : 基 本 关 系 级 别 和 视 图 级 别 ) 授 权 者 授 予 的 权 利 必 须 是 授 权 者 已 经 拥 有 的 权 利
数 据 库 系 统 基 础 41/54 ---- SQL-DCL 中 关 于 安 全 性 的 命 令 ( 续 ) 授 权 过 程 示 例 第 一 步 :DBA 创 建 DB, 并 为 每 一 个 用 户 创 建 一 个 帐 户 假 定 建 立 了 五 个 用 户 :UserA, UserB, UserC, UserD, UserE 第 二 步 :DBA 授 予 某 用 户 帐 户 级 别 的 权 利 假 定 授 予 UserA 第 三 步 : 具 有 帐 户 级 别 的 用 户 可 以 创 建 基 本 表 或 视 图, 他 也 自 动 成 为 该 表 或 该 视 图 的 属 主 帐 户, 拥 有 该 表 或 该 视 图 的 所 有 访 问 权 利 假 定 UserA 创 建 了 Employee, 则 UserA 就 是 Employee 表 的 属 主 帐 户 第 四 步 : 拥 有 属 主 帐 户 的 用 户 可 以 将 其 中 的 一 部 分 权 利 授 予 另 外 的 用 户, 该 用 户 也 可 将 权 利 进 一 步 授 权 给 其 他 的 用 户 假 定 UserA 将 读 权 限 授 予 UserB, 而 userb 又 将 其 拥 有 的 权 限 授 予 UserC, 如 此 将 权 利 不 断 传 递 下 去
数 据 库 系 统 基 础 42/54 ---- SQL-DCL 中 关 于 安 全 性 的 命 令 ( 续 ) 授 权 过 程 示 例 ( 续 ) Grant Select ON Employee TO UserB WITH GRANT OPTION; Grant Select ON Employee TO UserC WITH GRANT OPTION; DBA UserA UserB UserC UserE 注 意 授 权 的 传 播 范 围 问 题 : 传 播 范 围 包 括 两 个 方 面 : 水 平 传 播 数 量 和 垂 直 传 播 数 量 水 平 传 播 数 量 是 授 权 者 的 再 授 权 用 户 数 目 ( 树 的 广 度 ) 垂 直 传 播 数 量 是 授 权 者 传 播 给 被 授 权 者, 再 被 传 播 给 另 一 个 被 授 权 者, 传 播 的 深 度 ( 树 的 深 度 ) 有 些 系 统 提 供 了 传 播 范 围 控 制, 有 些 系 统 并 没 有 提 供,SQL 标 准 中 也 并 没 有 限 制
数 据 库 系 统 基 础 43/54 ---- SQL-DCL 中 关 于 安 全 性 的 命 令 ( 续 ) 收 回 授 权 命 令 REVOKE {all privileges priv {, priv } } ON tablename viewname DBA FROM {public user {, user } }; UserA UserB UserE 例 如 revoke select on employee from UserB; UserC 当 一 个 用 户 的 权 利 被 收 回 时, 通 过 其 传 播 给 其 他 用 户 的 权 利 也 将 被 收 回 如 果 一 个 用 户 从 多 个 用 户 处 获 得 了 授 权, 则 当 其 中 某 一 个 用 户 收 回 授 权 时, 该 用 户 可 能 仍 保 有 权 利 例 如 UserC 从 UserB 和 UserE 处 获 得 了 授 权, 当 UserB 收 回 时, 其 还 将 保 持 UserE 赋 予 其 的 权 利
数 据 库 系 统 基 础 44/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) 强 制 安 全 性 机 制 强 制 安 全 性 通 过 对 数 据 对 象 进 行 安 全 性 分 级 绝 密 (Top Secret), 机 密 (Secret), 可 信 (Confidential) 和 无 分 类 (Unclassified) 以 及 对 用 户 也 进 行 上 述 的 安 全 性 分 级, 从 而 强 制 实 现 不 同 级 别 用 户 访 问 不 同 级 别 数 据 的 一 种 机 制 访 问 规 则 如 下 : 用 户 S, 不 能 读 取 数 据 对 象 O, 除 非 Level(S)>=Level(O) 用 户 S, 不 能 写 数 据 对 象, 除 非 Level(S)<=Level(O)
数 据 库 系 统 基 础 45/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) 强 制 安 全 性 机 制 的 实 现 DBMS 引 入 强 制 安 全 性 机 制, 可 以 通 过 扩 展 关 系 模 式 来 实 现 关 系 模 式 : R(A1: D1, A2: D2,, An:Dn) 对 属 性 和 元 组 引 入 安 全 性 分 级 特 性 或 称 分 类 特 性 R(A1: D1, C1, A2: D2, C2, An:Dn, Cn, TC) 其 中 C1,C2,,Cn 分 别 为 属 性 D1,D2,,Dn 的 安 全 分 类 特 性 ; TC 为 元 组 的 分 类 特 性
数 据 库 系 统 基 础 46/54 ---- 数 据 库 安 全 性 的 概 念 ( 续 ) 这 样 关 系 中 的 每 个 元 组, 都 将 扩 展 为 带 有 安 全 分 级 的 元 组, 例 如 强 制 安 全 性 机 制 使 得 关 系 形 成 为 多 级 关 系 ( 不 同 级 别 用 户 所 能 看 到 的 关 系 的 子 集 ), 也 出 现 多 重 实 例 多 级 关 系 完 整 性 等 许 多 新 的 问 题 或 新 的 处 理 技 巧, 在 使 用 中 需 注 意 仔 细 研 究 关 于 强 制 安 全 性 机 制 的 内 容, 可 参 看 其 他 有 关 的 文 献
数 据 库 系 统 基 础 47/54 ---- 关 于 数 据 字 典 / 系 统 目 录 和 模 式 系 统 目 录 系 统 目 录 (System Catalogs) 是 系 统 维 护 的, 包 含 数 据 库 中 定 义 的 各 类 对 象 信 息 的 表 或 视 图, 这 些 对 象 包 括 用 Create 语 句 定 义 的 表 列 索 引 视 图 权 限 约 束 等, 这 些 信 息 又 称 数 据 库 的 元 数 据 ---- 关 于 数 据 的 数 据 在 不 同 DBMS 中, 又 称 数 据 字 典 (Data Dictionary(Oracle)) 目 录 表 (DB2 UDB) 系 统 目 录 (INFORMIX) 系 统 视 图 (X/Open) 不 同 DBMS 中 系 统 目 录 存 储 方 式 可 能 是 不 同 的, 但 会 有 一 些 信 息 对 DBA 公 开 这 些 公 开 的 信 息, DBA 可 以 使 用 一 些 特 殊 的 SQL 命 令 来 检 索
数 据 库 系 统 基 础 48/54 ---- 关 于 数 据 字 典 / 系 统 目 录 和 模 式 ( 续 ) DBA DBA 需 要 清 楚 地 知 道 系 统 目 录 的 内 容 构 成, 并 知 道 这 些 信 息 的 含 义 和 作 用, 以 便 能 更 有 效 地 维 护 DB 以 及 DBS 系 统 的 效 率 DBA 需 要 熟 悉 DBMS 提 供 的 各 种 检 索 系 统 目 录 的 命 令, 以 便 能 更 好 地 操 作 系 统 目 录
数 据 库 系 统 基 础 49/54 ---- 关 于 数 据 字 典 / 系 统 目 录 和 模 式 ( 续 ) 典 型 的 系 统 目 录 X/Open 标 准 中 有 一 个 目 录 表 Info_Schem.Tables, 该 表 中 的 一 行 是 一 个 已 经 定 义 的 表 的 有 关 信 息 可 以 使 用 SQL 语 句 来 访 问 这 个 表 中 的 信 息, 比 如 了 解 已 经 定 义 了 哪 些 表, 可 如 下 进 行 : Select Table_Name From Tables;
数 据 库 系 统 基 础 50/54 ---- 关 于 数 据 字 典 / 系 统 目 录 和 模 式 ( 续 ) 模 式 系 统 目 录 的 Tables 中 有 一 列 是 模 式 Schema, 模 式 的 含 义 是 指 某 一 用 户 所 设 计 和 使 用 的 表 索 引 及 其 他 与 数 据 库 有 关 的 对 象 的 集 合, 因 此 表 的 完 整 名 应 是 : 模 式 名. 表 名 这 样 做 可 允 许 不 同 用 户 使 用 相 同 的 表 名, 而 不 混 淆 一 般 而 言, 一 个 用 户 有 一 个 模 式 可 以 使 用 Create Schema 语 句 来 创 建 模 式 ( 用 法 略, 参 见 相 关 文 献 ), 在 Create Table 等 语 句 可 以 使 用 所 定 义 的 模 式 名 称
数 据 库 系 统 基 础 51/54 ---- 关 于 数 据 字 典 / 系 统 目 录 和 模 式 ( 续 ) Oracle 的 数 据 字 典 Oracle 数 据 字 典 由 视 图 组 成, 分 为 三 种 不 同 形 式, 由 不 同 的 前 缀 标 识 USER_ : 用 户 视 图, 用 户 所 拥 有 的 对 象, 在 用 户 模 式 中 ALL_ : 扩 展 的 用 户 视 图, 用 户 可 访 问 的 对 象 DBA_ :DBA 视 图 ( 所 有 用 户 都 可 访 问 的 DBA 对 象 的 子 集 ) Oracle 数 据 字 典 中 定 义 了 三 个 视 图 USER_Tables, ALL_Tables, 和 DBA_Tables 供 DBA 和 用 户 使 用 数 据 字 典 中 关 于 表 的 信 息
数 据 库 系 统 基 础 52/54 ---- 关 于 数 据 字 典 / 系 统 目 录 和 模 式 ( 续 ) 同 样, Oracle 数 据 字 典 中 也 定 义 了 三 个 视 图 USER_TAB_Columns, ALL_TAB_Columns(Accessible_Columns), 和 DBA_TAB_Columns 供 DBA 和 用 户 使 用 数 据 字 典 中 关 于 表 的 列 的 信 息 可 以 使 用 SQL 语 句 来 访 问 这 些 表 中 的 信 息 : Select Column_Name From ALL_TAB_Columns Where Table_Name = STUDENT ;
数 据 库 系 统 基 础 53/54 ---- 关 于 数 据 字 典 / 系 统 目 录 和 模 式 ( 续 ) Oracle 数 据 字 典 中 还 定 义 了 其 他 视 图 TABLE_PRIVILEDGE( 或 ALL_TAB_GRANTS) COLUMN_PRIVILEDGE( 或 ALL_COL_GRANTS) 可 访 问 表 的 权 限, 列 的 权 限 CONSTRAINT_DEFS( 或 ALL_CONSTRAINTS) 可 访 问 表 的 各 种 约 束 还 有 其 他 视 图 可 以 使 用 下 述 命 令 获 取 Oracle 定 义 的 所 有 视 图 信 息 Select view_name from all_views where owner = SYS and view_name like ALL_% or view_name like USER_% ; 如 果 用 户 使 用 Oracle, 可 使 用 其 提 供 的 SQL*PLUS 进 行 交 互 式 访 问
数 据 库 系 统 基 础 54/54 ---- 本 章 小 结 充 分 了 解 了 DB 完 整 性 的 有 关 概 念, 充 分 了 解 了 SQL-DDL 关 于 完 整 性 约 束 的 定 义 方 法 包 括 列 约 束 和 表 约 束 ; 结 构 约 束 和 内 容 约 束 ; 静 态 约 束 和 动 态 约 束 ; 触 发 器 等 要 进 一 步 理 解 SQL-DDL 的 使 用 方 法, 以 便 能 更 有 效 地 维 护 数 据 库 进 一 步 理 解 Triggers, 有 优 点, 也 有 不 足 充 分 了 解 了 DB 安 全 性 的 有 关 概 念, 充 分 了 解 了 SQL-DCL 中 关 于 授 权 与 收 回 授 权 的 使 用 方 法, 进 一 步 理 解 了 视 图 作 为 安 全 性 控 制 的 重 要 意 义 包 括 安 全 性 管 理 的 责 任 素 质 要 求, 自 主 安 全 性 机 制 ( 访 问 权 利 存 取 矩 阵 授 权 ), 强 制 安 全 性 机 制 进 一 步 理 解 安 全 性, 掌 握 DBA 应 掌 握 的 安 全 性 常 识 与 能 力 基 本 了 解 了 数 据 字 典, 初 步 了 解 DBA 通 过 SQL 命 令 访 问 数 据 字 典 的 方 法