21 世 纪 高 职 高 专 规 划 教 材 网 络 专 业 系 列 SQL Server 数 据 库 应 用 技 术 张 蒲 生 何 升 编 著 清 华 大 学 出 版 社 北 京
内 容 简 介 本 书 根 据 高 等 职 业 技 术 教 育 和 教 学 特 点, 结 合 教 学 改 革 和 应 用 实 践 编 写 而 成 在 介 绍 SQL Server 数 据 库 基 本 内 容 的 同 时, 通 过 学 生 管 理 系 统 开 发 的 实 例 将 数 据 库 基 本 原 理 和 应 用 技 术 整 合 内 容 包 括 : 数 据 库 应 用 技 术 基 础 SQL Server 2000 服 务 器 和 客 户 端 的 操 作 数 据 库 及 其 管 理 数 据 库 对 象 的 基 本 操 作 数 据 查 询 索 引 视 图 复 制 存 储 过 程 触 发 器 程 序 设 计 数 据 转 换 服 务 安 全 性 管 理 备 份 与 恢 复 ODBC 和 ADO 编 程 接 口 等 本 书 内 容 广 泛 翔 实, 适 用 对 象 广 且 实 用 性 强, 既 可 作 为 高 职 高 专 学 生 数 据 库 课 程 的 教 材, 又 可 作 为 相 关 专 业 和 使 用 SQL Server 进 行 应 用 开 发 的 人 员 的 参 考 资 料 或 培 训 教 材 版 权 所 有, 翻 印 必 究 举 报 电 话 :010 唱 62782989 13501256678 13801310933 本 书 封 面 贴 有 清 华 大 学 出 版 社 防 伪 标 签, 无 标 签 者 不 得 销 售 本 书 防 伪 标 签 采 用 特 殊 防 伪 技 术, 用 户 可 通 过 在 图 案 表 面 涂 抹 清 水, 图 案 消 失, 水 干 后 图 案 复 现 ; 或 将 表 面 膜 揭 下, 放 在 白 纸 上 用 彩 笔 涂 抹, 图 案 在 白 纸 上 再 现 的 方 法 识 别 真 伪 图 书 在 版 编 目 (CIP) 数 据 SQL Server 数 据 库 应 用 技 术 / 张 蒲 生, 何 升 编 著. 北 京 : 清 华 大 学 出 版 社,2005.8 (21 世 纪 高 职 高 专 规 划 教 材. 网 络 专 业 系 列 ) ISBN 7 唱 302 唱 11287 唱 8 Ⅰ.S Ⅱ. 1 张 2 何 Ⅲ. 关 系 数 据 库 - 数 据 库 管 理 系 统,SQL Server - 高 等 学 校 : 技 术 学 校 - 教 材 Ⅳ. TP311.138 中 国 版 本 图 书 馆 CIP 数 据 核 字 (2005) 第 071274 号 出 版 者 : 清 华 大 学 出 版 社 地 址 : 北 京 清 华 大 学 学 研 大 厦 http ://www.tup.com.cn 邮 编 :100084 社 总 机 :010 唱 62770175 客 户 服 务 :010 唱 62776969 责 任 编 辑 : 曾 妍 印 刷 者 : 北 京 市 清 华 园 胶 印 厂 装 订 者 : 三 河 市 金 元 装 订 厂 发 行 者 : 新 华 书 店 总 店 北 京 发 行 所 开 本 :185 260 印 张 :24.75 字 数 :567 千 字 版 次 :2005 年 8 月 第 1 版 2005 年 8 月 第 1 次 印 刷 书 号 :ISBN 7 唱 302 唱 11287 唱 8/TP 7434 印 数 :1 ~ 5000 定 价 :30.00 元
出 版 说 明 高 职 高 专 教 育 是 我 国 高 等 教 育 的 重 要 组 成 部 分, 担 负 着 为 国 家 培 养 并 输 送 生 产 建 设 管 理 服 务 第 一 线 高 素 质 技 术 应 用 型 人 才 的 重 任 进 入 21 世 纪 后, 高 职 高 专 教 育 的 改 革 和 发 展 呈 现 出 前 所 未 有 的 发 展 势 头, 学 生 规 模 已 占 我 国 高 等 教 育 的 半 壁 江 山, 成 为 我 国 高 等 教 育 的 一 支 重 要 的 生 力 军 ; 办 学 理 念 上, 以 就 业 为 导 向 成 为 高 等 职 业 教 育 改 革 与 发 展 的 主 旋 律 近 两 年 来, 教 育 部 召 开 了 三 次 产 学 研 交 流 会, 并 启 动 四 个 专 业 的 国 家 技 能 型 紧 缺 人 才 培 养 项 目, 同 时 成 立 了 35 所 示 范 性 软 件 职 业 技 术 学 院, 进 行 两 年 制 教 学 改 革 试 点 这 些 举 措 都 表 明 国 家 正 在 推 动 高 职 高 专 教 育 进 行 深 层 次 的 重 大 改 革, 向 培 养 生 产 服 务 第 一 线 真 正 需 要 的 应 用 型 人 才 的 方 向 发 展 为 了 顺 应 当 前 我 国 高 职 高 专 教 育 的 发 展 形 势, 配 合 高 职 高 专 院 校 的 教 学 改 革 和 教 材 建 设, 进 一 步 提 高 我 国 高 职 高 专 教 育 教 材 质 量, 在 教 育 部 的 指 导 下, 清 华 大 学 出 版 社 组 织 出 版 21 世 纪 高 职 高 专 规 划 教 材 为 推 动 规 划 教 材 的 建 设, 清 华 大 学 出 版 社 组 织 并 成 立 高 职 高 专 教 育 教 材 编 审 委 员 会, 旨 在 对 清 华 版 的 全 国 性 高 职 高 专 教 材 及 教 材 选 题 进 行 评 审, 并 向 清 华 大 学 出 版 社 推 荐 各 院 校 办 学 特 色 鲜 明 内 容 质 量 优 秀 的 教 材 选 题 教 材 选 题 由 个 人 或 各 院 校 推 荐, 经 编 审 委 员 会 认 真 评 审, 最 后 由 清 华 大 学 出 版 社 出 版 编 审 委 员 会 的 成 员 皆 来 源 于 教 改 成 效 大 办 学 特 色 鲜 明 师 资 实 力 强 的 高 职 高 专 院 校 普 通 高 校 以 及 著 名 企 业, 教 材 的 编 写 者 和 审 定 者 都 是 从 事 高 职 高 专 教 育 第 一 线 的 骨 干 教 师 和 专 家 编 审 委 员 会 根 据 教 育 部 最 新 文 件 政 策, 规 划 教 材 体 系, 比 如 部 分 专 业 的 两 年 制 教 材 ; 以 就 业 为 导 向, 以 专 业 技 能 体 系 为 主, 突 出 人 才 培 养 的 实 践 性 应 用 性 的 原 则, 重 新 组 织 系 列 课 程 的 教 材 结 构, 整 合 课 程 体 系 ; 按 照 教 育 部 制 定 的 高 职 高 专 教 育 基 础 课 程 教 学 基 本 要 求, 教 材 的 基 础 理 论 以 必 要 够 用 为 度, 突 出 基 础 理 论 的 应 用 和 实 践 技 能 的 培 养 本 套 规 划 教 材 的 编 写 原 则 如 下 : (1) 根 据 岗 位 群 设 置 教 材 系 列, 并 成 立 系 列 教 材 编 审 委 员 会 ; (2) 由 编 审 委 员 会 规 划 教 材 评 审 教 材 ; (3) 重 点 课 程 进 行 立 体 化 建 设, 突 出 案 例 式 教 学 体 系, 加 强 实 训 教 材 的 出 版, 完 善 教 学 服 务 体 系 ; (4) 教 材 编 写 者 由 具 有 丰 富 教 学 经 验 和 多 年 实 践 经 历 的 教 师 共 同 组 成, 建 立 双 师 型 编 者 体 系
Ⅱ SQL Server 数 据 库 应 用 技 术 本 套 规 划 教 材 涵 盖 了 公 共 基 础 课 计 算 机 电 子 信 息 机 械 经 济 管 理 以 及 服 务 等 大 类 的 主 要 课 程, 包 括 专 业 基 础 课 和 专 业 主 干 课 目 前 已 经 规 划 的 教 材 系 列 名 称 如 下 : 公 共 基 础 课 公 共 基 础 课 系 列 计 算 机 类 计 算 机 基 础 教 育 系 列 计 算 机 专 业 基 础 系 列 计 算 机 应 用 系 列 网 络 专 业 系 列 软 件 专 业 系 列 电 子 商 务 专 业 系 列 电 子 信 息 类 电 子 信 息 基 础 系 列 微 电 子 技 术 系 列 通 信 技 术 系 列 电 气 自 动 化 应 用 电 子 技 术 系 列 机 械 类 机 械 基 础 系 列 机 械 设 计 与 制 造 专 业 系 列 数 控 技 术 系 列 模 具 设 计 与 制 造 系 列 经 济 管 理 类 经 济 管 理 基 础 系 列 市 场 营 销 系 列 财 务 会 计 系 列 企 业 管 理 系 列 物 流 管 理 系 列 财 政 金 融 系 列 服 务 类 旅 游 系 列 艺 术 设 计 系 列 本 套 规 划 教 材 的 系 列 名 称 根 据 学 科 基 础 和 岗 位 群 方 向 设 置, 为 各 高 职 高 专 院 校 提 供 自 助 餐 形 式 的 教 材 各 院 校 在 选 择 课 程 需 要 的 教 材 时, 专 业 课 程 可 以 根 据 岗 位 群 选 择 系 列 ; 专 业 基 础 课 程 可 以 根 据 学 科 方 向 选 择 各 类 的 基 础 课 系 列 例 如, 数 控 技 术 方 向 的 专 业 课 程 可 以 在 数 控 技 术 系 列 选 择 ; 数 控 技 术 专 业 需 要 的 基 础 课 程, 属 于 计 算 机 类 课 程 的 可 以 在 计 算 机 基 础 教 育 系 列 和 计 算 机 应 用 系 列 选 择, 属 于 机 械 类 课 程 的 可 以 在 机 械 基 础 系 列 选 择, 属 于 电 子 信 息 类 课 程 的 可 以 在 电 子 信 息 基 础 系 列 选 择 依 此 类 推 为 方 便 教 师 授 课 和 学 生 学 习, 清 华 大 学 出 版 社 正 在 建 设 本 套 教 材 的 教 学 服 务 体 系 本 套 教 材 先 期 选 择 重 点 课 程 和 专 业 主 干 课 程, 进 行 立 体 化 教 材 建 设 : 加 强 多 媒 体 教 学 课 件 或 电 子 教 案 素 材 库 学 习 盘 学 习 指 导 书 等 形 式 的 制 作 和 出 版, 开 发 网 络 课 程 学 校 在 选 用 教 材 时, 可 通 过 邮 件 或 电 话 与 我 们 联 系 获 取 相 关 服 务, 并 通 过 与 各 院 校 的 密 切 交 流, 使 其 日 臻 完 善 高 职 高 专 教 育 正 处 于 新 一 轮 改 革 时 期, 从 专 业 设 置 课 程 体 系 建 设 到 教 材 编 写, 依 然 是 新 课 题 希 望 各 高 职 高 专 院 校 在 教 学 实 践 中 积 极 提 出 意 见 和 建 议, 并 向 我 们 推 荐 优 秀 选 题 反 馈 意 见 请 发 送 到 E 唱 mail :gzgz @ tup.tsinghua.edu.cn 清 华 大 学 出 版 社 将 对 已 出 版 的 教 材 不 断 地 修 订 完 善, 提 高 教 材 质 量, 完 善 教 材 服 务 体 系, 为 我 国 的 高 职 高 专 教 育 出 版 优 秀 的 高 质 量 的 教 材 高 职 高 专 教 育 教 材 编 审 委 员 会
前 言 SQ L Server 数 据 库 应 用 技 术 经 过 多 年 课 程 教 学 产 学 研 的 实 践, 以 及 教 学 改 革 的 探 索, 我 们 逐 步 形 成 了 数 据 库 课 程 的 教 学 模 式 : 将 数 据 库 的 基 本 原 理 与 基 础 应 用 整 合 形 成 数 据 库 应 用 技 术, 其 先 行 课 程 为 可 视 化 程 序 设 计, 后 续 课 程 为 数 据 库 编 程 技 术, 将 前 台 的 桌 面 程 序 设 计 与 后 台 数 据 管 理 结 合 起 来 此 模 式 应 用 于 教 学 中, 学 生 的 应 用 开 发 能 力 及 实 际 编 程 动 手 能 力 均 有 了 较 大 的 提 高 本 书 就 是 在 此 基 础 上, 根 据 高 等 职 业 技 术 教 育 和 教 学 特 点, 结 合 教 学 改 革 和 应 用 实 践 编 写 而 成 的 本 书 的 特 点 是 以 理 论 够 用 实 用 强 化 应 用 为 原 则, 使 SQ L Server 数 据 库 应 用 技 术 的 教 与 学 得 以 快 速 和 轻 松 它 以 SQL Server 2000 为 背 景 介 绍 SQ L 语 言, 以 学 生 管 理 系 统 开 发 为 实 例 引 导 学 生 进 入 角 色 本 书 之 所 以 选 择 学 生 管 理 系 统 作 为 全 程 实 例, 是 因 为 实 例 涉 及 的 业 务 领 域 是 学 生 熟 悉 的 感 兴 趣 的, 很 容 易 激 发 学 习 热 情, 也 很 快 就 能 上 手 同 时 实 例 覆 盖 数 据 库 应 用 技 术 课 程 所 涉 及 的 所 有 知 识 点, 随 着 逐 步 深 入, 全 面 展 开 课 程 内 容, 学 生 将 以 实 例 设 计 和 改 进 中 的 问 题 为 动 力, 积 极 参 与 分 析 设 计 调 整 和 改 进 数 据 库 的 应 用 实 践 经 过 前 后 几 次 迭 代, 学 生 管 理 系 统 开 发 完 成, 学 生 也 就 完 成 对 数 据 库 的 入 门 学 习 到 应 用 开 发 的 全 过 程, 对 枟 数 据 库 应 用 技 术 枠 课 程 的 所 有 知 识 点 也 全 部 练 习 了 本 书 每 章 开 始 附 有 学 习 要 点 提 示, 每 章 末 尾 附 有 课 后 作 业 和 实 训 项 目, 供 学 生 及 时 消 化 对 应 章 节 内 容 之 用 本 书 附 有 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 教 学 大 纲 和 实 训 大 纲, 可 供 教 师 和 学 生 在 教 学 及 学 习 中 参 考 全 书 共 14 章 : 第 1 章 为 数 据 库 技 术 基 础 ; 第 2 章 为 SQ L Server 2000 服 务 器 和 客 户 端 ; 第 3 章 为 数 据 库 及 其 管 理 ; 第 4 章 为 数 据 库 中 表 的 基 本 操 作 ; 第 5 章 为 索 引 及 其 应 用 ; 第 6 章 为 SQ L Server 的 数 据 查 询 ; 第 7 章 为 数 据 复 制 ; 第 8 章 为 视 图 及 其 应 用 ; 第 9 章 为 存 储 过 程 与 触 发 器 ; 第 10 章 为 SQ L Server 的 程 序 设 计 ; 第 11 章 为 数 据 转 换 服 务 ; 第 12 章 为 SQ L Server 2000 的 安 全 管 理 ; 第 13 章 为 备 份 与 还 原 ; 第 14 章 为 SQ L Server 编 程 接 口 本 课 程 建 议 教 学 时 数 为 64 ~ 80 学 时, 其 中 : 授 课 时 数 为 44 学 时, 实 训 时 数 为 20 ~ 36 学 时, 并 要 求 先 学 习 C 程 序 设 计 或 Visual Basic 语 言 本 书 第 1 6 8 9 10 12 13 14 章 和 附 录, 以 及 书 中 课 后 作 业 和 实 训 由 张 蒲 生 编 写 ; 第
Ⅳ SQL Server 数 据 库 应 用 技 术 2 3 4 5 7 11 章 由 何 升 编 写 ; 全 书 由 张 蒲 生 统 稿 在 本 书 编 写 过 程 中, 得 到 了 广 东 外 语 外 贸 大 学 信 息 学 院 的 大 力 支 持, 许 多 老 师 为 本 书 提 供 了 宝 贵 的 意 见, 在 此 向 他 们 表 示 衷 心 的 感 谢 由 于 编 者 水 平 所 限, 加 之 时 间 仓 促, 书 中 难 免 存 在 错 误 和 不 妥 之 处, 殷 切 期 望 广 大 读 者 给 予 指 正 作 者 2005 年 7 月 于 广 州
目 录 SQ L Server 数 据 库 应 用 技 术 第 1 章 数 据 库 技 术 基 础 1 1.1 数 据 管 理 的 概 述 1 1.1.1 数 据 数 据 管 理 与 数 据 处 理 1 1.1.2 数 据 管 理 的 发 展 2 1.1.3 数 据 库 数 据 库 管 理 系 统 和 数 据 库 系 统 4 1.2 数 据 模 型 6 1.2.1 数 据 模 型 的 三 要 素 6 1.2.2 概 念 模 型 7 1.2.3 数 据 模 型 的 分 类 9 1.3 数 据 库 设 计 13 1.3.1 需 求 分 析 阶 段 13 1.3.2 概 念 结 构 设 计 16 1.3.3 逻 辑 结 构 设 计 20 1.3.4 数 据 库 物 理 设 计 22 1.3.5 数 据 库 实 施 23 1.3.6 数 据 库 运 行 与 维 护 24 课 后 作 业 25 第 2 章 SQL Server 2000 服 务 器 和 客 户 端 27 2.1 SQ L Server 概 述 27 2.1.1 SQ L 的 特 点 27 2.1.2 SQ L Server 的 结 构 28 2.1.3 SQ L Server 的 数 据 库 文 件 29 2.2 SQ L Server 2000 的 服 务 器 组 件 30 2.3 SQ L Server 2000 服 务 器 端 的 操 作 33 2.3.1 启 动 SQ L Server 2000 33 2.3.2 对 sa 账 号 加 入 密 码 34 2.3.3 SQ L Server 2000 配 置 36
Ⅵ SQL Server 数 据 库 应 用 技 术 2.4 SQ L Server 2000 的 客 户 端 组 件 38 2.5 SQ L Server 2000 客 户 端 的 操 作 38 实 训 41 课 后 作 业 44 第 3 章 数 据 库 及 其 管 理 45 3.1 系 统 数 据 库 45 3.1.1 master 数 据 库 45 3.1.2 model 数 据 库 45 3.1.3 msdb 数 据 库 46 3.1.4 tempdb 数 据 库 46 3.2 创 建 用 户 数 据 库 46 3.2.1 使 用 企 业 管 理 器 创 建 用 户 数 据 库 47 3.2.2 使 用 SQ L 查 询 分 析 器 创 建 用 户 数 据 库 48 3.2.3 事 务 日 志 50 3.2.4 查 看 数 据 库 信 息 51 3.3 管 理 数 据 库 53 3.3.1 打 开 数 据 库 53 3.3.2 增 加 和 缩 减 数 据 库 容 量 53 3.3.3 查 看 目 前 数 据 库 选 项 设 定 及 修 改 56 3.3.4 数 据 库 更 名 58 3.3.5 删 除 数 据 库 59 实 训 60 课 后 作 业 62 第 4 章 数 据 库 中 表 的 基 本 操 作 64 4.1 数 据 库 对 象 64 4.1.1 数 据 表 64 4.1.2 约 束 65 4.1.3 默 认 65 4.1.4 规 则 66 4.1.5 视 图 66 4.1.6 存 储 过 程 66 4.1.7 触 发 器 67 4.2 数 据 表 的 设 计 和 创 建 67 4.2.1 SQ L Server 中 的 数 据 类 型 67 4.2.2 数 据 表 设 计 与 创 建 73 4.2.3 修 改 表 结 构 82
目 录 Ⅶ 4.2.4 插 入 更 新 和 删 除 表 数 据 86 4.3 定 义 约 束 89 4.3.1 约 束 的 类 型 89 4.3.2 约 束 的 创 建 查 看 删 除 89 4.4 使 用 默 认 和 规 则 96 4.4.1 使 用 默 认 96 4.4.2 使 用 规 则 99 实 训 101 课 后 作 业 104 第 5 章 索 引 及 其 应 用 106 5.1 索 引 的 基 础 知 识 106 5.1.1 数 据 存 储 106 5.1.2 索 引 107 5.1.3 索 引 的 分 类 108 5.2 创 建 索 引 109 5.2.1 使 用 企 业 管 理 器 创 建 索 引 109 5.2.2 使 用 T ransact 唱 SQ L 创 建 索 引 114 5.2.3 索 引 的 分 析 与 维 护 116 5.3 索 引 统 计 118 5.3.1 创 建 和 修 改 统 计 信 息 118 5.3.2 统 计 信 息 的 查 看 与 删 除 119 5.4 查 看 与 删 除 索 引 121 5.4.1 查 看 表 中 的 索 引 121 5.4.2 索 引 更 名 与 删 除 123 实 训 125 课 后 作 业 126 第 6 章 SQL Server 的 数 据 查 询 128 6.1 SELEC T 语 句 中 的 数 学 问 题 128 6.1.1 SQ L Server 中 的 变 量 128 6.1.2 SQ L Server 的 运 算 符 129 6.1.3 SQ L Server 中 的 函 数 130 6.2 SELEC T 语 句 136 6.2.1 简 单 查 询 136 6.2.2 FRO M 子 句 与 IN T O 子 句 137 6.2.3 使 用 W HERE 子 句 设 置 查 询 条 件 139 6.2.4 查 询 结 果 排 序 及 ORDER BY 子 句 143
Ⅷ SQL Server 数 据 库 应 用 技 术 6.2.5 GRO U P BY 子 句 与 H A VING 子 句 145 6.2.6 CO M PU T E 子 句 148 6.3 连 接 查 询 149 6.3.1 连 接 概 述 149 6.3.2 内 连 接 151 6.3.3 外 连 接 153 6.3.4 交 叉 连 接 155 6.3.5 自 连 接 156 6.4 嵌 套 查 询 156 6.4.1 单 值 嵌 套 查 询 157 6.4.2 多 值 嵌 套 查 询 157 6.5 联 合 159 实 训 160 课 后 作 业 164 第 7 章 数 据 复 制 168 7.1 复 制 模 型 168 7.1.1 复 制 与 出 版 的 关 系 168 7.1.2 复 制 模 型 169 7.2 复 制 的 类 型 169 7.2.1 快 照 复 制 170 7.2.2 事 务 复 制 170 7.2.3 合 并 复 制 171 7.3 配 置 复 制 171 7.4 建 立 和 使 用 复 制 176 7.4.1 创 建 发 布 176 7.4.2 订 阅 181 7.4.3 创 建 强 制 订 阅 182 7.5 通 过 Internet 执 行 复 制 185 7.6 复 制 监 视 器 186 实 训 188 课 后 作 业 190 第 8 章 视 图 及 其 应 用 192 8.1 视 图 的 概 述 192 8.1.1 视 图 的 概 念 192 8.1.2 使 用 视 图 的 优 点 和 缺 点 192 8.2 视 图 的 创 建 193
目 录 Ⅸ 8.2.1 使 用 企 业 管 理 器 创 建 视 图 193 8.2.2 使 用 T ransact 唱 SQ L 创 建 视 图 195 8.2.3 使 用 创 建 视 图 向 导 程 序 199 8.3 视 图 定 义 的 查 询 与 修 改 200 8.3.1 查 看 和 修 改 视 图 定 义 200 8.3.2 视 图 的 删 除 206 8.4 通 过 视 图 查 询 与 更 新 数 据 207 8.4.1 通 过 视 图 查 询 数 据 207 8.4.2 通 过 视 图 更 新 数 据 208 实 训 209 课 后 作 业 210 第 9 章 存 储 过 程 与 触 发 器 213 9.1 存 储 过 程 概 述 213 9.1.1 什 么 是 存 储 过 程 213 9.1.2 存 储 过 程 类 型 213 9.1.3 存 储 过 程 的 好 处 215 9.2 创 建 和 执 行 存 储 过 程 216 9.2.1 创 建 和 执 行 不 带 参 数 的 存 储 过 程 216 9.2.2 创 建 和 执 行 带 参 数 的 存 储 过 程 219 9.3 修 改 和 删 除 存 储 过 程 226 9.3.1 查 看 存 储 过 程 226 9.3.2 修 改 存 储 过 程 226 9.3.3 删 除 存 储 过 程 228 9.4 触 发 器 的 创 建 和 管 理 228 9.4.1 触 发 器 概 述 228 9.4.2 触 发 器 的 创 建 229 9.4.3 管 理 触 发 器 233 实 训 236 课 后 作 业 239 第 10 章 SQL Server 的 程 序 设 计 240 10.1 批 处 理 与 流 程 控 制 240 10.1.1 批 处 理 240 10.1.2 流 程 控 制 241 10.2 事 务 处 理 246 10.2.1 事 务 概 述 246 10.2.2 事 务 管 理 247
Ⅹ SQL Server 数 据 库 应 用 技 术 10.2.3 事 务 模 式 249 10.2.4 事 务 日 志 250 10.3 锁 机 制 250 10.3.1 锁 的 控 制 方 法 250 10.3.2 查 看 锁 的 信 息 251 10.3.3 死 锁 252 10.4 游 标 253 10.4.1 游 标 的 定 义 及 其 优 点 253 10.4.2 使 用 游 标 254 10.4.3 游 标 示 例 257 实 训 258 课 后 作 业 261 第 11 章 数 据 转 换 服 务 265 11.1 导 入 / 导 出 概 述 265 11.2 导 入 数 据 266 11.2.1 导 入 Excel 工 作 表 266 11.2.2 导 入 文 本 文 件 269 11.3 导 出 数 据 272 11.3.1 导 出 数 据 至 Access 272 11.3.2 导 出 数 据 至 文 本 文 件 274 11.4 使 用 D T S 设 计 器 275 11.5 使 用 bcp 和 BU L K INSER T 278 11.5.1 批 复 制 程 序 278 11.5.2 BU LK INSER T 283 实 训 284 课 后 作 业 285 第 12 章 SQL Server 2000 的 安 全 管 理 287 12.1 SQ L Server 2000 的 安 全 认 证 模 式 287 12.1.1 身 份 验 证 287 12.1.2 权 限 认 证 288 12.2 创 建 和 管 理 安 全 账 户 289 12.2.1 创 建 安 全 账 户 289 12.2.2 管 理 安 全 账 户 295 12.2.3 删 除 登 录 和 用 户 297 12.3 管 理 数 据 库 用 户 和 角 色 298 12.3.1 服 务 器 角 色 298
目 录 Ⅺ 12.3.2 数 据 库 角 色 299 12.4 SQ L Server 权 限 管 理 302 12.4.1 使 用 企 业 管 理 器 管 理 权 限 303 12.4.2 使 用 T ransact 唱 SQ L 语 句 管 理 权 限 304 实 训 307 课 后 作 业 310 第 13 章 备 份 与 还 原 312 13.1 备 份 与 还 原 的 概 述 312 13.1.1 备 份 与 还 原 概 念 312 13.1.2 备 份 与 还 原 方 式 313 13.2 数 据 库 的 备 份 314 13.2.1 备 份 设 备 314 13.2.2 使 用 企 业 管 理 器 进 行 备 份 316 13.2.3 使 用 向 导 进 行 备 份 317 13.2.4 使 用 查 询 分 析 器 进 行 备 份 320 13.3 数 据 库 的 还 原 324 13.3.1 使 用 企 业 管 理 器 还 原 数 据 库 324 13.3.2 使 用 查 询 分 析 器 还 原 数 据 库 326 实 训 330 课 后 作 业 332 第 14 章 SQL Server 编 程 接 口 333 14.1 通 过 ODBC 访 问 SQ L Server 数 据 库 333 14.1.1 ODBC 的 概 述 333 14.1.2 通 过 Excel 访 问 SQ L Server 数 据 库 338 14.1.3 通 过 Visual Basic 访 问 SQ L Server 数 据 库 343 14.1.4 通 过 PowerBuilder 访 问 SQ L Server 数 据 库 351 14.2 使 用 ADO 操 作 数 据 库 中 的 数 据 356 14.2.1 ActiveX 数 据 对 象 (ADO) 356 14.2.2 在 Visual Basic 中 用 ADO 访 问 数 据 库 358 14.2.3 在 C++ Builder 中 用 ADO 访 问 数 据 库 363 实 训 368 课 后 作 业 368 附 录 A 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 教 学 大 纲 373 附 录 B 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 实 训 大 纲 376 参 考 文 献 380
第 1 章 数 据 库 技 术 基 础 数 据 库 是 数 据 管 理 的 实 用 技 术, 是 计 算 机 技 术 的 重 要 分 支, 它 的 出 现 极 大 地 促 进 了 计 算 机 应 用 向 各 行 各 业 的 渗 透 本 章 将 介 绍 数 据 库 技 术 的 有 关 基 本 概 念 特 点, 各 种 数 据 模 型, 数 据 库 系 统 的 构 成 等 知 识, 这 些 内 容 将 为 后 续 数 据 库 技 术 的 学 习 起 到 指 导 性 的 作 用 1.1 数 据 管 理 的 概 述 1.1.1 数 据 数 据 管 理 与 数 据 处 理 1. 数 据 数 据 (Data) 是 描 述 事 物 的 符 号 记 录 除 了 常 用 的 数 字 数 据 外, 文 字 ( 如 名 称 ) 图 形 图 像 声 音 等 信 息, 也 都 是 数 据 日 常 生 活 中, 人 们 为 了 交 流, 会 直 接 用 自 然 语 言 ( 如 汉 语 ) 去 描 述 事 物 在 计 算 机 中, 为 了 存 储 和 处 理 这 些 事 物, 就 要 抽 出 对 这 些 事 物 感 兴 趣 的 特 征 组 成 一 个 记 录 来 描 述 例 如, 在 学 生 档 案 中, 可 以 对 学 生 的 学 号 姓 名 性 别 出 生 年 月 家 庭 住 址 电 话 邮 编 和 入 学 成 绩 等 情 况 这 样 描 述 :0401010202, 聂 晓 明, 男,1987 唱 8 唱 23, 广 州 市 海 珠 区,020 唱 34063342,510310,604 数 据 与 其 语 义 是 不 可 分 的 对 于 上 面 一 条 学 生 记 录, 了 解 其 语 义 的 人 会 得 到 如 下 信 息 : 聂 晓 明 是 一 个 学 生, 学 号 为 0401010202,1987 年 8 月 23 日 出 生, 家 庭 住 址 是 广 州 市 海 珠 区, 电 话 是 020 唱 34063342, 邮 编 是 510310, 入 学 成 绩 是 604 分 ; 而 不 了 解 其 语 义 的 人 则 无 法 理 解 其 含 义 可 见, 数 据 的 形 式 本 身 并 不 能 完 全 表 达 其 内 容, 需 要 经 过 语 义 解 释 2. 数 据 管 理 与 数 据 处 理 现 实 世 界 中 的 事 物 反 映 到 人 们 的 头 脑 里, 经 过 认 识 选 择 命 名 等 综 合 分 析 而 形 成 了 印 象 和 概 念, 产 生 认 识, 这 就 是 信 息, 即 进 入 信 息 世 界 在 信 息 世 界 里, 有 些 信 息 可 以 直 接 用 数 据 表 示, 如 学 生 学 号 出 生 日 期 成 绩 等 ; 有 些 是 由 符 号 文 字 或 其 他 形 式 来 表 示 的 在 计 算 机 中, 所 有 的 信 息 只 能 用 二 进 制 数 表 示, 一 切 信 息 进 入 计 算 机 时, 必 须 是 数 据 化 的 信 息 是 维 持 生 产 活 动 经 济 活 动 和 社 会 活 动 必 不 可 少 的 资 源 ; 数 据 是 将 现 实 世 界 中 的 各 种 信 息 记 录 下 来 可 识 别 的 符 号, 它 用 类 型 和 数 值 来 表 示 数 据 的 表 现 形 式 是 多 种 多 样 的, 例 如 : 文 字 图 形 图 像 声 音 学 生 的 档 案 记 录 商 品 的 销 售 账 目 货 物 的 运 输 情 况 等, 这 些 都 是 数 据 数 据 的 形 式 本 身 并 不 能 完 全 表 达 其 内 容, 它 需 要 经 过 语 义 解 释 数 据 与
2 SQL Server 数 据 库 应 用 技 术 其 语 义 是 不 可 分 的 ; 并 不 是 所 有 的 数 据 都 是 信 息, 信 息 是 一 种 已 经 被 加 工 为 特 定 形 式 的 数 据, 这 种 数 据 形 式 对 接 收 者 来 说 是 有 意 义 的 即 只 有 有 价 值 的 数 据 才 是 信 息 数 据 处 理 是 指 从 某 些 已 知 的 数 据 出 发, 推 导 加 工 出 一 些 新 的 数 据, 这 些 新 的 数 据 又 表 示 了 新 的 信 息 在 具 体 操 作 中, 涉 及 数 据 收 集 管 理 加 工 和 输 出 等 过 程 数 据 处 理 是 用 计 算 机 对 数 据 进 行 处 理 的 系 统 应 用 它 是 一 个 由 人 计 算 机 等 组 成 的 能 进 行 信 息 的 收 集 传 递 存 储 加 工 维 护 分 析 计 划 控 制 决 策 和 使 用 的 系 统, 这 些 基 本 操 作 环 节 称 为 数 据 管 理 数 据 管 理 技 术 是 解 决 上 述 基 本 环 节 的, 而 其 他 环 节 ( 加 工 / 计 算 输 出 等 操 作 ) 是 由 应 用 程 序 实 现 的, 所 以 数 据 库 是 管 理 信 息 系 统 (Management Information System,MIS) 的 核 心 在 数 据 处 理 中, 通 常 数 据 的 计 算 比 较 简 单, 而 数 据 的 管 理 比 较 复 杂 数 据 管 理 是 指 数 据 的 收 集 整 理 组 织 存 储 和 检 索 等 操 作, 这 部 分 操 作 是 数 据 处 理 业 务 的 基 本 环 节, 是 任 何 数 据 处 理 业 务 中 必 不 可 少 的 共 有 部 分, 因 此 有 必 要 学 习 和 掌 握 数 据 管 理 的 技 术, 对 数 据 处 理 提 供 有 利 的 支 持 1.1.2 数 据 管 理 的 发 展 数 据 管 理 是 数 据 库 的 核 心 任 务, 内 容 包 括 对 数 据 的 分 类 组 织 编 码 储 存 检 索 和 维 护 随 着 计 算 机 硬 件 和 软 件 的 发 展, 数 据 库 技 术 也 不 断 地 发 展 从 数 据 管 理 方 式 的 角 度 看, 数 据 管 理 到 目 前 共 经 历 了 人 工 管 理 阶 段 文 件 系 统 阶 段 和 数 据 库 系 统 阶 段 1. 人 工 管 理 阶 段 人 工 管 理 阶 段 大 约 在 20 世 纪 50 年 代 中 期 以 前, 那 时 由 于 计 算 机 技 术 相 对 落 后, 硬 件 主 要 是 磁 带 卡 片 纸 带, 没 有 磁 盘, 而 计 算 机 是 很 昂 贵 的 资 源, 主 要 用 于 科 学 计 算 ; 软 件 方 面 也 没 有 操 作 系 统 ( 更 没 有 管 理 数 据 的 软 件 ), 数 据 不 能 保 存, 编 写 程 序 时 要 安 排 数 据 的 物 理 存 储, 数 据 是 面 向 程 序 的, 一 个 程 序 对 应 一 些 数 据 如 图 1 唱 1 所 示 图 1 唱 1 人 工 处 理 阶 段 数 据 管 理 示 意 图 这 个 时 期 数 据 管 理 的 特 点 是 : (1) 数 据 不 保 存 该 时 期 的 计 算 机 主 要 应 用 于 科 学 计 算, 一 般 不 需 要 将 数 据 长 期 保 存, 只 是 在 计 算 某 一 课 题 时 将 数 据 输 入, 用 完 后 不 保 存 原 始 数 据, 也 不 保 存 计 算 结 果 (2) 没 有 对 数 据 进 行 管 理 的 软 件 系 统 程 序 员 不 仅 要 规 定 数 据 的 逻 辑 结 构, 而 且 还 要 在 程 序 中 设 计 物 理 结 构, 包 括 存 储 结 构 存 取 方 法 输 入 输 出 方 式 等 因 此 程 序 中 存 取 数 据 的 子 程 序 随 着 存 储 的 改 变 而 改 变, 数 据 与 程 序 不 具 有 一 致 性 (3) 没 有 文 件 的 概 念 数 据 的 组 织 方 式 必 须 由 程 序 员 自 行 设 计 (4) 一 组 数 据 对 应 于 一 个 程 序, 数 据 是 面 向 应 用 的 即 使 两 个 程 序 用 到 相 同 的 数 据,
第 1 章 数 据 库 技 术 基 础 3 也 必 须 各 自 定 义 各 自 组 织, 数 据 无 法 共 享, 无 法 相 互 利 用 和 互 相 参 照, 从 而 导 致 程 序 和 程 序 之 间 有 大 量 重 复 的 数 据 2. 文 件 系 统 阶 段 文 件 系 统 阶 段 是 指 计 算 机 不 仅 用 于 科 学 计 算, 而 且 还 大 量 用 于 管 理 数 据 的 阶 段 ( 从 20 世 纪 50 年 代 后 期 到 60 年 代 中 期 ) 在 硬 件 方 面, 外 存 储 器 有 了 磁 盘 磁 鼓 等 直 接 存 取 的 存 储 设 备 在 软 件 方 面, 操 作 系 统 中 已 经 有 了 专 门 用 于 管 理 数 据 的 软 件, 称 为 文 件 系 统 在 处 理 方 式 上, 不 仅 有 了 文 件 批 处 理, 而 且 能 够 联 机 实 时 处 理 这 个 时 期 数 据 管 理 的 特 点 是 : (1) 数 据 需 要 长 期 保 存 在 外 存 上 供 反 复 使 用 由 于 计 算 机 大 量 用 于 数 据 处 理, 经 常 对 文 件 进 行 查 询 修 改 插 入 和 删 除 等 操 作, 所 以 数 据 需 要 长 期 保 留, 以 便 于 反 复 操 作 (2) 程 序 之 间 有 了 一 定 的 独 立 性 操 作 系 统 提 供 了 文 件 管 理 功 能 和 访 问 文 件 的 存 取 方 法, 程 序 和 数 据 之 间 有 了 数 据 存 取 的 接 口, 程 序 可 以 通 过 文 件 名 和 数 据 打 交 道, 不 必 再 寻 找 数 据 的 物 理 存 放 位 置 至 此, 数 据 有 了 物 理 结 构 和 逻 辑 结 构 的 区 别, 但 此 时 程 序 和 数 据 之 间 的 独 立 性 尚 不 充 分 (3) 文 件 的 形 式 已 经 多 样 化 由 于 已 经 有 了 直 接 存 取 的 存 储 设 备, 文 件 也 就 不 再 局 限 于 顺 序 文 件, 还 有 了 索 引 文 件 链 表 文 件 等 因 而, 对 文 件 的 访 问 可 以 是 顺 序 访 问, 也 可 以 是 直 接 访 问 (4) 数 据 的 存 取 基 本 上 以 记 录 为 单 位 文 件 系 统 阶 段 程 序 和 数 据 之 间 的 关 系 如 图 1 唱 2 所 示 由 图 1 唱 2 可 以 看 出, 文 件 系 统 中 的 数 据 和 程 序 虽 然 具 有 了 一 定 的 独 立 性, 但 还 很 不 充 分, 每 个 文 件 仍 然 对 应 于 一 个 应 用 程 序, 数 据 还 是 面 向 应 用 的 要 想 对 现 有 的 数 据 再 增 加 一 些 新 的 应 用 是 很 困 难 的, 系 统 不 易 扩 充 一 旦 数 据 的 逻 辑 结 构 改 变, 必 须 修 改 应 用 程 序 并 且, 各 个 文 件 之 间 是 孤 立 的, 不 能 反 映 现 实 世 界 事 物 之 间 的 内 在 联 系, 各 个 不 同 应 用 程 序 之 间 也 不 能 共 享 相 同 的 数 据, 从 而 造 成 数 据 冗 余 度 大, 并 容 易 产 生 相 同 数 据 的 不 一 致 性 图 1 唱 2 文 件 系 统 阶 段 数 据 管 理 示 意 图 3. 数 据 库 系 统 阶 段 到 20 世 纪 60 年 代 后 期, 数 据 管 理 规 模 更 为 庞 大, 应 用 更 广 泛, 数 据 量 剧 增, 共 享 要 求 ( 多 种 应 用 多 种 语 言 互 相 覆 盖 地 共 享 数 据 集 合 ) 更 高, 在 硬 件 方 面 有 了 大 容 量 和 快 速 存 取 磁 盘 于 是 出 现 了 数 据 库 系 统, 它 的 指 导 思 想 是 : 对 所 有 的 数 据 实 行 统 一 的 集 中 的 和 独 立 的 管 理, 使 数 据 存 储 独 立 于 使 用 数 据 的 程 序, 实 现 数 据 共 享 如 图 1 唱 3 所 示 数 据 库 系 统 阶 段 有 如 下 特 点 :
4 SQL Server 数 据 库 应 用 技 术 图 1 唱 3 数 据 库 管 理 阶 段 数 据 管 理 示 意 图 (1) 数 据 共 享 共 享 是 指 多 用 户 多 种 应 用 多 种 语 言 互 相 覆 盖 地 共 享 数 据 集 合 数 据 库 系 统 阶 段 可 以 实 现 文 件 级 记 录 级 数 据 项 级 的 数 据 共 享 (2) 面 向 全 组 织 的 数 据 结 构 化 按 照 某 种 数 据 模 型, 将 整 个 组 织 的 全 部 数 据 组 织 成 一 个 结 构 化 的 数 据 整 体 而 文 件 系 统 是 一 个 无 结 构 的 数 据 集 合, 文 件 之 间 是 孤 立 的, 不 能 反 映 事 物 之 间 的 联 系, 数 据 面 向 专 用, 没 有 弹 性, 不 宜 扩 充 (3) 数 据 独 立 性 数 据 库 系 统 阶 段 的 数 据 具 有 物 理 独 立 性 逻 辑 独 立 性, 而 且 具 有 较 高 的 数 据 和 程 序 的 独 立 性, 将 数 据 描 述 定 义 从 应 用 程 序 中 分 离 出 来, 独 立 于 应 用 程 序 而 存 在, 且 相 互 独 立, 互 不 依 赖 (4) 可 控 数 据 冗 余 度 数 据 库 系 统 阶 段 的 数 据 存 储 不 必 重 复 存 储, 从 而 节 省 存 储 空 间, 保 证 数 据 的 一 致 性 ; 在 理 论 上 数 据 存 储 可 以 做 到 冗 余 度 为 零, 还 可 以 有 意 安 排 若 干 冗 余, 由 用 户 控 制, 称 为 可 控 冗 余 度 (5) 统 一 数 据 控 制 功 能 共 享 一 般 是 并 发 的, 当 多 个 用 户 同 时 使 用 数 据 库 时, 数 据 库 系 统 提 供 如 下 控 制 功 能 : 数 据 安 全 控 制 ; 数 据 完 整 性 控 制 ( 正 确 性 有 效 性 相 容 性 ) ; 并 发 控 制 ; 数 据 恢 复 1.1.3 数 据 库 数 据 库 管 理 系 统 和 数 据 库 系 统 1. 数 据 库 所 谓 数 据 库 (Database,DB), 是 将 数 据 按 一 定 的 数 据 模 型 组 织 描 述 和 储 存, 具 有 较 小 的 冗 余 度, 较 高 的 数 据 独 立 性 和 易 扩 展 性, 并 可 为 各 种 用 户 共 享 的 数 据 集 合 通 常, 收 集 并 抽 取 一 个 应 用 所 需 要 的 大 量 数 据 之 后, 应 该 将 其 保 存 起 来 以 供 进 一 步 加 工 处 理 和 抽 取 有 用 信 息 保 存 方 法 有 多 种, 尤 其 以 保 存 在 数 据 库 中 最 佳 因 为 它 们 一 般 由 相 互 关 联 的 数 据 表 组 成, 能 使 数 据 冗 余 度 尽 可 能 地 小 数 据 表 由 一 些 列 构 成, 列 主 要 用 来 存 储 在 数 据 表 中 的 相 同 数 据 类 型 的 一 系 列 值 2. 数 据 库 管 理 系 统 数 据 库 管 理 系 统 对 收 集 到 的 大 量 数 据 进 行 整 理 加 工 归 并 分 类 计 算 存 储 等 处 理, 产 生 新 的 数 据, 以 便 反 映 事 物 或 现 象 的 本 质 和 特 征 及 其 内 在 联 系 例 如 : 在 微 波 炉 生 产
第 1 章 数 据 库 技 术 基 础 5 中, 生 产 管 理 者 根 据 某 种 微 波 炉 历 年 销 售 数 量 及 最 近 的 市 场 需 求 调 查, 获 得 了 许 多 数 据 再 对 这 些 数 据 进 行 加 工, 就 会 得 出 相 关 微 波 炉 的 市 场 预 测 信 息 生 产 管 理 者 就 可 根 据 这 些 信 息 进 行 分 析 和 评 价, 做 出 对 该 产 品 是 增 产 减 产 还 是 停 产 的 决 策 完 成 这 个 数 据 处 理 任 务 的 是 数 据 库 管 理 系 统 (Database Management System,DBM S) 它 位 于 用 户 与 操 作 系 统 之 间 的 一 层 数 据 管 理 软 件 数 据 库 在 建 立 运 用 和 维 护 时 由 数 据 库 管 理 系 统 统 一 管 理 统 一 控 制 它 使 用 户 方 便 地 定 义 数 据 和 操 纵 数 据, 并 能 够 保 证 数 据 的 安 全 性 完 整 性 以 及 多 用 户 对 数 据 的 并 发 使 用 及 发 生 故 障 后 的 数 据 库 恢 复 3. 数 据 库 系 统 数 据 库 系 统 (Database System,DBS) 一 般 由 数 据 库 数 据 库 管 理 系 统 ( 及 其 开 发 工 具 ) 应 用 系 统 数 据 库 管 理 员 和 用 户 构 成 数 据 库 系 统 可 用 图 1 唱 4 表 示 图 1 唱 4 数 据 库 系 统 其 中 数 据 库 管 理 员 和 用 户 主 要 是 指 存 储 维 护 和 检 索 数 据 的 各 类 使 用 者, 主 要 有 三 类 : (1) 最 终 用 户 (End User,E U) 最 终 用 户 是 应 用 程 序 的 使 用 者, 通 过 应 用 程 序 与 数 据 库 进 行 交 互 他 们 通 过 计 算 机 联 机 终 端 存 取 数 据 库 的 数 据, 具 体 操 作 应 用 程 序, 通 过 应 用 程 序 的 用 户 界 面, 使 用 数 据 库 来 完 成 其 业 务 活 动 数 据 库 的 模 式 结 构 对 最 终 用 户 是 透 明 的 (2) 应 用 程 序 员 (Application Programmer,AP) 数 据 库 系 统 一 般 需 要 一 个 以 上 的 应 用 程 序 员 在 开 发 周 期 内 完 成 数 据 库 结 构 设 计 应 用 程 序 开 发 等 任 务 ; 在 后 期 管 理 应 用 程 序, 保 证 使 用 周 期 中 对 应 用 程 序 在 功 能 及 性 能 方 面 的 维 护 修 改 工 作 应 用 程 序 员 是 指 负 责 设 计 和 编 制 应 用 程 序 的 人 员, 它 使 用 高 级 语 言 编 写 应 用 程 序, 以 对 数 据 库 进 行 存 取 操 作, 并 编 制 具 体 的 应 用 程 序 对 数 据 库 进 行 存 取 操 作 数 据 库 (3) 数 据 库 管 理 员 (Database Administrator,DBA) DBA 其 职 能 是 对 数 据 库 进 行 日 常 的 管 理, 负 责 全 面 管 理 和 控 制 数 据 库 系 统 数 据 库 管 理 员 的 素 质 在 一 定 程 度 上 决 定 了 数 据 库 应 用 的 水 平, 所 以 他 们 是 数 据 库 系 统 中 最 重 要
6 SQL Server 数 据 库 应 用 技 术 的 人 员 数 据 库 管 理 员 的 主 要 职 责 包 括 : 设 计 与 定 义 数 据 库 系 统 ; 帮 助 最 终 用 户 使 用 数 据 库 系 统 ; 监 督 与 控 制 数 据 库 系 统 的 使 用 和 运 行 ; 改 进 和 重 组 数 据 库 系 统, 优 化 数 据 库 系 统 的 性 能 ; 备 份 与 恢 复 数 据 库 ; 当 用 户 的 应 用 需 求 增 加 或 改 变 时,DBA 需 要 对 数 据 库 进 行 较 大 的 改 造, 即 重 新 构 造 数 据 库 1.2 数 据 模 型 现 实 世 界 中, 个 体 间 总 存 在 着 某 些 联 系, 反 映 到 信 息 世 界 中, 是 实 体 间 的 联 系, 由 此 构 成 实 体 模 型 ; 反 映 到 数 据 库 系 统 中, 是 记 录 间 的 联 系, 将 实 体 模 型 数 据 化, 转 化 成 数 据 模 型 如 图 1 唱 5 所 示 在 数 据 库 中 用 数 据 模 型 (Data M odel) 这 个 工 具 来 抽 象 表 示 和 处 理 现 实 世 界 中 的 数 据 和 信 息 通 俗 地 讲 数 据 模 型 就 是 现 实 世 界 的 模 拟 根 据 应 用 目 的, 模 型 分 为 两 个 层 次 : 1 概 念 模 型 ( 信 息 模 型 ) : 从 用 户 角 度 看 到 的 模 型, 是 第 一 层 抽 象 要 求 概 念 简 单, 表 达 清 晰, 易 于 理 解 2 数 据 模 型 : 从 计 算 机 角 度 看 到 的 模 型 要 求 用 有 严 格 语 法 和 语 义 的 语 言 对 数 据 进 行 严 格 的 形 式 化 定 义 限 制 和 规 图 1 唱 5 对 象 的 抽 象 过 程 定, 使 模 型 能 转 变 为 计 算 机 可 以 理 解 的 格 式 主 要 包 括 网 状 模 型 层 次 模 型 关 系 模 型 等 1.2.1 数 据 模 型 的 三 要 素 数 据 模 型 是 严 格 定 义 的 概 念 的 集 合, 这 些 概 念 精 确 地 描 述 系 统 的 静 态 特 性 动 态 特 性 和 完 整 性 约 束 条 件 1. 数 据 结 构 数 据 结 构 用 于 描 述 系 统 的 静 态 特 性 数 据 结 构 是 所 研 究 的 对 象 类 型 (Object T ype) 的 集 合 这 些 对 象 是 数 据 库 的 组 成 成 分, 它 们 包 括 两 类, 一 类 是 与 数 据 类 型 内 容 性 质 有 关 的 对 象, 例 如 关 系 模 型 中 的 域 属 性 关 系 等 ; 一 类 是 与 数 据 之 间 联 系 有 关 的 对 象, 例 如 关 系 模 型 中 的 关 系 数 据 结 构 是 刻 画 一 个 数 据 模 型 性 质 最 重 要 的 方 面 因 此 在 数 据 库 系 统 中, 人 们 通 常 按 照 其 数 据 结 构 的 类 型 来 命 名 数 据 模 型 例 如, 层 次 结 构 网 状 结 构 和 关 系 结 构 的 数 据 模 型 分 别 命 名 为 层 次 模 型 网 状 模 型 和 关 系 模 型 2. 数 据 操 作 数 据 操 作 用 于 描 述 系 统 的 动 态 特 性 数 据 操 作 是 指 对 数 据 库 中 各 种 对 象 执 行 允 许 操 作 的 集 合, 包 括 操 作 和 相 关 的 操 作 规 则 操 作 分 为 检 索 和 更 新 ( 删 除 插 入 更 改 ), 对 数 据 模 型 来 说, 要 求 定 义 这 些 操 作 的 确 切 含 义 操 作 符 号 操 作 规 则 ( 如 优 先 级 别 ) 以 及 实 现 操 作 的 语 言 3. 数 据 的 约 束 条 件 数 据 的 约 束 条 件 即 一 组 完 整 性 规 则 的 集 合 完 整 性 规 则 是 给 定 的 数 据 模 型 中 数 据 及
第 1 章 数 据 库 技 术 基 础 7 其 联 系 所 具 有 的 制 约 和 存 储 规 则, 用 以 限 定 符 合 数 据 模 型 的 数 据 库 状 态 以 及 状 态 的 变 化, 以 保 证 数 据 的 正 确 有 效 和 兼 容 数 据 模 型 应 该 反 映 和 规 定 本 数 据 模 型 必 须 遵 守 完 整 性 约 束 条 件 例 如, 在 关 系 模 型 中, 任 何 关 系 必 须 满 足 实 体 完 整 性 和 参 照 完 整 性 两 个 条 件 此 外, 数 据 模 型 还 应 该 提 供 定 义 完 整 性 约 束 条 件 的 机 制, 以 反 映 具 体 应 用 所 涉 及 的 数 据 必 须 遵 守 的 特 定 的 语 义 约 束 条 件 1.2.2 概 念 模 型 数 据 模 型 是 数 据 库 系 统 的 核 心 和 基 础 各 种 机 器 上 实 现 的 DBM S 软 件 都 是 基 于 某 种 数 据 模 型 的 为 了 把 现 实 世 界 中 的 具 体 事 物 抽 象 组 织 为 某 一 DBM S 支 持 的 数 据 模 型, 人 们 常 常 首 先 将 现 实 世 界 抽 象 为 信 息 世 界, 然 后 将 信 息 世 界 转 换 为 机 器 世 界 也 就 是 说, 首 先 把 现 实 世 界 中 的 客 观 对 象 抽 象 为 某 一 种 信 息 结 构, 这 种 信 息 结 构 并 不 依 赖 于 具 体 的 计 算 机 系 统 是 不 是 某 一 个 DBM S 支 持 的 数 据 模 型, 而 是 概 念 级 的 模 型 ; 然 后 再 把 概 念 模 型 转 换 为 计 算 机 上 某 一 DBM S 支 持 的 数 据 模 型 这 一 过 程 如 图 1 唱 4 所 示, 不 难 看 出, 概 念 模 型 实 际 上 是 现 实 世 界 到 机 器 世 界 的 一 个 中 间 层 次, 用 于 信 息 世 界 的 建 模 概 念 模 型 有 如 下 特 点 : 1 具 有 较 强 的 语 义 表 达 能 力, 能 够 方 便 直 接 地 表 达 应 用 中 的 各 种 语 义 知 识 2 简 单 清 晰 易 于 用 户 理 解, 是 用 户 与 数 据 库 设 计 人 员 之 间 进 行 交 流 的 语 言 1. 概 念 模 型 中 的 基 本 概 念 (1) 实 体 (Entity) : 客 观 存 在 并 可 以 相 互 区 分 的 事 物, 例 如 人 物 实 际 的 对 象 某 些 概 念 或 事 物 之 间 的 联 系 若 干 个 属 性 的 属 性 值 组 成 的 集 合, 用 来 表 征 一 个 实 体 如 聂 晓 明 040123 男, 表 示 聂 晓 明 这 个 实 体 同 类 实 体 的 集 合 则 组 成 了 实 体 集 例 如 描 述 全 部 学 生 的 实 体 就 构 成 了 学 生 实 体 集, 反 映 了 一 个 学 校 全 部 学 生 的 情 况 (2) 属 性 (Attribute) : 实 体 所 具 有 的 某 一 特 征, 一 个 实 体 可 以 由 若 干 个 属 性 来 刻 画 它 是 事 物 的 某 一 方 面 的 特 征 的 抽 象 描 述 例 如 学 生 可 以 通 过 学 生 的 姓 名 学 号 性 别 出 生 日 期 等 特 征 来 描 述, 称 姓 名 学 号 性 别 年 龄 为 该 事 物 的 属 性 属 性 值 是 属 性 的 具 体 取 值, 如 学 生 姓 名 为 王 一 明, 学 号 为 0401010704, 性 别 为 男, 出 生 日 期 为 1986 年 3 月 3 日, 这 些 具 体 值 即 为 属 性 值 (3) 关 键 字 (Key) : 惟 一 标 识 实 体 的 属 性 或 属 性 组 合 例 如, 在 学 生 实 体 集 合 中, 学 号 可 以 惟 一 地 标 识 每 个 学 生 实 体, 所 以 学 号 为 关 键 字 在 有 些 实 体 集 中, 可 以 有 多 个 关 键 字, 例 如 学 生 实 体 集, 如 果 学 生 姓 名 无 重 名, 则 属 性 姓 名 也 可 作 为 关 键 字 通 常 选 定 其 中 一 个, 被 选 的 那 一 个 关 键 字 是 主 关 键 字, 其 他 的 关 键 字 是 次 关 键 字 次 关 键 字 在 实 体 集 中 经 常 选 择 一 些 不 能 惟 一 标 识 实 体 的 属 性 来 标 识 实 体, 这 样 的 属 性 叫 次 关 键 字 例 如, 学 生 的 姓 名 考 试 分 数 等 都 可 以 充 当 次 关 键 字 (4) 域 (Domain) : 某 个 ( 些 ) 属 性 的 取 值 范 围, 例 如, 性 别 的 域 为 ( 男, 女 ) (5) 实 体 型 (Entity T ype) : 具 有 相 同 属 性 的 实 体 具 有 共 同 的 特 征 和 性 质, 用 实 体 名 及 其 属 性 名 集 合 来 抽 象 和 描 述 同 类 实 体, 称 为 实 体 型 例 如, 学 生 ( 学 号 姓 名 年 龄 性 别 系 年 级 ) 是 一 个 实 体 型
8 SQL Server 数 据 库 应 用 技 术 (6) 实 体 集 (Entity Set) : 同 型 实 体 的 集 合 称 为 实 体 集 例 如, 全 体 学 生 就 是 一 个 实 体 集 (7) 联 系 (Relationship) : 在 现 实 世 界 中, 事 务 内 部 以 及 事 务 之 间 是 有 联 系 的, 这 些 联 系 在 信 息 世 界 中 反 映 为 实 体 内 部 的 联 系 和 实 体 之 间 的 联 系 实 体 内 部 的 联 系 通 常 是 指 组 成 实 体 的 各 属 性 之 间 的 联 系 两 个 实 体 型 之 间 的 联 系 可 以 分 为 三 类 : 1 1 对 1 联 系 (1 1) 如 果 对 于 实 体 集 A 中 的 每 一 个 实 体, 实 体 集 B 中 至 多 有 一 个 实 体 与 之 联 系, 反 之 亦 然, 则 称 实 体 集 A 与 实 体 集 B 具 有 一 对 一 联 系 记 为 1 1 例 如, 学 校 里 面, 一 个 教 研 室 只 有 一 个 教 研 室 主 任, 而 - 个 教 研 室 主 任 只 在 一 个 教 研 室 任 职, 则 教 研 室 与 教 研 室 主 任 具 有 一 对 一 联 系 2 1 对 多 联 系 (1 n) 如 果 对 于 实 体 集 A 中 的 每 一 个 实 体, 实 体 集 B 中 有 n 个 实 体 (n 0) 与 之 联 系, 反 之, 对 于 实 体 集 B 中 的 每 一 个 实 体, 实 体 集 A 中 至 多 只 有 一 个 实 体 与 之 联 系, 则 称 实 体 集 A 与 实 体 集 B 有 一 对 多 联 系 记 为 1 n 例 如, 一 个 教 研 室 中 有 若 干 名 教 师, 而 每 个 教 师 只 能 属 于 一 个 教 研 室 的 成 员, 则 教 研 室 与 教 师 之 间 具 有 一 对 多 联 系 3 多 对 多 联 系 (m n) 如 果 对 于 实 体 集 A 中 的 每 一 个 实 体, 实 体 集 B 中 有 n 个 实 体 (n 0) 与 之 联 系, 反 之, 对 于 实 体 集 B 中 的 每 一 个 实 体, 实 体 集 A 中 也 有 m 个 实 体 (m 0) 与 之 联 系, 则 称 实 体 集 A 与 实 体 集 B 具 有 多 对 多 联 系 记 为 m n 例 如, 一 门 课 程 有 若 干 个 学 生 参 加 考 试, 而 一 个 学 生 期 末 需 要 参 加 多 门 课 程 的 考 试, 则 课 程 与 学 生 之 间 具 有 多 对 多 联 系 实 际 上, 一 对 一 联 系 是 一 对 多 联 系 的 特 例, 而 一 对 多 联 系 又 是 多 对 多 联 系 的 特 例 实 体 型 之 间 的 这 种 一 对 一 一 对 多 多 对 多 联 系 不 仅 存 在 于 两 个 实 体 型 之 间, 也 存 在 于 两 个 以 上 的 实 体 型 之 间 若 实 体 集 E1,E2,,En 存 在 联 系, 对 于 该 实 体 集 中 的 给 定 实 体, 最 多 只 和 实 体 集 中 的 一 个 实 体 Ei 相 联 系, 则 说 Ei 与 E1,E2,Ei - 1,Ei + 1,,En 之 间 的 联 系 是 一 对 多 的 例 如, 对 于 课 程 教 师 与 教 室 三 个 实 体 型, 一 门 课 程 可 能 有 若 干 位 教 师 讲 授, 使 用 若 干 间 教 室 给 若 干 个 班 级 上 课, 而 在 某 一 时 间 段 每 一 位 教 师 只 能 讲 授 一 门 课 程, 每 一 间 教 室 只 能 供 一 个 班 级 ( 或 一 位 教 师 ) 使 用, 则 课 程 教 师 与 教 室 之 间 的 联 系 是 一 对 多 的 同 一 个 实 体 集 内 的 各 实 体 之 间 也 可 以 存 在 一 对 一 一 对 多 多 对 多 的 联 系 例 如, 学 生 实 体 集 内 部 具 有 领 导 与 被 领 导 的 联 系, 即 某 一 学 生 ( 班 干 部 ) 领 导 若 干 名 学 生, 而 一 个 学 生 仅 被 另 外 一 个 学 生 直 接 领 导, 因 此 这 是 一 对 多 的 联 系 2. 概 念 模 型 的 表 示 方 法 概 念 模 型 的 表 示 方 法 最 常 用 的 是 实 体 联 系 方 法 (Entity 唱 Relationship Approach, E 唱 R 方 法 ), 是 P.P.S.Chen 于 1976 年 提 出 的, 该 方 法 是 用 E 唱 R 图 来 描 述 现 实 世 界 的 概 念 模 型 概 念 模 型 的 E 唱 R 表 示 方 法 有 如 下 优 点 : (1) E 唱 R 方 法 是 抽 象 和 描 述 现 实 世 界 的 有 力 工 具 (2) 用 E 唱 R 方 法 表 示 的 概 念 模 型 与 DBM S 所 支 持 的 数 据 模 型 相 独 立, 是 各 种 数 据 模 型 的 共 同 基 础 E 唱 R 方 法 采 用 如 下 方 法 来 表 示 实 体 联 系 : 1 使 用 长 方 形 来 表 示 实 体 型, 框 内 写 上 实 体 名 2 椭 圆 型 表 示 实 体 的 属 性, 并 用 无 向 边 把 实 体 和 属 性 连 接 起 来
第 1 章 数 据 库 技 术 基 础 9 3 用 菱 形 表 示 实 体 间 的 联 系, 菱 形 框 内 写 上 联 系 名, 用 无 向 边 把 菱 形 分 别 与 有 关 实 体 相 连 接, 在 无 向 边 旁 标 上 联 系 的 类 型 (1 1,1 n 或 m n), 若 实 体 之 间 联 系 也 具 有 属 性, 则 把 属 性 和 菱 形 也 用 无 向 边 连 接 上 需 要 注 意 的 是, 联 系 本 身 也 是 一 种 实 体 型, 也 可 以 有 属 性 如 果 一 个 联 系 具 有 属 性, 则 这 些 属 性 也 要 用 无 向 边 与 该 联 系 连 接 起 来 图 1 唱 6 用 E 唱 R 图 描 述 了 上 面 有 关 两 个 实 体 型 之 间 的 三 类 联 系 三 个 实 体 型 之 间 的 一 对 多 联 系 和 一 个 实 体 型 内 部 的 一 对 多 联 系 的 例 子 图 1 唱 6 实 体 型 间 及 实 体 型 的 联 系 假 设 上 面 的 五 个 实 体 型 学 生 班 级 课 程 教 师 教 师 分 别 具 有 下 列 属 性 : 瞯 学 生 : 学 号 姓 名 出 生 日 期 性 别 家 庭 住 址 电 话 号 码 等 瞯 班 级 : 班 级 编 号 所 属 院 系 对 应 专 业 班 长 等 瞯 课 程 : 课 程 号 课 程 名 课 程 类 型 课 程 学 分 课 程 学 时 等 瞯 教 师 : 职 工 号 姓 名 性 别 年 龄 职 称 电 话 号 码 等 瞯 教 室 : 教 室 编 码 教 室 名 称 教 室 类 型 教 室 设 备 教 室 容 量 等 这 五 个 实 体 的 属 性 用 E 唱 R 图 表 示, 如 图 1 唱 7(a1 ~ a5) 所 示 这 五 个 实 体 之 间 的 联 系 可 以 用 E 唱 R 图 表 示, 如 图 1 唱 7(b) 所 示 注 意, 考 试 和 组 成 两 个 联 系 又 都 分 别 具 有 各 自 的 属 性 将 图 1 唱 7(a1 ~ a5) 与 图 1 唱 7(b) 合 并 在 一 起 就 是 一 个 完 整 的 关 于 学 校 课 程 管 理 的 概 念 模 型 了 但 在 实 际 当 中, 在 一 个 概 念 模 型 中 涉 及 的 实 体 和 实 体 的 属 性 较 多 时, 为 了 清 晰 起 见, 往 往 采 用 图 1 唱 7 的 方 法, 将 实 体 及 其 属 性 与 实 体 及 其 联 系 分 别 用 两 张 E 唱 R 图 表 示 实 体 联 系 方 法 (E 唱 R 方 法 ) 是 抽 象 和 描 述 现 实 世 界 的 有 力 工 具 用 E 唱 R 图 表 示 的 概 念 模 型 独 立 于 具 体 的 DBM S 所 支 持 的 数 据 模 型, 它 是 各 种 数 据 模 型 的 共 同 基 础, 因 而 比 数 据 模 型 更 一 般 更 抽 象 更 接 近 现 实 世 界 1.2.3 数 据 模 型 的 分 类 当 前 流 行 的 基 本 数 据 模 型 有 层 次 模 型 网 状 模 型 关 系 模 型 它 们 之 间 的 根 本 区 别 在 于
10 SQL Server 数 据 库 应 用 技 术 图 1 唱 7 E 唱 R 图 实 例 数 据 之 间 的 联 系 的 表 示 方 式 不 同 ( 记 录 型 之 间 的 联 系 方 式 不 同 ) 按 照 三 类 数 据 模 型 设 计 和 实 现, 数 据 库 系 统 又 可 以 分 为 三 类 : 关 系 数 据 库 系 统 层 次 数 据 库 系 统 网 状 数 据 库 系 统 1. 层 次 模 型 (1) 层 次 数 据 模 型 的 数 据 结 构 1 层 次 模 型 的 基 本 结 构 层 次 模 型 用 树 形 结 构 来 表 示 各 类 实 体 以 及 实 体 间 的 联 系 每 个 节 点 表 示 一 个 记 录 类 型, 节 点 之 间 的 连 线 表 示 记 录 类 型 间 的 联 系, 这 种 联 系 只 能 是 父 子 联 系 每 个 记 录 类 型 可 包 含 若 干 个 字 段, 在 这 个 模 型 里, 记 录 类 型 描 述 的 是 实 体, 字 段 描 述 实 体 的 属 性 任 何 一 个 给 定 的 记 录 值 只 有 按 其 路 径 查 看 时, 才 能 显 出 它 的 全 部 意 义, 没 有 一 个 子 女 记 录 值 能 够 脱 离 双 亲 记 录 值 而 独 立 存 在 层 次 模 型 表 示 各 类 实 体 以 及 实 体 间 的 联 系, 存 在 如 下 特 点 : 瞯 只 有 一 个 节 点 没 有 双 亲 节 点, 称 之 为 根 节 点 ; 瞯 根 以 外 的 其 他 节 点 有 且 只 有 一 个 双 亲 节 点 这 样 就 使 得 层 次 数 据 库 系 统 只 能 处
第 1 章 数 据 库 技 术 基 础 11 理 一 对 多 的 实 体 关 系 那 么 如 何 在 层 次 模 型 中 表 示 多 对 多 联 系? 方 法 是 : 首 先 将 其 分 解 成 一 对 多 联 系, 然 后 再 用 多 对 多 联 系 表 示 2 层 次 数 据 模 型 的 操 纵 与 完 整 性 约 束 层 次 数 据 模 型 的 操 纵 主 要 有 查 询 插 入 删 除 和 更 新 进 行 插 入 删 除 更 新 操 作 时 要 满 足 层 次 模 型 的 完 整 性 约 束 条 件 : 瞯 进 行 插 入 操 作 时, 如 果 没 有 相 应 的 双 亲 节 点 值 就 不 能 插 入 子 女 节 点 值 瞯 进 行 删 除 操 作 时, 如 果 删 除 双 亲 节 点 值, 则 相 应 的 子 女 节 点 值 也 被 同 时 删 除 瞯 进 行 更 新 操 作 时, 应 更 新 所 有 相 应 记 录, 以 保 证 数 据 的 一 致 性 (2) 层 次 数 据 模 型 的 优 缺 点 层 次 数 据 模 型 优 点 : 数 据 模 型 比 较 简 单, 操 作 方 便 ; 对 于 实 体 间 联 系 是 固 定 的, 且 预 先 定 义 好 应 用 系 统, 性 能 较 高 ; 提 供 良 好 的 完 整 性 支 持 层 次 数 据 模 型 缺 点 : 不 适 合 于 表 示 非 层 次 性 的 联 系 ; 对 插 入 和 删 除 操 作 的 限 制 比 较 多 ; 查 询 子 女 节 点 必 须 通 过 双 亲 节 点 ; 由 于 结 构 严 密, 层 次 命 令 趋 于 程 序 化 2. 网 状 模 型 (1) 网 状 数 据 模 型 的 数 据 结 构 网 状 数 据 模 型 是 一 种 比 层 次 模 型 更 具 普 遍 性 的 结 构, 它 去 掉 了 层 次 模 型 的 两 个 限 制, 允 许 多 个 节 点 没 有 双 亲 节 点, 允 许 节 点 有 多 个 双 亲 节 点 此 外 它 还 允 许 两 个 节 点 之 间 有 多 种 联 系 ( 称 之 为 复 合 联 系 ) (2) 网 状 数 据 模 型 的 操 纵 与 完 整 性 约 束 网 状 数 据 模 型 的 操 纵 主 要 包 括 查 询 插 入 删 除 和 更 新 数 据 进 行 操 作 时 有 如 下 特 点 : 瞯 插 入 操 作 允 许 插 入 尚 未 确 定 双 亲 节 点 值 的 子 女 节 点 值 ; 瞯 删 除 操 作 允 许 只 删 除 双 亲 节 点 值 ; 瞯 更 新 操 作 时 只 需 更 新 指 定 记 录 即 可 ; 瞯 查 询 操 作 可 以 有 多 种 方 法, 可 根 据 具 体 情 况 选 用 (3) 网 状 数 据 模 型 的 优 缺 点 网 状 数 据 模 型 优 点 : 能 够 更 为 直 接 地 描 述 现 实 世 界 ; 具 有 良 好 的 性 能, 存 取 效 率 较 高 网 状 数 据 模 型 缺 点 : 其 DDL 语 言 极 其 复 杂 ; 数 据 独 立 性 较 差 由 于 实 体 间 的 联 系 本 质 上 是 通 过 存 取 路 径 指 示 的, 因 此 应 用 程 序 在 访 问 数 据 时 要 指 定 存 取 路 径 3. 关 系 模 型 (1) 关 系 数 据 模 型 的 数 据 结 构 在 用 户 看 来, 一 个 关 系 模 型 的 逻 辑 结 构 是 一 张 二 维 表, 它 由 行 和 列 组 成 在 关 系 模 型 中, 实 体 以 及 实 体 间 的 联 系 都 用 关 系 来 表 示 关 系 模 型 要 求 关 系 必 须 是 规 范 化 的, 最 基 本 的 条 件 就 是 关 系 的 每 一 个 分 量 必 须 是 一 个 不 可 分 的 数 据 项, 即 不 允 许 表 中 还 有 表 例 如, 图 1 唱 8 中 的 学 生 基 本 信 息 表 就 是 一 个 关 系 模 型, 它 涉 及 以 下 概 念
12 SQL Server 数 据 库 应 用 技 术 瞯 关 系 : 对 应 通 常 所 说 的 表, 如 图 1 唱 8 中 的 这 张 学 生 基 本 信 息 表 ; 瞯 记 录 : 图 中 的 一 行 即 为 一 个 记 录, 如 图 中 有 20 行, 即 有 20 个 记 录 ; 瞯 属 性 : 图 中 的 一 列 即 为 一 个 属 性, 如 图 中 有 6 列, 对 应 6 个 属 性 ( 学 号 姓 名 出 生 日 期 性 别 家 庭 住 址 电 话 号 码 ) ; 瞯 主 关 键 字 : 图 中 的 某 个 属 性 组, 它 可 以 惟 一 确 定 一 个 记 录, 如 图 1 唱 8 中 的 学 号, 按 照 学 生 学 号 的 编 排 方 法, 每 个 学 生 的 学 号 都 有 不 相 同, 所 以 它 可 惟 一 确 定 一 个 学 生, 也 就 成 为 本 关 系 的 主 关 键 字 图 1 唱 8 关 系 结 构 在 关 系 模 型 中, 实 体 以 及 实 体 间 的 联 系 都 是 用 关 系 来 表 示 的 例 如, 学 生 课 程 学 生 与 课 程 之 间 的 多 对 多 联 系 在 关 系 模 型 中 可 以 表 示 如 下 : 学 生 ( 学 号 姓 名 出 生 日 期 性 别 家 庭 住 址 电 话 号 码 ) 课 程 ( 课 程 号 课 程 名 课 程 类 型 课 程 学 分 课 程 学 时 ) 考 试 ( 学 号, 课 程 号, 成 绩 ) 关 系 模 型 要 求 关 系 必 须 是 规 范 化 的, 即 要 求 关 系 模 式 必 须 满 足 一 定 的 规 范 条 件, 这 些 规 范 条 件 中 最 基 本 的 一 条 就 是, 关 系 的 每 一 个 分 量 必 须 是 一 个 不 可 分 的 数 据 项, 也 就 是 说, 不 允 许 表 中 还 有 表, 因 此 表 1 唱 1 就 不 符 合 要 求 表 1 唱 1 中, 成 绩 被 分 为 网 络 VB SQ L Server 等 多 项, 这 相 当 于 大 表 中 还 有 一 张 小 表 ( 关 于 成 绩 的 表 ) 表 1 唱 1 不 规 范 表 的 示 例 成 绩 学 号 姓 名 性 别 所 属 院 系 年 龄 籍 贯 网 络 VB SQL Server 20010101 刘 流 女 计 算 机 18 广 东 83.0 78.0 90.0 20010102 张 章 男 信 息 管 理 19 广 西 77.0 78.0 85.5 20010103 李 里 女 多 媒 体 18 广 东 80.0 90.0 79.0 20010151 赵 兆 男 网 络 通 信 18 福 建 88.0 92.0 95.0
第 1 章 数 据 库 技 术 基 础 13 (2) 关 系 数 据 模 型 的 操 作 与 完 整 性 约 束 关 系 数 据 模 型 的 操 作 主 要 包 括 查 询 插 入 删 除 和 更 新 数 据 这 些 操 作 必 须 满 足 关 系 的 完 整 性 约 束 条 件 关 系 的 完 整 性 约 束 条 件 包 括 三 大 类 : 实 体 完 整 性 参 照 完 整 性 和 用 户 定 义 的 完 整 性 关 系 模 型 中 的 数 据 操 作 是 集 合 操 作, 操 作 对 象 和 操 作 结 果 都 是 关 系, 即 若 干 记 录 的 集 合 关 系 模 型 把 存 取 路 径 向 用 户 隐 蔽 起 来, 用 户 只 要 指 出 干 什 么, 不 必 详 细 说 明 怎 么 干, 从 而 大 大 地 提 高 了 数 据 的 独 立 性, 提 高 了 用 户 生 产 率 关 系 数 据 库 标 准 操 作 语 言 是 SQ L 语 言 (3) 关 系 数 据 模 型 的 优 缺 点 关 系 数 据 模 型 的 优 点 : 1 关 系 模 型 是 建 立 在 严 格 的 数 学 概 念 的 基 础 上 的 无 论 实 体 还 是 实 体 之 间 的 联 系 都 用 关 系 来 表 示 对 数 据 的 检 索 结 果 也 是 关 系 ( 即 表 ), 因 此, 概 念 单 一, 其 数 据 结 构 简 单 清 晰 2 关 系 模 型 的 存 取 路 径 对 用 户 透 明, 从 而 具 有 更 高 的 数 据 独 立 性 更 好 的 安 全 保 密 性, 也 简 化 了 程 序 员 的 工 作 和 数 据 库 的 开 发 工 作 关 系 数 据 模 型 的 缺 点 : 由 于 存 取 路 径 对 用 户 透 明, 查 询 效 率 往 往 不 如 非 关 系 数 据 模 型 因 此 为 了 提 高 性 能, 必 须 对 用 户 的 查 询 请 求 进 行 优 化, 从 而 增 加 了 开 发 数 据 库 管 理 系 统 的 负 担 1.3 数 据 库 设 计 数 据 库 设 计 是 一 个 软 件 系 统 工 程, 本 节 将 从 软 件 工 程 的 角 度 讨 论 数 据 库 设 计 的 各 个 阶 段, 掌 握 数 据 库 设 计 的 特 点 数 据 库 设 计 分 为 如 下 几 个 阶 段 1.3.1 需 求 分 析 阶 段 1. 需 求 分 析 的 任 务 需 求 分 析 的 任 务 是 通 过 详 细 调 查 现 实 世 界 要 处 理 的 对 象 ( 组 织 部 门 企 业 等 ), 充 分 了 解 原 系 统 ( 手 工 系 统 或 计 算 机 系 统 ) 工 作 概 况, 明 确 用 户 的 各 种 需 求, 然 后 在 此 基 础 上 确 定 新 系 统 的 功 能 新 系 统 必 须 充 分 考 虑 今 后 可 能 的 扩 充 和 改 变, 不 仅 仅 按 当 前 应 用 需 求 来 设 计 需 求 分 析 的 重 点 是 调 查 收 集 与 分 析 用 户 在 数 据 管 理 中 的 信 息 要 求 处 理 要 求 安 全 性 与 完 整 性 要 求 信 息 要 求 是 指 用 户 需 要 从 数 据 库 中 获 得 信 息 的 内 容 与 性 质 由 用 户 的 信 息 要 求 可 以 导 出 数 据 要 求, 即 在 数 据 库 中 需 要 存 储 哪 些 数 据 处 理 要 求 是 指 用 户 要 求 完 成 什 么 处 理 功 能, 对 处 理 的 响 应 时 间 有 什 么 要 求, 处 理 方 式 是 批 处 理 还 是 联 机 处 理 新 系 统 的 功 能 必 须 能 够 满 足 用 户 的 信 息 要 求 处 理 要 求 安 全 性 与 完 整 性 要 求 确 定 用 户 的 最 终 需 求 其 实 是 一 件 很 困 难 的 事, 这 是 因 为 一 方 面 用 户 缺 少 计 算 机 知 识, 开 始 时 无 法 确 定 计 算 机 究 竟 能 为 自 己 做 什 么, 不 能 做 什 么, 因 此 无 法 马 上 准 确 地 表 达 自 己 的 需 求, 他 们 所 提 出 的 需 求 往 往 不 断 地 变 化 另 一 方 面 设 计 人 员 缺 少 用 户 的 专 业 知 识, 不
14 SQL Server 数 据 库 应 用 技 术 易 理 解 用 户 的 真 正 需 求, 甚 至 误 解 用 户 的 需 求 此 外 新 的 硬 件 软 件 技 术 的 出 现 也 会 使 用 户 需 求 发 生 变 化 因 此 设 计 人 员 必 须 与 用 户 不 断 深 入 地 进 行 交 流, 才 能 逐 步 确 定 用 户 的 实 际 需 求 2. 需 求 分 析 的 方 法 (1) 调 查 组 织 机 构 情 况 包 括 了 解 该 组 织 的 部 门 组 成 情 况 各 部 门 的 职 能 等, 为 分 析 信 息 流 程 做 好 准 备 (2) 调 查 各 部 门 的 业 务 活 动 情 况 包 括 了 解 各 个 部 门 输 入 和 使 用 什 么 数 据 如 何 加 工 处 理 这 些 数 据 输 出 什 么 信 息 输 出 到 什 么 部 门 输 出 结 果 的 格 式 是 什 么 (3) 协 助 用 户 明 确 对 新 系 统 的 各 种 要 求 包 括 信 息 要 求 处 理 要 求 完 全 性 与 完 整 性 要 求 (4) 确 定 新 系 统 的 边 界 确 定 哪 些 功 能 由 计 算 机 完 成 或 将 来 准 备 让 计 算 机 完 成, 哪 些 活 动 由 人 工 完 成 由 计 算 机 完 成 的 功 能 就 是 新 系 统 应 该 实 现 的 功 能 常 用 的 调 查 方 法 有 : 跟 班 作 业 ; 开 调 查 会 ; 请 专 人 介 绍 ; 询 问 ; 设 计 问 卷 调 查 表 请 用 户 填 写 ; 查 阅 记 录 通 过 调 查 了 解 了 用 户 需 求 后, 还 需 要 进 一 步 分 析 和 表 达 用 户 的 需 求 例 如, 采 用 自 顶 向 下 的 结 构 化 分 析 方 法 (Structured Analysis,SA) 分 析 和 表 达 用 户 需 求, 即 从 最 上 层 的 系 统 组 织 机 构 入 手, 采 用 逐 层 分 解 的 方 式 分 析 系 统, 并 且 把 每 一 层 用 数 据 流 图 和 数 据 字 典 描 述 将 处 理 功 能 的 具 体 内 容 分 解 为 若 干 子 功 能, 再 将 每 个 子 功 能 继 续 分 解, 直 到 把 系 统 的 工 作 过 程 表 达 清 楚 为 止 在 处 理 功 能 逐 步 分 解 的 同 时, 它 们 所 用 的 数 据 也 逐 级 分 解, 形 成 若 干 层 次 的 数 据 流 图 数 据 流 图 表 达 了 数 据 和 处 理 过 程 的 关 系 系 统 中 的 数 据 则 借 助 数 据 字 典 (Data Dictionary,DD) 来 描 述 3. 数 据 字 典 对 数 据 库 设 计 来 讲, 数 据 字 典 是 进 行 数 据 收 集 和 分 析 所 获 得 的 各 类 数 据 描 述 的 集 合 通 常 包 括 数 据 项 数 据 结 构 数 据 流 数 据 存 储 和 处 理 过 程 5 个 部 分 (1) 数 据 项 数 据 项 是 不 可 再 分 的 数 据 单 位 对 数 据 项 的 描 述 通 常 包 括 以 下 内 容 : 数 据 项 描 述 = { 数 据 项 名, 数 据 项 含 义 说 明, 别 名, 数 据 类 型, 长 度, 取 值 范 围, 取 值 含 义, 与 其 他 数 据 项 的 逻 辑 关 系 } 其 中 取 值 范 围 与 其 他 数 据 项 的 逻 辑 关 系 定 义 了 数 据 的 完 整 性 约 束 条 件, 是 设 计 数 据 功 能 的 依 据 (2) 数 据 结 构 数 据 结 构 反 映 了 数 据 之 间 的 组 合 关 系 一 个 数 据 结 构 可 以 由 若 干 个 数 据 项 组 成, 也 可 以 由 若 干 个 数 据 结 构 组 成, 或 由 若 干 个 数 据 项 和 数 据 结 构 混 合 组 成 对 数 据 结 构 的 描 述 通 常 包 括 以 下 内 容 : 数 据 结 构 描 述 = { 数 据 结 构 名, 含 义 说 明, 组 成 :{ 数 据 项 或 数 据 结 构 }}
第 1 章 数 据 库 技 术 基 础 15 (3) 数 据 流 数 据 流 是 数 据 结 构 在 系 统 内 传 输 的 路 径 对 数 据 流 的 描 述 通 常 包 括 以 下 内 容 : 数 据 流 描 述 = { 数 据 流 名, 说 明, 数 据 流 来 源, 数 据 流 去 向, 组 成 :{ 数 据 结 构 }, 平 均 流 量, 高 峰 期 流 量 } 其 中 数 据 流 来 源 是 说 明 该 数 据 流 来 自 哪 个 过 程 数 据 流 去 向 是 说 明 该 数 据 流 将 到 哪 个 过 程 去 平 均 流 量 是 指 在 单 位 时 间 ( 每 天 每 周 每 月 等 ) 里 的 传 输 次 数 高 峰 期 流 量 则 是 指 在 高 峰 时 期 的 数 据 流 量 (4) 数 据 存 储 数 据 存 储 是 数 据 结 构 停 留 或 保 存 的 地 方, 也 是 数 据 流 的 来 源 和 去 向 之 一 对 数 据 存 储 的 描 述 通 常 包 括 以 下 内 容 : 数 据 存 储 描 述 = { 数 据 存 储 名, 说 明, 编 号, 流 入 的 数 据 流, 流 出 的 数 据 流, 组 成 : { 数 据 结 构 }, 数 据 量, 存 取 方 式 } 其 中 数 据 量 是 指 每 次 存 取 多 少 数 据, 每 天 ( 每 小 时 每 周 等 ) 存 取 几 次 等 信 息 存 取 方 法 包 括 是 批 处 理, 还 是 联 机 处 理 ; 是 检 索 还 是 更 新 ; 是 顺 序 检 索 还 是 随 机 检 索 等 另 外, 流 入 的 数 据 流 要 指 出 其 来 源, 流 出 的 数 据 流 要 指 出 其 去 向 (5) 处 理 过 程 数 据 字 典 中 只 需 要 描 述 处 理 过 程 的 说 明 性 信 息, 通 常 包 括 以 下 内 容 : 处 理 过 程 描 述 = { 处 理 过 程 名, 说 明, 输 入 : { 数 据 流 }, 输 出 : { 数 据 流 }, 处 理 : { 简 要 说 明 }} 其 中 简 要 说 明 中 主 要 说 明 该 处 理 过 程 的 功 能 及 处 理 要 求 功 能 是 指 该 处 理 过 程 用 来 做 什 么 ( 而 不 是 怎 么 做 ), 处 理 要 求 包 括 处 理 频 度 要 求, 如 单 位 时 间 里 处 理 多 少 事 务 多 少 数 据 量 ; 响 应 时 间 要 求 等 这 些 处 理 要 求 是 后 面 物 理 设 计 的 输 入 及 性 能 评 价 的 标 准 数 据 字 典 是 关 于 数 据 库 中 数 据 的 描 述, 即 元 数 据, 而 不 是 数 据 本 身 数 据 本 身 将 存 放 在 物 理 数 据 库 中, 由 数 据 库 管 理 系 统 管 理 数 据 字 典 有 助 于 这 些 数 据 的 进 一 步 管 理 和 控 制, 为 设 计 人 员 和 数 据 库 管 理 员 在 数 据 库 设 计 实 现 和 运 行 阶 段 控 制 有 关 数 据 提 供 依 据 下 面 以 学 生 管 理 系 统 为 例, 简 要 说 明 如 何 定 义 数 据 字 典 1 该 子 系 统 涉 及 很 多 数 据 项, 其 中 学 号 数 据 项 可 以 如 下 描 述 : 瞯 数 据 项 : 学 号 瞯 含 义 说 明 : 惟 一 标 识 每 个 学 生 瞯 别 名 : 学 生 编 号 瞯 类 型 : 字 符 型 瞯 长 度 :10 瞯 取 值 范 围 :0000000000 ~ 9999999999 瞯 取 值 含 义 : 第 1 ~ 2 位 表 示 学 生 所 在 年 级, 第 3 ~ 4 位 表 示 学 生 所 在 院 系, 第 5 ~ 6 位 表 示 学 生 所 学 专 业, 第 7 ~ 8 位 表 示 学 生 的 班 次 编 号, 第 9 ~ 10 位 表 示 在 班 级 的 顺 序 号 2 学 生 是 学 生 管 理 子 系 统 中 的 一 个 核 心 数 据 结 构, 它 可 以 如 下 描 述 : 瞯 数 据 结 构 : 学 生
16 SQL Server 数 据 库 应 用 技 术 瞯 含 义 说 明 : 是 学 生 管 理 子 系 统 的 主 体 数 据 结 构, 定 义 了 一 个 学 生 的 有 关 信 息 瞯 组 成 : 学 号 姓 名 出 生 日 期 性 别 家 庭 住 址 电 话 号 码 邮 政 编 码 入 学 成 绩 3 数 据 流 考 试 / 考 查 可 以 如 下 描 述 : 瞯 数 据 流 : 平 时 成 绩 期 中 成 绩 期 末 成 绩 瞯 说 明 : 测 试 学 生 学 习 程 度 和 测 量 教 师 教 学 水 平 瞯 数 据 流 来 源 : 考 试 / 考 查 的 卷 面 分 数 瞯 数 据 流 去 向 : 课 程 最 终 评 定 分 数 瞯 组 成 : 学 号 姓 名 课 程 号 分 数 4 数 据 存 储 学 生 登 记 表 可 以 如 下 描 述 : 瞯 数 据 存 储 : 学 生 登 记 表 瞯 说 明 : 记 录 学 生 的 基 本 情 况 瞯 流 入 数 据 流 : 学 号 姓 名 出 生 日 期 性 别 家 庭 住 址 电 话 邮 编 入 学 成 绩 瞯 流 出 数 据 流 : 人 数 年 龄 段 男 女 比 例 平 均 成 绩 瞯 存 取 方 式 : 随 机 存 取 瞯 数 据 量 : 记 录 字 节 数 年 级 标 准 班 人 数 班 级 数 5 处 理 过 程 教 室 安 排 可 如 下 描 述 : 瞯 处 理 过 程 : 安 排 教 室 瞯 说 明 : 为 所 有 班 级 按 照 课 程 规 格 分 配 教 室 瞯 输 入 : 课 程 编 号, 课 程 类 型, 教 室 编 号, 教 师 编 号, 班 级 编 号 瞯 输 出 : 教 室 安 排 表 ( 课 表 ) 瞯 处 理 : 新 学 期 学 生 报 到 注 册 后, 为 所 有 班 级 分 配 授 课 教 师 确 定 某 一 专 业 的 班 级 数 据 和 课 程 规 格, 给 每 一 个 班 级 某 一 门 课 程 安 排 教 室 和 授 课 教 师 要 求 同 一 间 教 室 只 能 安 排 同 一 班 级 的 学 生, 同 一 个 教 师 在 某 一 时 间 段 只 能 安 排 在 一 个 教 室 授 课 1.3.2 概 念 结 构 设 计 将 需 求 分 析 得 到 的 用 户 需 求 抽 象 为 信 息 结 构 即 概 念 模 型 的 过 程 就 是 概 念 结 构 设 计 概 念 结 构 是 对 现 实 世 界 的 一 种 抽 象, 即 对 实 际 的 人 物 事 和 概 念 进 行 人 为 处 理, 抽 取 人 们 关 心 的 共 同 特 性, 忽 略 非 本 质 的 细 节, 并 把 这 些 特 性 用 各 种 概 念 精 确 地 加 以 描 述 概 念 结 构 独 立 于 数 据 库 逻 辑 结 构, 也 独 立 于 支 持 数 据 库 的 DBM S 它 是 现 实 世 界 与 机 器 世 界 的 中 介, 它 一 方 面 能 够 充 分 反 映 现 实 世 界, 包 括 实 体 和 实 体 之 间 的 联 系, 同 时 又 易 于 向 关 系 网 状 层 次 等 各 种 数 据 模 型 转 换 它 是 现 实 世 界 的 一 个 真 实 模 型, 易 于 理 解, 便 于 和 不 熟 悉 计 算 机 的 用 户 交 换 意 见, 使 用 户 易 于 参 与, 当 现 实 世 界 需 求 改 变 时, 概 念 结 构 又 可 以 很 容 易 地 作 相 应 调 整 因 此 概 念 结 构 设 计 是 整 个 数 据 库 设 计 的 关 键 所 在 1. 概 念 结 构 设 计 的 方 法 设 计 概 念 结 构 通 常 有 四 类 方 法 : (1) 自 顶 向 下, 即 首 先 定 义 全 局 概 念 结 构 的 框 架, 然 后 逐 步 细 化 (2) 自 底 向 上, 即 首 先 定 义 各 局 部 应 用 的 概 念 结 构, 然 后 将 它 们 集 成 起 来, 得 到 全 局 概 念 结 构 这 是 最 经 常 采 用 的 策 略
第 1 章 数 据 库 技 术 基 础 17 (3) 逐 步 扩 张, 首 先 定 义 最 重 要 的 核 心 概 念 结 构, 然 后 向 外 扩 充, 以 滚 雪 球 的 方 式 逐 步 生 成 其 他 概 念 结 构, 直 至 总 体 概 念 结 构 (4) 混 合 策 略, 即 将 自 顶 向 下 和 自 底 向 上 相 结 合, 用 自 顶 向 下 策 略 设 计 一 个 全 局 概 念 结 构 的 框 架, 以 它 为 骨 架 集 成, 用 自 底 向 上 策 略 设 计 各 局 部 概 念 结 构 无 论 采 用 哪 种 设 计 方 法, 一 般 都 以 E 唱 R 模 型 为 工 具 来 描 述 概 念 结 构 2. 数 据 抽 象 与 局 部 E 唱 R 图 设 计 第 一 步, 根 据 需 求 分 析 的 结 果 ( 数 据 流 图 数 据 字 典 等 ) 对 现 实 世 界 的 数 据 进 行 抽 象, 设 计 各 个 局 部 视 图 即 分 E 唱 R 图 第 二 步, 集 成 局 部 E 唱 R 图 设 计 分 E 唱 R 图 的 步 骤 是 : (1) 选 择 局 部 应 用 在 需 求 分 析 阶 段, 通 过 对 应 用 环 境 和 要 求 进 行 详 尽 的 调 查 分 析, 用 多 层 数 据 流 图 和 数 据 字 典 描 述 了 整 个 系 统 设 计 分 E 唱 R 图 的 第 一 步, 就 是 要 根 据 系 统 的 具 体 情 况, 在 多 层 的 数 据 流 图 中 选 择 一 个 适 当 层 次 的 ( 经 验 很 重 要 ) 数 据 流 图, 让 这 组 图 中 每 一 部 分 对 应 一 个 局 部 应 用, 即 可 以 这 一 层 次 的 数 据 流 图 为 出 发 点, 设 计 分 E 唱 R 图 一 般 而 言, 中 层 的 数 据 流 图 能 较 好 地 反 映 系 统 中 各 局 部 应 用 的 子 系 统 组 成, 因 此 人 们 往 往 以 中 层 数 据 流 图 作 为 设 计 分 E 唱 R 图 的 依 据 (2) 逐 一 设 计 分 E 唱 R 图 每 个 局 部 应 用 都 对 应 了 一 组 数 据 流 图, 局 部 应 用 涉 及 的 数 据 都 已 经 收 集 在 数 据 字 典 中 了 现 在 就 是 要 将 这 些 数 据 从 数 据 字 典 中 抽 取 出 来, 参 照 数 据 流 图, 标 定 局 部 应 用 中 的 实 体 实 体 的 属 性 标 识 实 体 的 关 键 字, 确 定 实 体 之 间 的 联 系 及 其 类 型 (1 1 1 n m n) 现 实 世 界 中 一 组 具 有 某 些 共 同 特 性 和 行 为 的 对 象 就 可 以 抽 象 为 一 个 实 体 对 象 和 实 体 之 间 是 对 象 是 实 体 中 的 一 员 的 关 系 例 如 在 学 生 管 理 子 系 统 中, 可 以 把 张 源 李 伟 王 刚 等 对 象 抽 象 为 学 生 实 体 对 象 类 型 的 组 成 成 分 可 以 抽 象 为 实 体 的 属 性 组 成 成 分 与 对 象 类 型 之 间 是 部 分 的 关 系 例 如 学 号 姓 名 出 生 日 期 等 可 以 抽 象 为 学 生 实 体 的 属 性 其 中 学 号 为 标 识 学 生 实 体 的 关 键 字 实 际 中 实 体 与 属 性 是 相 对 而 言 的, 很 难 有 截 然 划 分 的 界 限 同 一 事 物, 在 一 种 应 用 环 境 中 作 为 属 性, 在 另 一 种 应 用 环 境 中 有 可 能 作 为 实 体 一 般 说 来, 在 给 定 的 应 用 环 境 中 : 1 属 性 不 能 再 具 有 需 要 描 述 的 性 质 属 性 必 须 是 不 可 分 的 数 据 项 2 属 性 不 能 与 其 他 实 体 具 有 联 系 联 系 只 发 生 在 实 体 之 间 在 学 生 管 理 局 部 应 用 中 主 要 涉 及 的 实 体 包 括 学 生 教 师 档 案 材 料 班 级 班 主 任 那 么, 这 些 实 体 之 间 的 联 系 又 是 怎 样 的 呢? 由 于 一 个 教 师 可 以 任 教 多 个 班 级 和 多 个 学 生, 而 一 个 学 生 只 能 在 某 一 个 班 级 听 某 一 教 师 授 课, 因 此 教 师 与 学 生 之 间 是 1 n 的 联 系 由 于 一 个 班 级 往 往 有 若 干 名 学 生, 而 一 个 学 生 只 能 属 于 一 个 班 级, 因 此 班 级 与 学 生 之 间 也 是 1 n 的 联 系 由 于 班 主 任 同 时 还 要 教 课, 因 此 班 主 任 与 学 生 之 间 存 在 指 导 联 系, 一 个 班 主 任 要 教 多 名 学 生, 而 一 个 学 生 只 对
18 SQL Server 数 据 库 应 用 技 术 应 一 个 班 主 任, 因 此 班 主 任 与 学 生 之 间 也 是 1 n 的 联 系 而 学 生 和 他 自 己 的 档 案 材 料 之 间, 班 级 与 班 主 任 之 间 都 是 1 1 的 联 系 这 样, 得 到 学 生 管 理 局 部 应 用 的 分 E 唱 R 图, 如 图 1 唱 9 所 示 图 1 唱 9 学 生 管 理 局 部 应 用 的 分 E 唱 R 图 为 节 省 篇 幅, 该 E 唱 R 图 中 省 略 了 各 个 实 体 的 属 性 描 述 这 些 实 体 的 属 性 分 别 为 : 学 生 :{ 学 号, 姓 名, 出 生 日 期, } 档 案 材 料 :{ 档 案 号, } 班 级 :{ 班 级 号, 所 属 院 系, 学 生 人 数, } 班 主 任 :{ 编 号, 姓 名, 性 别, } 教 师 :{ 编 号, 姓 名, 职 称, } 教 室 :{ 编 号, 设 备, 容 量, } 同 样 方 法, 可 以 得 到 课 程 管 理 局 部 应 用 的 分 E 唱 R 图, 如 图 1 唱 10 所 示 图 1 唱 10 课 程 管 理 局 部 应 用 的 分 E 唱 R 图 各 实 体 的 属 性 分 别 为 : 学 生 :{ 姓 名, 学 号, 出 生 日 期, 年 龄, 性 别, } 课 程 :{ 课 程 号, 课 程 名, 学 分, } 教 师 :{ 编 号, 姓 名, 性 别, 职 称, } 教 材 :{ 书 号, 书 名, 单 价, 出 版 社, } 教 室 :{ 编 号, 设 备, 容 量, } 3. 局 部 E 唱 R 图 的 优 化 集 成 局 部 E 唱 R 图 时 都 需 要 两 步, 即 合 并 和 修 改 与 重 构 (1) 合 并 局 部 E 唱 R 图, 生 成 初 步 E 唱 R 图
第 1 章 数 据 库 技 术 基 础 19 各 局 部 E 唱 R 图 之 间 的 冲 突 主 要 有 三 类 : 属 性 冲 突 命 名 冲 突 和 结 构 冲 突 1 属 性 冲 突 : 属 性 域 冲 突, 即 属 性 值 的 类 型 取 值 范 围 或 取 值 集 合 不 同 ; 属 性 取 值 单 位 冲 突 2 命 名 冲 突 : 同 名 异 义 ; 异 名 同 义 ( 一 义 多 名 ) 3 结 构 冲 突 : 同 一 对 象 在 不 同 应 用 中 具 有 不 同 的 抽 象, 例 如 课 程 在 某 一 局 部 应 用 中 被 当 作 实 体, 而 在 另 一 局 部 应 用 中 则 被 当 作 属 性 ; 同 一 实 体 在 不 同 局 部 视 图 中 所 包 含 的 属 性 不 完 全 相 同, 或 者 属 性 的 排 列 次 序 不 完 全 相 同 实 体 之 间 的 联 系 在 不 同 局 部 视 图 中 呈 现 不 同 的 类 型 例 如 实 体 E1 与 E2 在 局 部 应 用 A 中 是 多 对 多 联 系, 而 在 局 部 应 用 B 中 是 一 对 多 联 系 ; 又 如 在 局 部 应 用 X 中 E1 与 E2 发 生 联 系, 而 在 局 部 应 用 Y 中 E1 E2 E3 之 间 有 联 系 解 决 方 法 是 根 据 应 用 的 语 义 对 实 体 联 系 的 类 型 进 行 综 合 或 调 整 下 面 来 看 看 如 何 生 成 学 校 管 理 系 统 的 初 步 E 唱 R 图 这 里 着 重 介 绍 学 生 管 理 局 部 视 图 与 课 程 管 理 局 部 视 图 的 合 并 这 两 个 分 E 唱 R 图 存 在 多 方 面 的 冲 突 : 1 班 主 任 实 际 上 也 属 于 教 师, 也 就 是 说 学 生 管 理 中 的 班 主 任 实 体 与 课 程 管 理 中 的 教 师 实 体 在 一 定 程 度 上 属 于 异 名 同 义, 可 以 将 学 生 管 理 中 的 班 主 任 实 体 与 课 程 管 理 中 的 教 师 实 体 统 一 称 为 教 师, 统 一 后 教 师 实 体 的 属 性 构 成 为 : 教 师 :{ 职 工 号, 姓 名, 性 别, 职 称, 是 否 为 优 秀 班 主 任 } 2 将 班 主 任 改 为 教 师 后, 教 师 与 学 生 之 间 的 联 系 在 两 个 局 部 视 图 中 呈 现 两 种 不 同 的 类 型 : 一 种 是 学 生 管 理 中 教 师 与 学 生 之 间 的 指 导 联 系, 一 种 是 课 程 管 理 中 教 师 与 学 生 之 间 的 教 学 联 系 由 于 指 导 联 系 实 际 上 可 以 包 含 在 教 学 联 系 之 中, 因 此 可 以 将 这 两 种 联 系 综 合 为 教 学 联 系 3 在 两 个 局 部 E 唱 R 图 中, 学 生 实 体 属 性 组 成 及 次 序 都 存 在 差 异, 应 将 所 有 属 性 综 合, 并 重 新 调 整 次 序 假 设 调 整 结 果 为 : 学 生 :{ 学 号, 姓 名, 出 生 日 期, 年 龄, 课 程 号, 平 均 成 绩 } 解 决 上 述 冲 突 后, 学 生 管 理 分 E 唱 R 图 与 课 程 管 理 分 E 唱 R 图 合 并 为 初 步 E 唱 R 图 (2) 修 改 与 重 构, 生 成 基 本 E 唱 R 图 局 部 E 唱 R 图 经 过 合 并 生 成 的 是 初 步 E 唱 R 图 之 所 以 称 其 为 初 步 E 唱 R 图, 是 因 为 其 中 可 能 存 在 冗 余 的 数 据 和 冗 余 的 实 体 间 联 系, 即 存 在 可 由 基 本 数 据 导 出 的 数 据 和 由 其 他 联 系 导 出 的 联 系 冗 余 数 据 和 冗 余 联 系 容 易 破 坏 数 据 库 的 完 整 性, 给 数 据 库 维 护 增 加 困 难, 因 此 得 到 初 步 E 唱 R 图 后, 还 应 当 进 一 步 检 查 E 唱 R 图 中 是 否 存 在 冗 余, 如 果 存 在 则 一 般 应 设 法 予 以 消 除 修 改 重 构 初 步 E 唱 R 图 以 消 除 冗 余 主 要 采 用 分 析 方 法 除 分 析 方 法 外, 还 可 以 用 规 范 化 理 论 来 消 除 冗 余 例 如, 在 前 面 初 步 E 唱 R 图 中 存 在 着 冗 余 数 据 和 冗 余 联 系 : 1 学 生 实 体 中 的 年 龄 属 性 可 以 由 出 生 日 期 推 算 出 来, 属 于 冗 余 数 据, 应 该 去 掉 这 样 不 仅 可 以 节 省 存 储 空 间, 而 且 当 某 个 学 生 的 出 生 日 期 有 误, 进 行 修 改 后, 无 须 相 应 修 改 年 龄, 减 少 了 产 生 数 据 不 一 致 的 机 会 学 生 :{ 学 号, 姓 名, 出 生 日 期, 课 程 号, 平 均 成 绩 }
20 SQL Server 数 据 库 应 用 技 术 2 教 室 实 体 与 班 级 实 体 之 间 的 上 课 联 系 可 以 由 教 室 与 课 程 之 间 的 开 设 联 系 课 程 与 学 生 之 间 的 选 修 联 系 学 生 与 班 级 之 间 的 组 成 联 系 三 者 推 导 出 来, 因 此 属 于 冗 余 联 系, 可 以 消 去 3 学 生 实 体 中 的 平 均 成 绩 可 以 从 选 修 联 系 中 的 成 绩 属 性 中 推 算 出 来, 但 如 果 应 用 中 需 要 经 常 查 询 某 个 学 生 的 平 均 成 绩, 每 次 都 进 行 这 种 计 算 效 率 就 会 太 低, 因 此 为 提 高 效 率, 可 以 考 虑 保 留 该 冗 余 数 据, 但 是 为 了 维 护 数 据 一 致 性, 应 该 定 义 一 个 触 发 器 来 保 证 学 生 的 平 均 成 绩 等 于 该 学 生 各 科 成 绩 的 平 均 值 任 何 一 科 成 绩 修 改 后, 或 该 学 生 学 了 新 的 科 目 并 有 成 绩 后, 就 要 触 发 该 触 发 器 去 修 改 该 学 生 的 平 均 成 绩 属 性 值 否 则 会 出 现 数 据 的 不 一 致 图 1 唱 11 是 进 行 修 改 和 重 构 后 生 成 的 基 本 E 唱 R 图 1.3.3 逻 辑 结 构 设 计 图 1 唱 11 描 述 学 生 管 理 的 基 本 E 唱 R 图 1.E 唱 R 图 向 关 系 模 型 的 转 换 设 计 逻 辑 结 构 应 该 选 择 最 适 于 描 述 与 表 达 相 应 概 念 结 构 的 数 据 模 型, 然 后 选 择 最 合 适 的 DBM S 关 系 模 型 的 逻 辑 结 构 是 一 组 关 系 模 式 的 集 合 而 E 唱 R 图 则 是 由 实 体 实 体 的 属 性 和 实 体 之 间 的 联 系 三 个 要 素 组 成 的 所 以 将 E 唱 R 图 转 换 为 关 系 模 型 实 际 上 就 是 要 将 实 体 实 体 的 属 性 和 实 体 之 间 的 联 系 转 化 为 关 系 模 式, 这 种 转 换 一 般 遵 循 如 下 原 则 : (1) 一 个 实 体 型 转 换 为 一 个 关 系 模 式 实 体 的 属 性 就 是 关 系 的 属 性 实 体 的 关 键 字 就 是 关 系 的 关 键 字 例 如, 学 生 实 体 可 以 转 换 为 学 生 ( 学 号, 姓 名, 课 程 号, 成 绩 ) 的 关 系 模 式, 其 中 学 号 为 学 生 关 系 的 关 键 字 同 样, 班 级 档 案 材 料 教 师 课 程 教 室 教 材 都 能 转 换 为 一 个 关 系 模 式
第 1 章 数 据 库 技 术 基 础 21 (2) 一 个 m n 联 系 转 换 为 一 个 关 系 模 式 与 m n 联 系 相 连 的 各 实 体 的 关 键 字 以 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性 而 关 系 的 关 键 字 为 各 实 体 关 键 字 的 组 合 例 如, 考 试 联 系 是 一 个 m n 联 系, 可 以 将 它 转 换 为 考 试 ( 学 号, 课 程 号, 考 室, 成 绩 ) 的 关 系 模 式, 其 中 关 系 的 关 键 字 是 学 号 与 课 程 号 的 组 合 (3) 一 个 1 n 联 系 可 以 转 换 为 一 个 独 立 的 关 系 模 式, 也 可 以 与 n 端 对 应 的 关 系 模 式 合 并 如 果 转 换 为 一 个 独 立 的 关 系 模 式, 则 与 该 联 系 相 连 的 各 实 体 的 关 键 字 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性, 而 关 系 的 关 键 字 为 n 端 实 体 的 关 键 字 例 如, 组 成 联 系 为 1 n 联 系, 将 其 转 换 为 关 系 模 式 一 种 方 法 是 使 其 成 为 一 个 独 立 的 关 系 模 式 : 组 成 ( 学 号, 班 级 号 ), 其 中 学 号 为 组 成 关 系 的 关 键 字 另 一 种 方 法 是 将 其 学 生 关 系 模 式 合 并, 这 时 学 生 关 系 模 式 为 : 学 生 ( 学 号, 姓 名, 出 生 日 期, 所 在 院 系, 年 级, 班 级 号, 平 均 成 绩 ) 后 一 种 方 法 可 以 减 少 系 统 中 的 关 系 个 数, 一 般 情 况 下 更 倾 向 于 采 用 这 种 方 法 (4) 一 个 1 1 联 系 可 以 转 换 为 一 个 独 立 的 关 系 模 式, 也 可 以 与 任 意 一 端 对 应 的 关 系 模 式 合 并 如 果 转 换 为 一 个 独 立 的 关 系 模 式, 则 与 该 联 系 相 连 的 各 实 体 的 关 键 字 以 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性, 每 个 实 体 的 关 键 字 均 是 该 关 系 的 候 选 关 键 字 如 果 与 某 一 端 对 应 的 关 系 模 式 合 并, 则 需 要 在 该 关 系 模 式 的 属 性 中 加 入 另 一 个 关 系 模 式 的 关 键 字 和 联 系 本 身 的 属 性 例 如, 管 理 联 系 为 1 1 联 系, 可 以 将 其 转 换 为 一 个 独 立 的 关 系 模 式 : 管 理 ( 教 师 编 号, 班 级 编 号 ), 管 理 联 系 也 可 以 与 班 级 或 教 师 关 系 模 式 合 并 如 果 与 班 级 关 系 模 式 合 并, 则 只 需 在 班 级 关 系 中 加 入 教 师 关 系 的 关 键 字 教 师 编 号, 即 关 系 模 式 : 班 级 ( 班 级 号, 学 生 人 数, 所 属 院 系, 教 师 编 号 ) 同 样, 如 果 与 教 师 关 系 模 式 合 并, 则 只 需 在 教 师 关 系 中 加 入 班 级 关 系 的 关 键 字 班 级 编 号, 即 关 系 模 式 : 教 师 ( 职 工 号, 姓 名, 性 别, 职 称, 班 级 号, 是 否 为 优 秀 班 主 任 ) (5) 三 个 或 三 个 以 上 实 体 间 的 一 个 多 元 联 系 转 换 为 一 个 关 系 模 式 与 多 元 联 系 相 连 的 各 实 体 的 关 键 字 以 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性 而 关 系 的 关 键 字 为 各 实 体 关 键 字 的 组 合 例 如, 教 授 联 系 是 一 个 三 元 联 系, 可 以 将 它 转 换 为 讲 授 ( 课 程 编 号, 教 师 编 号, 教 材 编 号 ) 的 关 系 模 式, 其 中 课 程 编 号 教 师 编 号 和 教 材 编 号 为 关 系 的 组 合 关 键 字 (6) 实 体 集 的 实 体 间 的 联 系, 即 自 联 系, 也 可 按 上 述 1 1 1 n 和 m n 三 种 情 况 分 别 处 理 例 如, 如 果 教 师 实 体 集 内 部 存 在 领 导 与 被 领 导 的 1 n 自 联 系, 可 以 将 该 联 系 与 教 师 实 体 合 并, 这 时 主 关 键 字 教 师 编 号 将 多 次 出 现, 但 作 用 不 同, 可 用 不 同 的 属 性 名 加 以 区 分, 例 如 在 合 并 后 的 关 系 模 式 中, 主 关 键 字 仍 为 教 师 编 号, 再 增 设 一 个 系 主 任 属 性, 存 放 相 应 系 主 任 的 教 师 编 号 (7) 相 同 关 键 字 的 关 系 模 式 可 合 并 为 了 减 少 系 统 中 的 关 系 个 数, 如 果 两 个 关 系 模 式 具 有 相 同 的 主 关 键 字, 可 以 考 虑 将 它 们 合 并 为 一 个 关 系 模 式 合 并 方 法 是 将 其 中 一 个 关 系 模 式 的 全 部 属 性 加 入 到 另 一 个 关 系
22 SQL Server 数 据 库 应 用 技 术 模 式 中, 然 后 去 掉 其 中 的 同 义 属 性 ( 可 能 同 名 也 可 能 不 同 名 ), 并 适 当 调 整 属 性 的 次 序 例 如, 有 一 个 拥 有 关 系 模 式 : 拥 有 ( 学 号, 性 别 ) ; 另 有 一 个 学 生 关 系 模 式 : 学 生 ( 学 号, 姓 名, 出 生 日 期, 所 在 院 系, 年 级, 班 级 号, 平 均 成 绩 ), 这 两 个 关 系 模 式 都 以 学 号 为 关 键 字, 可 以 将 它 们 合 并 为 一 个 关 系 模 式, 假 设 合 并 后 的 关 系 模 式 仍 叫 学 生 : 学 生 ( 学 号, 姓 名, 性 别, 出 生 日 期, 所 在 院 系, 年 级, 班 级 号, 平 均 成 绩 ) 2. 数 据 模 型 的 优 化 数 据 库 逻 辑 设 计 的 结 果 不 是 惟 一 的 为 了 进 一 步 提 高 数 据 库 应 用 系 统 的 性 能, 通 常 以 规 范 化 理 论 为 指 导, 还 应 该 适 当 地 修 改 调 整 数 据 模 型 的 结 构, 这 就 是 数 据 模 型 的 优 化 数 据 模 型 的 优 化 方 法 为 : (1) 确 定 数 据 依 赖 对 于 各 个 关 系 模 式 之 间 的 数 据 依 赖 进 行 极 小 化 处 理, 消 除 冗 余 的 联 系 按 照 数 据 依 赖 的 情 况 对 关 系 模 式 逐 一 进 行 分 析, 考 查 是 否 存 在 部 分 依 赖 传 递 依 赖 多 值 依 赖 等 按 照 需 求 分 析 阶 段 得 到 的 各 种 应 用 对 数 据 处 理 的 要 求, 分 析 对 于 这 样 的 应 用 环 境 这 些 模 式 是 否 合 适, 确 定 是 否 要 对 它 们 进 行 合 并 或 分 解 (2) 对 关 系 模 式 进 行 必 要 的 分 解 数 据 库 设 计 人 员 为 了 判 断 关 系 模 式 优 劣, 预 测 关 系 模 式 可 能 出 现 的 问 题, 需 要 对 关 系 模 式 进 行 必 要 的 分 解, 使 数 据 库 设 计 工 作 有 严 格 的 质 量 保 障 3. 设 计 用 户 子 模 式 前 面 根 据 用 户 需 求 设 计 了 局 部 E 唱 R 图, 这 种 局 部 E 唱 R 图 只 是 概 念 模 型 在 将 概 念 模 型 转 换 为 逻 辑 模 型 后, 即 生 成 了 整 个 应 用 系 统 的 模 式 后, 还 应 该 根 据 局 部 应 用 需 求, 结 合 具 体 DBM S 的 特 点, 设 计 用 户 的 外 模 式 目 前 关 系 数 据 库 管 理 系 统 一 般 都 提 供 了 视 图 概 念, 支 持 用 户 的 虚 拟 视 图 可 以 利 用 这 一 功 能 设 计 更 符 合 局 部 用 户 需 要 的 用 户 外 模 式 定 义 数 据 库 模 式 主 要 是 从 系 统 的 时 间 效 率 空 间 效 率 易 维 护 等 角 度 出 发 由 于 用 户 外 模 式 与 模 式 是 独 立 的, 因 此, 在 定 义 用 户 外 模 式 时 应 该 更 注 重 考 虑 用 户 的 习 惯 与 方 便 包 括 : 1 使 用 更 符 合 用 户 习 惯 的 别 名 2 针 对 不 同 级 别 的 用 户 定 义 不 同 的 外 模 式, 以 满 足 系 统 对 安 全 性 的 要 求 3 简 化 用 户 对 系 统 的 使 用 1.3.4 数 据 库 物 理 设 计 数 据 库 最 终 是 要 存 储 在 物 理 设 备 上 的 为 一 个 给 定 的 逻 辑 数 据 模 型 选 取 一 个 最 适 合 应 用 环 境 的 物 理 结 构 ( 存 储 结 构 与 存 取 方 法 ) 的 过 程, 就 是 数 据 库 的 物 理 设 计 物 理 结 构 依 赖 于 给 定 的 DBM S 和 硬 件 系 统, 因 此 设 计 人 员 必 须 充 分 了 解 所 用 DBM S 的 内 部 特 征, 特 别 是 存 储 结 构 和 存 取 方 法 ; 充 分 了 解 应 用 环 境, 特 别 是 应 用 的 处 理 频 率 和 响 应 时 间 要 求 ; 以 及 充 分 了 解 外 存 设 备 的 特 性 1. 确 定 数 据 的 存 储 结 构 确 定 数 据 库 存 储 结 构 时 要 综 合 考 虑 存 取 时 间 存 储 空 间 利 用 率 和 维 护 代 价 三 方 面 的
第 1 章 数 据 库 技 术 基 础 23 因 素 这 三 个 方 面 常 常 是 相 互 矛 盾 的, 例 如 消 除 一 切 冗 余 数 据 虽 然 能 够 节 约 存 储 空 间, 但 往 往 会 导 致 检 索 代 价 的 增 加, 因 此 必 须 进 行 权 衡, 选 择 一 个 折 中 方 案 2. 设 计 数 据 的 存 取 路 径 在 关 系 数 据 库 中, 选 择 存 取 路 径 主 要 是 指 确 定 如 何 建 立 索 引 例 如, 应 把 哪 些 域 作 为 次 关 键 字 建 立 次 索 引, 建 立 单 个 关 键 字 索 引 还 是 组 合 索 引, 建 立 多 少 个 为 合 适, 是 否 建 立 聚 集 索 引 等 3. 确 定 数 据 的 存 放 位 置 为 了 提 高 系 统 性 能, 数 据 应 该 根 据 应 用 情 况 将 易 变 部 分 与 稳 定 部 分 经 常 存 取 部 分 和 存 取 频 率 较 低 部 分 分 开 存 放 例 如, 数 据 库 数 据 备 份 日 志 文 件 备 份 等 由 于 只 在 故 障 恢 复 时 才 使 用, 而 且 数 据 量 很 大, 可 以 考 虑 刻 录 在 光 盘 上 目 前 许 多 计 算 机 都 有 多 个 硬 盘, 因 此 进 行 物 理 设 计 时 可 以 考 虑 将 表 和 索 引 分 别 放 在 不 同 的 硬 盘 上 在 查 询 时, 由 于 两 个 硬 盘 驱 动 器 分 别 在 工 作, 因 而 可 以 保 证 物 理 读 写 速 度 比 较 快 也 可 以 将 比 较 大 的 表 分 别 放 在 两 个 硬 盘 上, 以 加 快 存 取 速 度, 这 在 多 用 户 环 境 下 特 别 有 效 此 外, 还 可 以 将 日 志 文 件 与 数 据 库 对 象 ( 表 索 引 等 ) 放 在 不 同 的 硬 盘 以 改 进 系 统 的 性 能 4. 确 定 系 统 配 置 Oracle 数 据 库 一 般 都 提 供 了 一 些 存 储 分 配 参 数, 供 设 计 人 员 和 DBA 对 数 据 库 进 行 物 理 优 化 初 始 情 况 下, 系 统 都 为 这 些 变 量 赋 予 了 合 理 的 默 认 值 但 是 这 些 值 不 一 定 适 合 每 一 种 应 用 环 境, 在 进 行 物 理 设 计 时, 需 要 重 新 对 这 些 变 量 赋 值 以 改 善 系 统 的 性 能 通 常 情 况 下, 这 些 配 置 变 量 包 括 : 同 时 使 用 数 据 库 的 用 户 数, 同 时 打 开 的 数 据 库 对 象 数, 使 用 的 缓 冲 区 长 度 个 数, 时 间 片 大 小, 数 据 库 的 大 小, 装 填 因 子, 锁 的 数 目 等, 这 些 参 数 值 影 响 存 取 时 间 和 存 储 空 间 的 分 配, 在 物 理 设 计 时 就 要 根 据 应 用 环 境 确 定 这 些 参 数 值, 以 使 系 统 性 能 最 优 在 物 理 设 计 时 对 系 统 配 置 变 量 的 调 整 只 是 初 步 的, 在 系 统 运 行 时 还 要 根 据 系 统 实 际 运 行 情 况 做 进 一 步 的 调 整, 以 期 切 实 改 进 系 统 性 能 5. 评 价 物 理 结 构 数 据 库 物 理 设 计 过 程 中 需 要 对 时 间 效 率 空 间 效 率 维 护 代 价 和 各 种 用 户 要 求 进 行 权 衡, 其 结 果 可 以 产 生 多 种 方 案, 数 据 库 设 计 人 员 必 须 对 这 些 方 案 进 行 细 致 的 评 价, 从 中 选 择 一 个 较 优 的 方 案 作 为 数 据 库 的 物 理 结 构 评 价 物 理 数 据 库 的 方 法 完 全 依 赖 于 所 选 用 的 DBM S, 主 要 是 从 定 量 估 算 各 种 方 案 的 存 储 空 间 存 取 时 间 和 维 护 代 价 入 手, 对 估 算 结 果 进 行 权 衡 比 较, 选 择 出 一 个 较 优 的 合 理 的 物 理 结 构 如 果 该 结 构 不 符 合 用 户 需 求, 则 需 要 修 改 设 计 1.3.5 数 据 库 实 施 1. 定 义 数 据 库 结 构 确 定 了 数 据 库 的 逻 辑 结 构 与 物 理 结 构 后, 就 可 以 用 所 选 用 的 DBM S 提 供 的 数 据 定 义 语 言 (DDL) 来 严 格 描 述 数 据 库 结 构
24 SQL Server 数 据 库 应 用 技 术 2. 数 据 装 载 数 据 库 结 构 建 立 好 后, 就 可 以 向 数 据 库 中 装 载 数 据 了 组 织 数 据 入 库 是 数 据 库 实 施 阶 段 最 主 要 的 工 作 对 于 数 据 量 不 是 很 大 的 小 型 系 统, 可 以 用 人 工 方 法 完 成 数 据 的 入 库, 其 步 骤 为 : 1 筛 选 数 据, 需 要 装 入 数 据 库 中 的 数 据 通 常 都 分 散 在 各 个 部 门 的 数 据 文 件 或 原 始 凭 证 中, 所 以 首 先 必 须 把 需 要 入 库 的 数 据 筛 选 出 来 2 转 换 数 据 格 式, 筛 选 出 来 的 需 要 入 库 的 数 据, 其 格 式 往 往 不 符 合 数 据 库 要 求, 还 需 要 进 行 转 换 这 种 转 换 有 时 可 能 很 复 杂 3 输 入 数 据, 将 转 换 好 的 数 据 输 入 计 算 机 中 4 校 验 数 据, 检 查 输 入 的 数 据 是 否 有 误 对 于 大 中 型 系 统, 由 于 数 据 量 极 大, 用 人 工 方 式 组 织 数 据 入 库 将 会 耗 费 大 量 人 力 物 力, 而 且 很 难 保 证 数 据 的 正 确 性 因 此 应 该 设 计 一 个 数 据 输 入 子 系 统 由 计 算 机 辅 助 数 据 的 入 库 工 作 3. 编 制 与 调 试 应 用 程 序 数 据 库 应 用 程 序 的 设 计 应 该 与 数 据 库 设 计 并 行 进 行 在 数 据 库 实 施 阶 段, 当 数 据 库 结 构 建 立 好 后, 就 可 以 开 始 编 制 与 调 试 数 据 库 的 应 用 程 序, 也 就 是 说, 编 制 与 调 试 应 用 程 序 是 与 组 织 数 据 入 库 同 步 进 行 的 调 试 应 用 程 序 时 由 于 数 据 入 库 尚 未 完 成, 可 先 使 用 模 拟 数 据 4. 数 据 库 试 运 行 应 用 程 序 调 试 完 成, 并 且 已 有 一 小 部 分 数 据 入 库 后, 就 可 以 开 始 数 据 库 的 试 运 行 数 据 库 试 运 行 也 称 为 联 合 调 试, 其 主 要 工 作 包 括 : 1 功 能 测 试 即 实 际 运 行 应 用 程 序, 执 行 对 数 据 库 的 各 种 操 作, 测 试 应 用 程 序 的 各 种 功 能 2 性 能 测 试 即 测 量 系 统 的 性 能 指 标, 分 析 是 否 符 合 设 计 目 标 1.3.6 数 据 库 运 行 与 维 护 数 据 库 试 运 行 结 果 符 合 设 计 目 标 后, 数 据 库 就 可 以 真 正 投 入 运 行 了 数 据 库 投 入 运 行 标 志 着 开 发 任 务 的 基 本 完 成 和 维 护 工 作 的 开 始, 并 不 意 味 着 设 计 过 程 的 终 结 由 于 应 用 环 境 在 不 断 变 化, 数 据 库 运 行 过 程 中 物 理 存 储 也 会 不 断 变 化, 对 数 据 库 设 计 进 行 评 价 调 整 修 改 等 维 护 工 作 是 一 个 长 期 的 任 务, 也 是 设 计 工 作 的 继 续 和 提 高 在 数 据 库 运 行 阶 段, 对 数 据 库 经 常 性 的 维 护 工 作 主 要 是 由 DBA 完 成 的, 它 包 括 : 1. 数 据 库 的 备 份 和 恢 复 定 期 对 数 据 库 和 日 志 文 件 进 行 备 份, 以 保 证 一 旦 发 生 故 障, 能 利 用 数 据 库 备 份 及 日 志 文 件 备 份, 尽 快 将 数 据 库 恢 复 到 某 种 一 致 性 状 态, 并 尽 可 能 减 少 对 数 据 库 的 破 坏 2. 数 据 库 的 安 全 性 完 整 性 控 制 DBA 必 须 对 数 据 库 安 全 性 和 完 整 性 的 控 制 负 责 根 据 用 户 的 实 际 需 要 授 予 不 同 的 操 作 权 限 另 外, 由 于 应 用 环 境 的 变 化, 数 据 库 的 完 整 性 约 束 条 件 也 会 变 化, 也 需 要 DBA
第 1 章 数 据 库 技 术 基 础 25 不 断 修 正, 以 满 足 用 户 要 求 3. 数 据 库 性 能 的 监 督 分 析 和 改 进 目 前 许 多 DBM S 产 品 都 提 供 了 监 测 系 统 性 能 参 数 的 工 具,DBA 可 以 利 用 这 些 工 具 方 便 地 得 到 系 统 运 行 过 程 中 一 系 列 性 能 参 数 的 值 DBA 应 该 仔 细 分 析 这 些 数 据, 通 过 调 整 某 些 参 数 来 进 一 步 改 进 数 据 库 性 能 4. 数 据 库 的 重 组 织 和 重 构 造 数 据 库 运 行 一 段 时 间 后, 由 于 记 录 的 不 断 增 删 改, 会 使 数 据 库 的 物 理 存 储 变 坏, 从 而 降 低 数 据 库 存 储 空 间 的 利 用 率 和 数 据 的 存 取 效 率, 使 数 据 库 的 性 能 下 降 这 时 DBA 就 要 对 数 据 库 进 行 重 组 织, 或 部 分 重 组 织 ( 只 对 频 繁 增 删 的 表 进 行 重 组 织 ) 数 据 库 的 重 组 织 不 会 改 变 原 设 计 的 数 据 逻 辑 结 构 和 物 理 结 构, 只 是 按 原 设 计 要 求 重 新 安 排 存 储 位 置, 提 高 系 统 性 能 DBM S 一 般 都 提 供 了 重 组 织 数 据 库 的 实 用 程 序, 帮 助 DBA 重 新 组 织 数 据 库 当 数 据 库 应 用 环 境 发 生 变 化, 会 导 致 实 体 及 实 体 间 的 联 系 也 发 生 相 应 的 变 化, 使 原 有 的 数 据 库 设 计 不 能 很 好 地 满 足 新 的 需 求, 从 而 不 得 不 适 当 调 整 数 据 库 的 模 式 和 内 模 式, 这 就 是 数 据 库 的 重 构 造 DBM S 都 提 供 了 修 改 数 据 库 结 构 的 功 能 重 构 造 数 据 库 的 程 度 是 有 限 的 若 应 用 变 化 太 大, 已 无 法 通 过 重 构 数 据 库 来 满 足 新 的 需 求, 或 重 构 数 据 库 的 代 价 太 大, 则 表 明 现 有 数 据 库 应 用 系 统 的 生 命 周 期 已 经 结 束, 应 该 重 新 设 计 新 的 数 据 库 系 统 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 试 述 数 据 库 数 据 库 管 理 系 统 数 据 库 系 统 三 个 概 念 的 含 义 及 联 系 (2) 解 释 层 次 模 型 网 状 模 型 和 关 系 模 型 的 含 义 (3) 简 述 E 唱 R 图 的 构 成 三 要 素 (4) 简 述 关 系 的 性 质 (5) 实 体 之 间 的 联 系 有 哪 几 种, 并 简 述 之 (6) 什 么 是 DBM S? 什 么 是 DBA? (7) 试 举 出 三 个 实 例, 要 求 实 体 型 之 间 分 别 有 一 对 一 一 对 多 多 对 多 的 联 系 (8) 学 校 中 有 若 干 系, 每 个 系 有 若 干 个 班 级 和 教 研 室, 每 个 教 研 室 有 若 干 名 教 师, 其 中 教 师 每 人 各 带 若 干 教 学 班 每 个 班 有 若 干 学 生, 每 个 学 生 选 修 若 干 课 程, 每 门 课 可 由 若 干 学 生 选 修 用 E 唱 R 图 画 出 学 校 的 概 念 模 型 2. 选 择 最 适 合 的 答 案 (1) 负 责 数 据 库 系 统 的 日 常 管 理 和 维 护 的 人 员 是 :( ) A. 系 统 程 序 员 B. 应 用 程 序 员 C. 数 据 库 管 理 员 D. 最 终 用 户 (2) 构 造 E 唱 R 模 型 的 步 骤 是 :( ) 1 确 定 实 体 ;2 除 去 重 复 实 体 ;3 列 出 每 个 实 体 的 属 性 ;4 标 记 主 码 ;5 定 义 联 系 ;
26 SQL Server 数 据 库 应 用 技 术 6 检 查 每 个 实 体 类 型 以 查 看 它 与 其 他 实 体 相 关 联 ;7 描 述 联 系 的 类 型 ;8 除 去 冗 余 关 系 A. 1 3 2 4 6 5 7 8 B. 1 2 3 4 5 6 7 8 C. 1 2 4 3 6 5 7 8 D. 1 4 3 2 5 6 8 7 (3) 为 了 防 止 用 户 对 数 据 库 的 非 法 存 取 操 作,DBM S 必 须 提 供 对 数 据 库 的 :( ) A. 安 全 性 保 护 B. 完 整 性 保 护 C. 故 障 恢 复 D. 并 发 控 制 (4) 应 用 程 序 与 数 据 库 的 接 口 软 件 是 :( ) A. 操 作 系 统 B. 文 件 系 统 C. 数 据 库 管 理 系 统 D. 应 用 程 序 (5) 关 系 模 型 的 基 本 数 据 结 构 是 :( ) A. 二 维 表 格 B. 树 C. 图 D. 二 级 树 3. 综 合 应 用 题 (1) 某 高 校 实 行 学 分 制, 学 生 可 根 据 自 己 的 情 况 选 修 课 程 每 名 学 生 可 同 时 选 修 多 门 课 程, 每 门 课 程 可 由 多 位 教 师 讲 授, 每 位 教 师 可 讲 授 多 门 课 程 其 不 完 善 的 E 唱 R 图 如 下 所 示 : 1 指 出 学 生 与 课 程 的 联 系 类 型, 完 善 E 唱 R 图 ; 2 指 出 课 程 与 教 师 的 联 系 类 型, 完 善 E 唱 R 图 ; 3 若 每 名 学 生 有 一 位 教 师 指 导, 每 个 教 师 指 导 多 名 学 生, 则 学 生 与 教 师 有 何 联 系? 4 在 原 E 唱 R 图 上 补 画 教 师 与 学 生 的 联 系, 并 完 善 E 唱 R 图 (2) 设 有 一 个 图 书 出 版 销 售 管 理 系 统, 其 中 涉 及 的 数 据 有 : 瞯 图 书 的 书 号 书 名 作 者 姓 名 ; 瞯 出 版 社 名 称 地 址 联 系 电 话 ; 瞯 书 店 的 名 称 地 址 及 其 经 销 图 书 的 销 售 数 量 其 中, 每 一 种 图 书 只 能 由 一 家 出 版 社 负 责 出 版 印 刷, 但 可 由 多 家 书 店 销 售 ; 每 家 书 店 可 以 经 销 各 种 图 书 请 完 成 如 下 设 计 : 1 画 出 该 数 据 库 的 E 唱 R 模 型 图 2 将 上 述 E 唱 R 模 型 图 转 换 成 关 系 模 式 (3) 假 设 需 要 建 立 一 个 运 动 会 的 数 据 库 系 统, 其 中 牵 涉 到 的 信 息 有 : 瞯 每 个 代 表 团 的 编 号, 代 表 团 的 名 称, 代 表 团 的 团 长 姓 名 ; 瞯 每 个 运 动 员 的 编 号, 姓 名, 性 别, 年 龄 ; 瞯 每 个 竞 赛 项 目 的 项 目 编 号, 名 称, 比 赛 地 点, 比 赛 时 间 和 参 赛 运 动 员 的 成 绩 其 中, 一 个 运 动 员 可 参 加 多 个 项 目 的 比 赛, 一 个 项 目 可 以 允 许 多 个 运 动 员 参 与 竞 赛, 一 个 代 表 团 可 以 有 多 名 运 动 员, 一 个 运 动 员 只 能 属 于 一 个 代 表 团 请 完 成 如 下 设 计 : 1 设 计 出 该 数 据 库 系 统 的 E 唱 R 图 2 将 上 述 的 E 唱 R 图 转 换 为 关 系 模 式
SQL Server 2000 服 务 器 和 客 户 端 第 2 章 SQ L Server 是 一 种 具 有 客 户 机 / 服 务 器 体 系 结 构 的 关 系 型 数 据 库 管 理 系 统, 它 由 一 些 具 有 数 据 存 储 检 索 功 能 的 客 户 端 组 件 和 服 务 器 组 件 组 成 这 种 体 系 结 构 的 好 处 是 把 所 有 的 工 作 负 荷 分 散 到 在 服 务 器 和 客 户 端 上 运 行 的 各 项 任 务 中, 客 户 端 负 责 业 务 逻 辑 和 向 用 户 提 供 数 据, 服 务 器 管 理 数 据 库 和 分 配 可 用 的 服 务 器 资 源 这 样, 服 务 器 为 整 个 数 据 库 系 统 提 供 自 己 最 擅 长 的 服 务, 供 所 有 客 户 机 来 分 享 ; 客 户 机 上 的 应 用 程 序 借 助 于 服 务 器 上 的 服 务 功 能 可 以 实 现 复 杂 的 应 用 本 章 将 介 绍 SQ L Server 2000 的 组 成 结 构 性 能 以 及 各 种 组 件 和 组 件 的 操 作 2.1 SQL Server 概 述 2.1.1 SQL 的 特 点 SQ L 是 结 构 化 查 询 语 言 (Structure Query Language) 的 缩 写, 是 关 系 型 数 据 库 管 理 系 统 中 最 流 行 的 数 据 查 询 和 操 作 语 言, 是 各 种 关 系 型 数 据 库 系 统 的 基 础, 用 户 使 用 SQ L 语 言 在 数 据 库 中 可 以 执 行 各 种 相 关 操 作 从 SQ L 的 诞 生 到 现 在, 已 经 出 现 了 许 多 不 同 版 本 的 SQ L 语 言 20 世 纪 70 年 代 中 期,IBM 公 司 的 San Jose 实 验 室 把 SQ L 作 为 一 种 新 型 的 关 系 数 据 库 语 言 而 设 计 出 来, 这 是 最 早 的 SQ L 版 本 20 世 纪 80 年 代 后 期, 市 场 上 的 许 多 数 据 库 都 使 用 SQ L, 但 每 个 开 发 商 之 间, 不 同 平 台 之 间 的 SQ L 兼 容 性 很 差 为 了 改 变 这 一 现 状,1986 年 10 月, 国 际 标 准 化 组 织 (ISO) 和 美 国 国 家 标 准 委 员 会 (A NSI) 共 同 发 布 了 一 个 标 准, 简 称 SQ L 唱 86 1992 年,ISO 和 A NSI 对 SQ L 唱 86 进 行 修 订, 发 布 了 SQ L 唱 92, 它 是 当 前 许 多 数 据 库 产 品 所 采 用 的 SQ L 标 准 1999 年, 标 准 化 组 织 发 布 了 反 应 最 新 数 据 库 理 论 和 技 术 的 标 准 SQ L 唱 99, 如 递 归 触 发 面 向 对 象 等 另 外, 不 同 的 数 据 库 管 理 系 统 厂 商 在 标 准 SQ L 语 言 的 基 础 上 对 其 进 行 了 扩 展, 增 强 了 一 些 功 能, 并 给 它 们 取 了 不 同 的 名 称, 例 如,Microsoft SQ L Server 推 出 了 T ransact 唱 SQ L,Oracle 推 出 了 PL/SQ L
28 SQL Server 数 据 库 应 用 技 术 SQ L 语 言 包 括 了 所 有 对 数 据 库 的 操 作, 可 分 为 四 个 部 分 : 即 数 据 查 询 语 言 数 据 定 义 语 言 数 据 操 纵 语 言 数 据 控 制 语 言 其 功 能 分 述 如 下 : (1) 数 据 查 询 语 言 (Data Query Language,DQ L) 主 要 是 按 照 一 定 的 查 询 条 件 从 数 据 库 对 象 中 查 找 符 合 要 求 的 记 录 (2) 数 据 定 义 语 言 (Data Definition Language,DDL) 主 要 是 定 义 数 据 库 的 逻 辑 结 构, 如 表 视 图 和 索 引 的 定 义 修 改 和 删 除 等 (3) 数 据 操 纵 语 言 (Data Manipulation Language,DM L) 包 括 数 据 插 入 删 除 和 更 新 等 操 作 (4) 数 据 控 制 语 言 (Data Control Language,DCL) 包 括 基 本 表 和 视 图 等 对 象 的 授 权 完 整 性 规 则 的 描 述, 以 及 事 务 开 始 和 结 束 等 控 制 语 句 等 SQ L 语 言 虽 然 可 以 完 成 全 部 的 数 据 库 操 作, 但 它 本 身 不 是 一 个 完 整 的 编 程 语 言, 一 般 与 其 他 编 程 语 言 ( 如 Delphi Powerbuilder VB VC 等 ) 结 合 起 来 使 用 即 在 使 用 上 述 计 算 机 语 言 编 写 的 应 用 程 序 中 调 用 数 据 库 API 来 传 递 SQ L 语 言, 以 达 到 向 SQ L Server 服 务 器 请 求 查 询 和 接 收 结 果 的 目 的 与 一 般 编 程 语 言 相 比,SQ L 具 有 的 主 要 特 点 是 如 下 : (1) 一 体 化 SQ L 语 言 能 完 成 定 义 关 系 模 式 建 立 数 据 库 更 新 维 护 数 据 库 数 据 库 重 构 数 据 库 安 全 性 控 制 等 一 系 列 操 作 要 求, 可 以 实 现 数 据 库 生 命 期 当 中 的 全 部 活 动 由 于 关 系 模 型 中 实 体 与 实 体 间 的 联 系 都 是 用 关 系 来 表 示, 这 种 数 据 结 构 的 单 一 性 保 证 了 操 作 符 的 单 一 性 (2) 统 一 的 语 法 结 构, 多 种 使 用 方 式 SQ L 由 两 种 使 用 方 式, 一 种 是 联 机 使 用 方 式, 即 在 数 据 库 管 理 系 统 的 组 件 中 编 写 并 完 成 各 种 SQ L 数 据 库 操 作 命 令 另 一 种 是 嵌 入 程 序 方 式, 大 多 数 的 编 程 语 言 ( 如 Delphi VB VC Java 等 ) 都 具 有 嵌 入 SQ L 的 编 程 接 口, 可 以 将 SQ L 代 码 嵌 入 程 序 中 来 完 成 数 据 库 的 操 作 (3) 非 过 程 化 语 言 在 SQ L 中, 只 需 用 户 提 出 干 什 么, 而 无 须 指 出 怎 么 干, 存 取 路 径 的 选 择 和 SQ L 语 句 操 作 的 过 程 由 系 统 自 动 完 成 (4) 所 有 关 系 数 据 库 的 公 共 语 言 由 于 所 有 主 要 的 关 系 数 据 库 管 理 系 统 都 支 持 SQ L 语 言, 用 户 可 将 使 用 SQ L 的 技 能 从 一 个 数 据 库 管 理 系 统 转 移 到 另 一 个 系 统 中, 所 有 用 SQ L 编 写 的 程 序 都 可 以 移 植 2.1.2 SQL Server 的 结 构 SQ L Server 2000 由 一 系 列 相 互 协 作 的 组 件 构 成, 能 满 足 最 大 的 Web 站 点 和 企 业 数 据 处 理 系 统 存 储 和 分 析 数 据 的 需 要 同 时, 还 能 为 个 人 或 企 业 提 供 易 于 使 用 的 数 据 存 储 服 务 SQ L Server 2000 采 用 客 户 机 / 服 务 器 计 算 模 型, 如 图 2 唱 1 所 示, 即 中 央 服 务 器 用 来 存 放 数 据 库, 该 服 务 器 可 以 被 多 台 客 户 机 访 问, 数 据 库 应 用 的 处 理 过 程 分 布 在 客 户 机 和 服 务 器 上 客 户 机 / 服 务 器 计 算 模 型 分 为 两 层 的 客 户 机 / 服 务 器 结 构 和 多 层 的 客 户 机 / 服 务 器
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 29 结 构 在 两 层 的 客 户 机 / 服 务 器 系 统 中, 客 户 机 通 过 网 络 与 运 行 SQ L Server 2000 实 例 的 服 务 器 相 连, 客 户 机 用 来 完 成 数 据 表 示 和 大 部 分 业 务 逻 辑 的 实 现, 服 务 器 完 成 数 据 的 存 储 在 多 层 ( 一 般 为 三 层 ) 的 客 户 机 / 服 务 器 系 统 中, 第 一 层 是 客 户 机, 它 只 负 责 数 据 的 表 示 ; 第 二 层 是 业 务 逻 辑 层, 负 责 业 务 逻 辑 的 实 现, 所 有 客 户 机 都 可 以 对 它 进 行 访 问 ; 第 三 层 是 数 据 库 Internet 应 图 2 唱 1 客 户 机 / 服 务 器 结 构 用 就 是 三 层 结 构 的 一 个 典 型 例 子 SQ L Server 采 用 客 户 机 / 服 务 器 结 构 的 好 处 在 于 : (1) 数 据 集 中 存 储 在 服 务 器 上, 而 不 是 分 开 存 储 在 各 个 客 户 机 上, 这 使 所 有 用 户 都 可 以 访 问 到 相 同 的 数 据 (2) 业 务 逻 辑 和 安 全 规 则 可 以 在 服 务 器 上 定 义 一 次, 而 后 被 所 有 的 客 户 机 使 用 (3) 关 系 数 据 库 服 务 器 仅 返 回 应 用 程 序 所 需 要 的 数 据, 这 样 可 以 减 少 网 络 拥 挤 程 度 (4) 数 据 存 储 在 服 务 器 上, 客 户 机 硬 件 不 需 要 具 备 存 储 和 处 理 大 量 数 据 的 能 力, 同 样, 服 务 器 也 不 需 要 具 备 数 据 表 示 的 功 能 (5) 数 据 存 储 在 服 务 器 上, 所 以 数 据 的 备 份 和 恢 复 起 来 很 容 易 2.1.3 SQL Server 的 数 据 库 文 件 在 SQ L Server 2000 中, 使 用 一 组 操 作 系 统 文 件 来 映 射 数 据 库 数 据 库 中 的 所 有 数 据 和 对 象 都 存 储 在 下 列 操 作 系 统 文 件 中 : (1) 主 要 数 据 文 件 (.mdf) 该 文 件 包 含 数 据 库 的 启 动 信 息, 并 用 于 存 储 数 据 每 个 数 据 库 都 有 一 个 主 要 数 据 文 件 (2) 次 要 数 据 文 件 (.ndf) 这 些 文 件 也 用 来 存 储 数 据, 它 含 有 不 能 置 于 主 要 数 据 文 件 中 的 所 有 数 据 如 果 主 要 数 据 文 件 可 以 包 含 数 据 库 中 的 所 有 数 据, 那 么 数 据 库 就 不 需 要 次 要 数 据 文 件 如 果 数 据 库 很 大, 主 要 数 据 文 件 的 容 量 超 过 了 系 统 的 限 制, 就 需 要 设 置 一 个 或 多 个 次 要 数 据 文 件, 并 将 它 们 放 在 不 同 的 磁 盘 上 (3) 事 务 日 志 文 件 (.ldf) 这 些 文 件 包 含 用 于 恢 复 数 据 库 的 日 志 信 息 每 个 数 据 库 都 必 须 至 少 有 一 个 事 务 日 志 文 件 一 般 情 况 下, 一 个 简 单 的 数 据 库 可 以 只 有 一 个 主 要 数 据 文 件 和 一 个 事 务 日 志 文 件 如 果 数 据 库 很 大, 可 以 使 用 一 个 主 要 数 据 文 件 和 多 个 次 要 数 据 文 件, 数 据 库 内 的 数 据 和 对 象 分 布 到 这 些 主 要 和 次 要 文 件 中 ; 另 外 可 以 设 置 多 个 事 务 日 志 文 件 来 包 含 事 务 日 志 信 息 所 有 数 据 文 件 和 事 务 日 志 文 件 都 是 默 认 存 放 在 C : \ Program Files \ Microsoft SQ L Server\M SSQ L\Data 目 录 下 为 了 方 便 数 据 的 分 配 放 置 和 管 理,SQ L Server 提 供 了 对 数 据 库 文 件 进 行 分 组 管 理 的 功 能 文 件 组 可 以 将 数 据 分 布 在 多 个 磁 盘 上, 并 在 查 询 过 程 中 使 用 并 行 线 程, 从 而 改 善 系 统 性 能, 同 时 文 件 组 也 有 利 于 数 据 库 的 维 护 例 如, 可 以 将 一 个 数 据 库 的 三 个 次 要 数 据
30 SQL Server 数 据 库 应 用 技 术 文 件 (data1.ndf data2.ndf data3.ndf) 分 别 创 建 在 三 个 磁 盘 上, 这 三 个 文 件 组 成 文 件 组 filegroup1 然 后, 可 以 在 文 件 组 filegroup1 上 创 建 一 个 表 这 样 表 中 的 数 据 就 可 以 分 布 到 三 个 磁 盘 上, 在 对 该 表 执 行 查 询 时, 系 统 利 用 并 行 线 程 同 时 扫 描 三 个 磁 盘, 大 大 提 高 了 查 询 效 率 数 据 库 文 件 和 文 件 组 必 须 遵 循 以 下 规 则 : 一 个 文 件 和 文 件 组 只 能 被 一 个 数 据 库 使 用, 也 就 是 一 个 文 件 和 文 件 组 中 不 能 包 含 其 他 数 据 库 的 数 据 ; 一 个 数 据 库 文 件 只 能 属 于 一 个 文 件 组 ; 事 务 日 志 文 件 不 能 加 入 文 件 组 中 2.2 SQL Server 2000 的 服 务 器 组 件 SQL Server 2000 服 务 器 系 统 提 供 了 完 整 的 组 件 工 具, 通 过 使 用 这 些 服 务 器 组 件 工 具, 可 以 简 化 对 数 据 库 系 统 的 复 杂 操 作, 提 高 用 户 的 工 作 效 率 下 面 介 绍 几 个 服 务 器 组 件 1. 企 业 管 理 器 企 业 管 理 器 是 一 个 遵 从 M MC(Microsoft Manage Console, 微 软 管 理 控 制 台 ) 的 公 共 服 务 器 管 理 界 面 不 仅 可 以 在 企 业 管 理 器 中 完 成 绝 大 多 数 的 管 理 任 务, 例 如, 注 册 并 运 行 SQ L Server 服 务 器 实 例 在 SQ L Server 服 务 器 中 建 立 并 管 理 数 据 库 及 其 对 象 登 录 用 户 和 权 限 的 管 理 等 ; 而 且 可 以 在 一 个 界 面 下 同 时 管 理 多 个 SQ L Server 实 例, 包 括 远 程 网 络 上 的 SQ L Server 实 例 企 业 管 理 器 如 图 2 唱 2 所 示, 左 窗 格 的 树 型 目 录 包 括 了 在 企 业 管 理 器 中 注 册 的 所 有 SQ L Server 服 务 器, 以 及 每 个 服 务 器 所 能 提 供 的 服 务 在 树 型 目 录 中 选 择 一 个 目 录 项, 右 窗 格 就 会 显 示 该 目 录 项 的 具 体 内 容 图 2 唱 2 SQL Server 企 业 管 理 器 使 用 企 业 管 理 器 可 以 完 成 如 下 工 作 : 注 册 和 管 理 SQ L Server 服 务 器 ; 连 接 启 动 暂 停 或 停 止 SQ L Server 服 务 ; 创 建 和 管 理 数 据 库 ; 创 建 和 管 理 各 种 数 据 库 对 象 ; 备 份 数 据 库 和 事 务 日 志 ; 管 理 用 户 账 户, 编 写 和 执 行 T ransact 唱 SQ L 语 句 等 2. 查 询 分 析 器 查 询 分 析 器 是 一 个 交 互 式 图 形 工 具, 它 使 数 据 库 管 理 员 和 开 发 人 员 能 够 在 其 中 编 辑
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 31 运 行 SQ L 语 句, 并 且 可 以 在 查 询 分 析 器 的 窗 口 中 同 时 查 看 SQ L 语 句 的 执 行 结 果 查 询 分 析 器 如 图 2 唱 3 所 示, 左 窗 格 为 对 象 浏 览 器 (Object Brower), 利 用 对 象 浏 览 器 可 以 浏 览 当 前 服 务 器 的 所 有 数 据 库 对 象 ; 它 的 右 窗 格 的 上 部 是 查 询 窗 口, 在 这 里 用 户 可 以 输 入 SQ L 语 句, 下 部 是 SQ L 语 句 执 行 结 果 的 显 示 窗 口 图 2 唱 3 SQL Server 查 询 分 析 器 查 询 分 析 器 同 时 也 是 一 个 分 析 工 具, 它 不 仅 能 够 执 行 SQ L 语 句, 还 能 对 SQ L 语 句 的 执 行 结 果 进 行 分 析, 为 查 询 优 化 提 供 直 观 的 显 示 和 帮 助 3.SQL Server 服 务 管 理 器 SQ L Server 服 务 管 理 器 用 来 启 动 停 止 和 暂 停 各 种 SQ L Server 服 务 如 图 2 唱 4 所 示, 利 用 它 可 以 选 择 服 务 器 和 要 启 动 或 停 止 的 服 务 SQ L Server 服 务 包 括 M S SQ L Server 服 务 SQ L Server Agent 服 务 Microsoft 分 布 式 事 务 协 调 程 序 (MS D T S) 用 户 可 以 使 用 服 务 管 理 器 来 启 动 服 务 暂 停 和 停 止 正 在 运 行 的 服 务, 设 置 当 操 作 系 统 启 动 时 是 否 自 动 启 动 服 务 的 选 项 4. 事 件 探 查 器 事 件 探 查 器 (Profiler) 用 来 监 视 ( 跟 踪 ) 选 定 的 SQ L Server 事 件, 用 于 分 析 诊 断 和 审 计 SQ L 图 2 唱 4 SQL Server 服 务 管 理 器 Server 系 统 的 性 能 它 可 以 监 视 执 行 缓 慢 的 存 储 过 程 或 者 发 生 死 锁 之 前 的 事 件, 以 便 发 现 引 起 系 统 故 障 的 原 因 发 现 和 诊 断 运 行 缓 慢 的 SQ L 语 句 这 里 的 事 件 是 指 SQ L Server 引 擎 产 生 的 操 作, 包 括 登 录 SQ L 语 句 存 储 过 程 批 处 理 游 标 和 安 全 权 限 检 查 等 SQ L Server 事 件 探 查 器 是 一 个 图 形 化 的 工 具, 如 图 2 唱 5 所 示 事 件 探 查 器 允 许 系 统 管 理 员 对 计 算 机 上 正 在 运 行 的 SQ L Server 引 擎 事 件 进 行 监 视
32 SQL Server 数 据 库 应 用 技 术 图 2 唱 5 SQL Server 事 件 探 查 器 5. 性 能 监 视 器 除 了 SQ L Server 2000 提 供 的 多 种 工 具 可 以 监 视 SQ L Server 实 例 的 性 能 以 及 在 数 据 库 中 发 生 的 用 户 活 动 以 外, 还 可 以 使 用 Window s 操 作 系 统 中 的 工 具 性 能 监 视 器 来 监 视 硬 件 和 其 他 与 数 据 库 系 统 有 关 的 问 题 Window s 操 作 系 统 中 的 性 能 监 视 器 可 以 监 视 SQ L Server 的 性 能, 可 以 查 看 SQ L Server 进 程 的 性 能 计 数 器, 可 以 查 看 SQ L Server 运 行 时 包 括 CPU 处 理 器 内 存 高 速 缓 存 系 统 线 程 等 对 象 的 行 为 由 此 获 取 最 新 的 SQ L Server 活 动 及 性 能 统 计 信 息 使 用 Windows 操 作 系 统 的 性 能 监 视 器 对 SQ L Server 进 行 监 视 的 过 程 如 下 : 在 Windows 2000 中, 单 击 开 始 程 序 管 理 工 具 性 能, 就 可 以 打 开 性 能 监 视 器, 如 图 2 唱 6 所 示 它 可 以 让 用 户 自 由 设 置 要 监 视 的 对 象, 如 处 理 器 内 存 SQ L Server 进 程 等 监 视 器 以 图 形 方 式 直 观 地 显 示 各 监 视 对 象 的 计 数 器 值 图 2 唱 6 性 能 监 视 器
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 33 6. 其 他 服 务 器 组 件 除 了 上 面 介 绍 的 企 业 管 理 器 查 询 分 析 器 服 务 管 理 器 事 件 探 查 器 性 能 监 视 器 之 外, 服 务 器 组 件 还 有 : (1) D T S 导 入 和 导 出 向 导 : 一 个 数 据 传 递 工 具, 该 工 具 不 仅 可 以 在 服 务 器 之 间 传 递 SQ L Server 数 据, 同 时 还 可 以 传 递 异 种 数 据, 例 如 可 以 将 Microsoft Access 数 据 库 中 的 数 据 导 入 到 SQ L Server 2000 数 据 库 中, 也 可 以 将 SQ L Server 2000 数 据 库 中 的 数 据 以 其 他 数 据 源, 如 文 本 文 件 的 形 式 导 出 关 于 数 据 导 入 和 导 出 的 具 体 操 作, 请 参 见 第 11 章 数 据 转 换 服 务 中 的 详 细 介 绍 (2) 客 户 端 网 络 实 用 工 具 (Client Net w ork Utility) : 这 是 控 制 面 板 中 的 一 个 应 用 程 序, 其 路 径 为 c :\WIN N T \system32\cliconfg.cpl 该 程 序 用 于 设 置 本 机 作 为 客 户 机 访 问 其 他 SQ L Server 时 默 认 使 用 的 网 络 库 对 于 一 些 使 用 默 认 的 网 络 库 无 法 访 问 的 服 务 器 ( 如 Window s 98 上 的 SQ L Server) 来 说, 则 可 以 指 定 专 用 的 网 络 库 (3) 服 务 器 网 络 实 用 工 具 (Server Net w ork U tility) : 提 供 了 一 个 操 作 界 面, 用 于 设 置 本 机 作 为 服 务 器 时 允 许 的 连 接 协 议 ( 如 命 名 管 道 等 ), 以 便 支 持 不 同 配 置 的 客 户 端 (4) 联 机 丛 书 : SQ L Server 在 线 帮 助, 或 书 面 文 档 的 电 子 版, 几 乎 提 供 了 有 关 SQ L Server 2000 管 理 和 开 发 的 所 有 信 息 与 其 他 最 新 的 微 软 产 品 一 样,SQ L Server 2000 的 联 机 文 档 完 全 使 用 H T M L 格 式 2.3 SQL Server 2000 服 务 器 端 的 操 作 2.3.1 启 动 SQL Server 2000 1. 服 务 管 理 器 方 式 要 使 用 数 据 库, 首 先 要 启 动 SQ L Server, 用 户 可 以 利 用 服 务 管 理 器 即 选 择 开 始 程 序 Microsoft SQ L Server 程 序 组 中 的 服 务 器 管 理 器 命 令 项, 进 入 SQ L Server 服 务 器 管 理 器 窗 口, 如 图 2 唱 7 所 示 单 击 其 上 的 开 始 / 继 续 按 钮, 直 到 看 到 绿 灯 亮, 说 明 SQ L Server 已 经 启 动 2. 命 令 行 方 式 用 户 也 可 以 在 命 令 行 方 式 来 启 动 和 关 闭 SQ L Server 2000 例 如, 在 DOS 命 令 行 方 式 下 输 入 net start mssqlserver, 即 可 启 动 SQ L Server 2000 ; 输 入 net stop mssqlserver 命 令, 可 以 关 闭 SQ L Server 2000 图 2 唱 7 启 动 SQL Server 2000 3. 管 理 工 具 中 的 服 务 方 式 用 户 还 可 以 通 过 Windo ws 2000 Server 控 制 面 板 中 的 管 理 工 具 下 的 服 务 来 启 动
34 SQL Server 数 据 库 应 用 技 术 和 关 闭 SQ L Server 使 用 控 制 面 板 进 行 配 置, 可 按 下 列 步 骤 进 行 操 作 : 单 击 开 始 设 置 控 制 面 板, 打 开 控 制 面 板 窗 口, 双 击 服 务 图 标, 打 开 服 务 对 话 框, 对 话 框 的 服 务 清 单 中 显 示 了 当 前 系 统 中 每 一 种 服 务 的 当 前 状 态 和 启 动 方 式, 如 果 要 启 动 或 停 止 某 个 服 务, 可 选 定 该 服 务, 然 后 单 击 启 动 或 停 止 按 钮 ; 要 配 置 某 个 服 务, 可 双 击 该 服 务, 或 选 定 该 服 务 然 后 单 击 启 动 按 钮, 打 开 设 置 选 定 服 务 的 启 动 方 式 的 对 话 框 一 般 情 况 下, 服 务 的 启 动 方 式 有 自 动 手 动 和 禁 用 对 于 像 M S SQ L Server 这 样 的 不 涉 及 数 据 库 复 制 分 布 式 事 务 处 理 的 服 务, 可 设 置 为 自 动 启 动, 而 像 SQ L Server Agent 和 M SD T C 之 类 的 服 务, 可 设 置 为 手 工 启 动, 以 便 在 需 要 该 服 务 时, 通 过 控 制 面 板 其 他 应 用 程 序 或 Net Start 命 令 行 来 启 动 它 因 为 无 论 启 动 哪 一 种 服 务, 都 需 要 占 用 一 定 的 系 统 资 源, 影 响 到 整 个 系 统 的 性 能, 因 此, 一 般 情 况 下, 只 启 动 那 些 需 要 的 服 务 2.3.2 对 sa 账 号 加 入 密 码 系 统 在 第 一 次 安 装 时, 会 建 立 一 个 名 称 为 sa 的 用 户 账 号, 用 户 使 用 这 个 账 号 可 以 登 录 SQ L Server 服 务 器 使 用 数 据 库 等 但 是 它 没 有 密 码, 任 何 人 都 可 以 sa 的 名 义 登 录 和 使 用 数 据 库, 为 了 安 全 起 见, 必 须 在 安 装 完 成 后 马 上 对 sa 账 号 设 定 密 码 1. 利 用 企 业 管 理 器 给 sa 账 号 添 加 密 码 启 动 SQ L Server 服 务 器 后, 打 开 企 业 管 理 器 并 展 开 服 务 器, 选 择 安 全 性 文 件 夹 中 的 登 录 图 标, 双 击 该 图 标, 企 业 管 理 器 右 边 窗 口 将 显 示 本 服 务 器 的 现 有 登 录 账 号 选 中 sa 账 号, 右 击 并 选 择 属 性, 如 图 2 唱 8 所 示, 在 弹 出 的 属 性 对 话 框 中 重 新 输 入 修 改 的 密 码, 并 单 击 确 定 按 钮 即 可 如 图 2 唱 9 所 示 图 2 唱 8 给 sa 账 号 添 加 密 码
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 35 图 2 唱 9 SQL Server 登 录 属 性 2. 在 查 询 分 析 器 中 用 SQL 语 句 命 令 修 改 sa 账 号 密 码 打 开 查 询 分 析 器, 如 果 是 第 一 次 连 接 SQ L Server 服 务 器, 则 会 弹 出 连 接 SQ L Server 的 验 证 窗 口, 如 图 2 唱 10 所 示, 如 果 sa 账 号 没 有 密 码, 则 直 接 单 击 确 定 按 钮 ; 如 果 sa 账 号 有 密 码, 则 使 用 原 密 码 后 单 击 确 定 按 钮 账 号 验 证 完 毕 后 即 进 入 查 询 分 析 器 在 查 询 分 析 器 右 侧 的 查 询 页 窗 口 中 输 入 更 改 密 码 的 SQ L 语 句 命 令 : sp_password old_password, new_password [,login id] 图 2 唱 10 连 接 SQL Server 窗 口 其 中,old_passw ord : 原 密 码,new_passw ord : 修 改 后 的 密 码,login id : 登 录 名 如 果 原 来 没 有 设 定 密 码, 则 将 上 面 语 句 中 的 old_passw ord 设 为 null ;new_passw ord 设 置 为 新 密 码, 例 如 123456 最 后 单 击 查 询 分 析 器 窗 口 工 具 栏 上 的 执 行 查 询 按 钮, 即
36 SQL Server 数 据 库 应 用 技 术 可 得 到 密 码 已 更 改 的 信 息, 如 图 2 唱 11 所 示 2.3.3 SQL Server 2000 配 置 图 2 唱 11 查 询 分 析 器 中 修 改 sa 密 码 1. 使 用 企 业 管 理 器 配 置 服 务 单 击 开 始 程 序 Microsoft SQ L Server, 打 开 企 业 管 理 器 窗 口, 在 如 图 2 唱 12 所 示 企 业 管 理 器 的 左 窗 格, 将 鼠 标 移 至 服 务 器 上 右 击, 在 弹 出 的 菜 单 中 选 择 属 性 选 项, 系 统 弹 出 SQ L Server 属 性 ( 配 置 ) 对 话 框, 如 图 2 唱 13 所 示, 用 户 可 以 在 这 里 对 SQ L Server 系 统 配 置 进 行 设 置 或 修 改 其 中 : (1) 在 常 规 标 签 页 中, 可 设 置 是 否 自 动 启 动 SQ L Server 的 三 种 服 务, 单 击 启 动 参 图 2 唱 12 企 业 管 理 器 中 的 快 捷 菜 单
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 37 数 按 钮, 可 设 置 启 动 参 数 (2) 在 安 全 性 标 签 页 中, 可 设 置 启 动 服 务 时 使 用 的 账 号 类 型 (3) 在 内 存 标 签 页 上, 可 把 内 存 设 置 为 固 定 大 小, 也 可 设 置 为 根 据 需 要 自 动 调 整 内 存 大 小 (4) 在 处 理 器 标 签 页 上, 可 以 对 使 用 多 处 理 器 的 环 境 指 定 一 个 专 门 处 理 SQ L 的 处 理 器 (5) 在 连 接 标 签 页 上, 可 以 指 定 同 时 连 接 的 最 大 用 户 数 量, 以 及 是 否 允 许 其 他 的 SQ L Server 用 户 远 程 连 接 到 该 服 务 器 上 (6) 在 服 务 器 设 置 标 签 页 上, 可 指 定 用 户 使 用 的 默 认 语 言, 是 否 允 许 直 接 对 系 统 目 录 进 行 修 改, 是 否 运 行 触 发 器 嵌 套 等 (7) 在 数 据 库 设 置 标 签 页 上, 可 设 置 生 成 索 引 的 方 式, 备 份 和 恢 复 数 据 库 时 的 等 图 2 唱 13 SQL Server 属 性 的 配 置 待 时 间 (8) 在 复 制 标 签 页 上, 可 以 设 置 发 布 和 分 发 选 项, 但 必 须 先 设 置 发 布 服 务 器 和 分 发 服 务 器, 单 击 配 置 进 入 配 置 发 布 和 分 发 向 导 2.SQL Server 2000 的 安 全 配 置 服 务 SQ L Server 2000 使 用 两 层 安 全 机 制 来 确 认 用 户 的 有 效 性, 即 身 份 验 证 和 权 限 验 证 两 个 阶 段 (1) 身 份 验 证 模 式 1 Window s 认 证 : 用 户 对 SQ L Server 访 问 的 控 制 由 Windows 账 号 或 用 户 组 完 成, 当 进 行 连 接 时, 用 户 不 需 要 提 供 SQ L Server 登 录 账 号 2 SQ L Server 认 证 :SQ L Server 管 理 员 必 须 建 立 SQ L Server 登 录 账 号 和 口 令 当 用 户 要 连 接 到 SQ L Server 时, 必 须 同 时 提 供 SQ L Server 的 登 录 账 号 和 口 令 3 混 合 认 证 模 式 : 两 种 模 式 同 时 工 作, 用 户 既 能 使 用 Window s 2000 认 证 模 式 又 能 使 用 SQ L Server 认 证 模 式 连 接 到 SQ L Server 服 务 器 (2) 权 限 验 证 身 份 验 证 成 功, 连 接 到 SQ L Server 数 据 库 后, 用 户 必 须 使 用 特 定 的 用 户 账 号 才 能 对 数 据 库 进 行 访 问 SQ L Server 采 取 三 个 步 骤 来 确 认 权 限 1 当 用 户 执 行 一 项 操 作 时, 例 如 用 户 执 行 了 一 条 插 入 一 条 记 录 的 指 令, 客 户 端 将 用 户 T ransact 唱 SQ L 语 句 发 给 SQ L Server 2 当 SQ L Server 接 收 到 该 命 令 语 句 后, 立 即 检 查 该 用 户 是 否 有 执 行 这 条 指 令 的 权 限
38 SQL Server 数 据 库 应 用 技 术 3 如 果 用 户 具 备 这 个 权 限,SQ L Server 将 完 成 相 应 的 操 作, 如 果 用 户 没 有 这 个 权 限,SQ L Server 系 统 将 返 回 一 个 错 误 给 用 户 2.4 SQL Server 2000 的 客 户 端 组 件 在 客 户 端 / 服 务 器 结 构 中, 用 户 不 是 直 接 访 问 SQ L Server 2000 和 SQ L Server 服 务 的, 而 是 通 过 运 行 在 客 户 端 的 应 用 程 序 来 访 问 数 据 当 然 这 些 应 用 程 序 可 能 是 用 VB PB 等 计 算 机 语 言 编 写 的 软 件, 也 可 能 是 ASP JSP 网 页 等 不 管 是 用 什 么 计 算 机 语 言 编 写 的 应 用 程 序 还 是 网 页 等, 它 们 都 需 要 通 过 SQ L Server 2000 提 供 的 客 户 端 组 件 才 能 连 接 上 SQ L Server 服 务 器, 才 能 使 用 服 务 器 中 的 数 据 和 服 务 等 SQ L Server 2000 的 客 户 端 组 件 包 括 : (1) 客 户 应 用 程 序 它 发 出 SQ L 请 求 语 句, 接 收 数 据 查 询 结 果 SQ L 请 求 语 句 是 使 用 SQ L Server 2000 的 主 要 数 据 库 查 询 和 编 程 语 言 T ransact 唱 SQ L 编 写 的 数 据 库 命 令 语 句 客 户 应 用 程 序 正 是 通 过 数 据 库 应 用 程 序 接 口 ( 数 据 库 API) 向 SQ L Server 服 务 器 发 出 SQ L 请 求 命 令 客 户 端 应 用 程 序 向 服 务 端 提 交 查 询 请 求, 并 调 用 数 据 库 API 传 递 此 查 询 请 求, 数 据 库 API 使 用 提 供 程 序 (Provider) 数 据 库 驱 动 程 序 或 动 态 链 接 库 将 查 询 封 装 在 一 个 或 多 个 表 格 格 式 数 据 流 ( T DS) 中, 再 将 数 据 包 传 递 给 客 户 端 网 络 程 序 库 (2) 数 据 库 API(OLE DB,ODBC) 使 用 数 据 库 提 供 程 序 驱 动 程 序 或 动 态 链 接 库 来 传 递 SQ L 命 令 语 句 并 且 接 收 查 询 结 果 (3) 客 户 端 网 络 程 序 库 管 理 网 络 连 接 和 客 户 端 的 路 由, 它 能 将 数 据 库 请 求 和 服 务 器 返 回 的 结 果 打 包, 并 通 过 适 当 的 网 络 协 议 传 输 客 户 端 网 络 程 序 库 将 TDS 数 据 包 封 装 在 网 络 协 议 数 据 包 里 面, 然 后 调 用 操 作 系 统 进 程, 通 过 操 作 系 统 的 网 络 协 议 将 网 络 协 议 数 据 包 发 送 到 服 务 器 网 络 程 序 库 网 络 程 序 库 将 TDS 数 据 传 递 给 SQ L Server 的 开 放 式 数 据 服 务, 至 此 完 成 了 SQ L Server 2000 客 户 端 查 询 过 程 的 操 作 对 于 在 SQ L Server 客 户 端 操 作 以 返 回 服 务 器 查 询 结 果 的 操 作 过 程, 与 执 行 查 询 过 程 刚 好 相 反 2.5 SQL Server 2000 客 户 端 的 操 作 SQ L Server 2000 客 户 端 的 操 作 主 要 是 使 用 查 询 分 析 器 进 行 查 询 操 作 1. 查 询 分 析 器 的 功 能 查 询 分 析 器 是 一 种 图 形 工 具, 使 用 它 可 以 进 行 以 下 操 作 : (1) 创 建 查 询 和 其 他 SQ L 脚 本, 并 针 对 SQ L Server 数 据 库 执 行 它 们, 执 行 结 果 在 结 果 窗 格 中 以 文 本 或 表 格 形 式 显 示, 还 允 许 用 户 将 执 行 的 结 果 保 存 到 报 表 文 件 中 或 导 出 到 指 定 文 件 中 ;
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 39 (2) 利 用 模 板 功 能, 可 以 借 助 预 定 义 脚 本 来 快 速 创 建 数 据 库 和 数 据 库 对 象 ; (3) 利 用 对 象 浏 览 器 脚 本 功 能, 快 速 复 制 现 有 数 据 库 对 象 ; (4) 在 参 数 未 知 的 情 况 下 执 行 存 储 过 程 ; (5) 调 试 存 储 过 程 ; (6) 调 试 查 询 性 能 问 题, 包 括 显 示 执 行 计 划 显 示 服 务 器 跟 踪 显 示 客 户 统 计 索 引 优 化 向 导 等 ; (7) 在 数 据 库 内 定 位 对 象 ( 对 象 搜 索 功 能 ) 或 查 看 和 使 用 对 象 ; (8) 快 速 插 入 更 新 或 删 除 表 中 的 行 ; (9) 为 常 用 查 询 创 建 键 盘 快 捷 方 式 ; (10) 向 工 具 菜 单 添 加 常 用 命 令 在 查 询 分 析 器 中, 用 户 可 以 交 互 式 地 输 入 和 执 行 各 种 T ransact 唱 SQ L 语 句, 可 以 在 一 个 窗 口 中 查 看 T ransact 唱 SQ L 语 句 和 其 结 果 集, 既 可 同 时 执 行 多 条 T ransact 唱 SQ L 语 句, 也 可 执 行 脚 本 文 件 中 的 部 分 语 句 ; 可 图 形 化 地 显 示 执 行 计 划, 分 析 执 行 计 划 且 提 出 建 议 2. 查 询 分 析 器 的 使 用 (1) 查 询 分 析 器 提 供 的 窗 口 1 查 询 窗 口 查 询 窗 口 的 标 题 栏 显 示 数 据 库 服 务 器 的 名 称 当 前 数 据 库 的 名 称 当 前 登 录 名 称 和 查 询 名 称 如 果 已 将 查 询 保 存 到 文 件, 则 显 示 此 文 件 的 完 整 路 径 查 询 窗 口 由 多 个 窗 格 组 成 单 击 某 个 窗 格 可 使 其 成 为 活 动 窗 格 此 外, 按 Shift + F6 键 可 在 各 窗 格 间 移 动 其 中 编 辑 窗 格 是 一 个 文 本 编 辑 器, 可 以 在 这 里 输 入 T ransact 唱 SQ L 语 句 ; 结 果 窗 格 显 示 返 回 的 结 果 集 ; 消 息 窗 格 显 示 错 误 信 息 ; 执 行 计 划 窗 格 显 示 执 行 计 划 的 图 形 表 示 ; 跟 踪 窗 格 显 示 服 务 器 跟 踪 信 息 ; 统 计 窗 格 显 示 统 计 信 息 2 T ransact 唱 SQ L 调 试 程 序 窗 口 T ransact 唱 SQ L 调 试 程 序 窗 口 由 多 个 窗 格 组 成 代 码 窗 格 显 示 正 在 调 试 的 SQ L 语 句 此 外,T ransact 唱 SQ L 调 试 程 序 分 别 为 局 部 和 全 局 变 量 以 及 查 询 输 出 ( 结 果 集 ) 提 供 独 立 的 输 出 窗 口 3 打 开 表 窗 口 打 开 表 窗 口 在 表 格 中 显 示 来 自 表 的 列 和 行 可 以 在 该 窗 口 中 修 改 表 格 中 的 数 据, 也 可 以 插 入 和 删 除 行 (2) 使 用 T ransact 唱 SQ L 语 句 进 行 交 互 式 操 作 单 击 开 始 程 序 SQ L Server, 选 择 查 询 分 析 器 命 令, 就 可 启 动 查 询 分 析 器, 出 现 登 录 界 面 ; 在 连 接 到 SQ L Server 对 话 框 中 的 SQ L Server 栏 中 输 入 要 登 录 的 服 务 器 名 称, 使 用 SQ L Server 身 份 验 证 模 式, 在 登 录 名 栏 中 输 入 用 户 名, 在 密 码 栏 中 输 入 密 码, 最 后 单 击 确 定 按 钮 连 接 到 数 据 库 服 务 器, 启 动 查 询 分 析 器 在 SQ L 查 询 分 析 器 窗 口 中, 打 开 查 询 菜 单, 其 中 文 本 显 示 结 果 选 项 和 以 表 格 显 示 结 果 选 项 表 示 查 询 结 果 是 以 文 本 形 式 ( 如 图 2 唱 14 所 示 ) 显 示, 还 是 以 表 格 形 式 进 行 ( 如 图 2 唱 15 所 示 ) 显 示
SQL Server 数 据 库 应 用 技 术 图 2 唱 14 以 文 本 形 式 显 示 查 询 结 果 图 2 唱 15 以 表 格 形 式 显 示 查 询 结 果 (3) 在 SQ L 查 询 分 析 器 中 输 入 数 据 除 了 可 以 在 查 询 窗 口 的 编 辑 器 窗 格 内 键 入 INSER T U PDA T E 和 DELE T E 语 句 外,SQ L 查 询 分 析 器 还 提 供 了 打 开 表 窗 口, 它 是 用 于 查 看 或 修 改 数 据 的 一 个 图 形 界 面 从 对 象 浏 览 器 或 对 象 搜 索 对 话 框 中, 右 击 包 含 要 更 新 数 据 的 表, 并 从 弹 出 菜 单 中 选 择 打 开 命 令 即 可 在 打 开 表
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 41 可 以 同 时 指 定 多 个 文 件 扩 展 名, 每 个 扩 展 名 之 间 用 分 号 隔 开 ; 可 以 指 定 默 认 的 文 件 打 开 格 式 ; 把 制 表 位 (Tab) 修 改 为 空 格 符 号 ; 可 以 指 定 最 大 的 当 前 连 接 数, 默 认 的 连 接 数 为 32 ; 可 以 指 定 执 行 查 询 文 件 后 所 生 成 的 结 果 文 件 的 文 件 扩 展 名, 默 认 的 扩 展 名 是.rpt ; 可 以 指 定 当 执 行 完 一 批 查 询 作 业 后, 系 统 发 出 提 示 信 号, 如 Window s 消 息 嘟 嘟 声 播 放 指 定 的.WA V 文 件 等 可 以 为 指 定 的 服 务 器 配 置 选 项, 可 以 设 置 SQ L Server 登 录 选 项, 如 允 许 一 次 登 录 的 最 长 时 间, 默 认 的 时 间 是 15 秒 钟, 如 果 把 该 值 指 定 为 0, 则 表 示 登 录 时 间 是 无 限 的 ; 执 行 一 次 查 询 的 最 长 时 间, 以 及 传 递 的 信 息 包 的 大 小 等 还 可 以 设 置 查 询 选 项 及 在 SQ L Server 系 统 中 所 使 用 的 语 言 为 了 节 省 内 存, 在 结 果 标 签 页 上, 用 户 还 可 以 设 置 查 询 结 果 中 每 列 所 显 示 的 最 多 字 符 数, 该 选 项 的 默 认 值 是 每 列 256 个 字 符, 该 值 的 取 值 范 围 为 30 ~ 999 999 999 用 户 还 可 以 在 对 话 框 中 设 置 ODBC 跟 踪 选 项, 应 用 程 序 开 发 人 员 或 者 数 据 库 管 理 员 可 以 根 据 日 志 文 件, 分 析 被 记 录 的 查 询 语 句, 以 便 改 善 查 询 性 能 实 训 1. 实 训 目 的 (1) 了 解 SQ L Server 系 统 的 组 件 (2) 学 会 使 用 启 动 数 据 库 服 务 器 (3) 学 会 使 用 查 询 分 析 器 (4) 学 会 使 用 企 业 管 理 器 2. 实 训 的 知 识 准 备 对 于 管 理 服 务 器 和 客 户 机 开 发 数 据 库 和 应 用 程 序,SQ L Server 提 供 了 一 套 常 用 的 管 理 工 具 和 实 用 程 序 其 中 最 常 用 的 两 个 工 具 就 是 企 业 管 理 器 和 查 询 分 析 器 企 业 管 理 器 提 供 了 一 个 图 形 化 的 界 面, 有 许 多 对 话 框, 可 以 用 来 执 行 多 种 任 务, 例 如 设 置 服 务 器 配 置 选 项 管 理 用 户 登 录 账 户 和 数 据 库 用 户 创 建 数 据 库 和 数 据 库 对 象 查 询 分 析 器 则 通 过 图 形 界 面 来 执 行 SQ L 语 句 此 外, 还 有 许 多 实 用 工 具, 可 以 使 大 量 的 数 据 库 操 作 变 得 方 便 简 捷, 通 过 使 用 这 些 便 利 的 管 理 工 具, 能 够 对 SQ L Server 系 统 进 行 操 作 和 管 理 3. 实 训 内 容 和 步 骤 (1) 熟 悉 启 动 数 据 库 服 务 器 1 使 用 Windo ws 任 务 栏 SQ L Server 图 标 右 击 Window s 任 务 栏 中 的 SQ L Server 图 标, 从 快 捷 菜 单 中 选 取 M S SQ L Server 唱 启 动 命 令 2 使 用 SQ L Server 服 务 管 理 器 打 开 SQ L Server 服 务 管 理 器, 从 服 务 列 表 框 中 选 取 SQ L Server 服 务, 然 后 单 击 开 始 / 继 续 按 钮 此 时 可 以 选 中 复 选 框 当 启 动 OS 时 自 动 启 动 服 务, 这 样 就 可 让 M S SQ L Server 服 务 在 操 作 系 统 启 动 后 自 动 启 动 3 使 用 SQ L Server 企 业 管 理 器
42 SQL Server 数 据 库 应 用 技 术 打 开 企 业 管 理 器, 右 击 想 要 启 动 的 服 务 器, 然 后 从 快 捷 菜 单 中 选 取 启 动 命 令 4 使 用 控 制 画 板 的 服 务 应 用 程 序 打 开 控 制 面 板, 双 击 管 理 工 具 图 标, 再 双 击 服 务 图 标 ; 右 击 服 务 列 表 中 的 M S SQ L Server 服 务, 从 快 捷 菜 单 中 选 择 属 性 命 令 ; 最 后 在 M S SQ L Server 属 性 对 话 框 中, 从 启 动 类 型 列 表 框 中 选 取 自 动 选 项, 并 单 击 确 定 按 钮 5 使 用 net 命 令 使 用 net start mssqlserver net pause mssqlserver 或 net stop mssqlserver 来 启 动 暂 停 或 停 止 默 认 的 SQ L Server 实 例 如 果 操 作 SQ L Server 命 名 实 例, 则 格 式 为 net start mssql $ instancename 6 在 M S 唱 DOS 执 行 sqlserver.exe c :\ > sqlserver 启 动 暂 停 和 停 止 SQ L Server 技 巧, 对 于 初 学 者 都 是 非 常 基 本 且 重 要 的 当 然, 各 种 启 动 暂 停 和 停 止 SQ L Server 的 方 法 可 以 彼 此 交 互 运 用, 其 操 作 才 会 更 有 效 率 (2) 熟 悉 企 业 管 理 器 1 单 击 开 始 程 序 Microsoft SQ L Server, 打 开 企 业 管 理 器 窗 口, 在 其 左 窗 格, 右 击 指 定 服 务 器, 在 弹 出 的 菜 单 中 选 择 新 建 SQ L Server 注 册 选 项, 弹 出 欢 迎 使 用 注 册 向 导 对 话 框 这 里, 对 设 置 服 务 器 名 称 登 录 时 使 用 的 安 全 类 型 登 录 名 和 密 码 等 思 考 : 为 了 避 免 管 理 员 对 系 统 数 据 对 象 的 误 操 作 而 导 致 SQ L Server 服 务 无 法 启 动, 应 该 在 编 辑 SQ L Server 注 册 属 性 时 设 置 什 么 选 项? 2 单 击 开 始 程 序 Microsoft SQ L Server, 打 开 企 业 管 理 器 窗 口, 在 其 左 窗 格, 右 击 指 定 服 务 器, 在 弹 出 的 菜 单 中 选 择 属 性 选 项, 弹 出 SQ L Server 属 性 ( 配 置 ) 对 话 框, 这 里, 参 考 2.3.3 节 内 容 对 SQ L Server 系 统 配 置 进 行 设 置 或 修 改 思 考 : 在 安 全 性 标 签 页 中, 如 果 身 份 验 证 为 设 置 SQ L Server 和 Window s, 重 新 启 动 服 务 时, 用 户 能 使 用 Window s 身 份 验 证 直 接 连 接 到 SQ L Server 服 务 器 吗? (3) 熟 悉 查 询 分 析 器 单 击 开 始 菜 单, 找 到 查 询 分 析 器 即 可 进 入 登 录 界 面 在 连 接 到 SQ L Server 对 话 框 中 的 SQ L Server 栏 中 输 入 要 登 录 的 服 务 器 名 称, 并 在 登 录 名 栏 中 输 入 用 户 名, 然 后 在 密 码 栏 中 输 入 密 码 ( 或 采 用 Window s 身 份 验 证 ), 最 后 单 击 确 定 按 钮, 即 可 进 入 查 询 分 析 器 操 作 界 面 1 在 查 询 分 析 器 中 的 编 辑 窗 格 输 入 以 下 的 查 询 语 句 : SELECT tech_title, salary FROM teacher_info WHERE tech_title = 讲 师 OR tech_title = 助 教 ORDER BY tech_title COMPU TE sum(salary) BY tech_title 2 选 择 查 询 菜 单 下 的 显 示 执 行 计 划 和 显 示 客 户 统 计 选 项
第 2 章 SQL Server 2000 服 务 器 和 客 户 端 43 在 查 询 分 析 器 中, 编 辑 窗 格 是 一 个 文 本 编 辑 器, 可 以 在 这 里 输 入 T ransact 唱 SQ L 语 句 ; 结 果 窗 格 显 示 返 回 的 结 果 集 ; 消 息 窗 格 显 示 错 误 信 息 ; 执 行 计 划 窗 格 显 示 执 行 计 划 的 图 形 表 示 ; 跟 踪 窗 格 显 示 服 务 器 跟 踪 信 息 ; 统 计 窗 格 显 示 统 计 信 息 3 选 择 查 询 菜 单 下 的 文 本 显 示 结 果 选 项, 单 击 工 具 栏 上 执 行 查 询 按 钮 查 看 结 果 执 行 计 划 统 计 标 签 页 的 内 容 4 选 择 查 询 菜 单 下 的 以 表 格 显 示 结 果 选 项, 单 击 工 具 栏 上 执 行 查 询 按 钮 查 看 结 果 执 行 计 划 统 计 消 息 标 签 页 的 内 容 (4) 使 用 osql 实 用 程 序 C :\ > osql 唱 Usa 密 码 : 1 > USE student 2 > GO 1 > SELECT stud_id,name,address,telcode,zipcode,mark FROM stud_info 2 > GO stud_id name address telcode zipcode mark 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 0401030101 王 刚 天 津 市 南 开 区 022 唱 83572336 300000 560 0401010704 王 一 明 甘 肃 省 兰 州 市 0621 唱 2221837 590000 573 0401010102 袁 飞 湖 南 省 长 沙 县 0731 唱 4572345 410000 560 0401010245 谢 仰 光 广 东 省 湛 江 市 0789 唱 4526345 514020 565 0401040123 孔 荣 云 南 省 昆 明 市 0871 唱 2647535 650000 600 0401040112 孙 强 重 庆 市 沙 坪 坝 023 唱 82342348 400000 560 0401020201 赵 明 上 海 市 浦 东 区 021 唱 64897232 201700 560 0401030213 郑 芳 江 苏 省 南 京 市 025 唱 84573941 210000 560 0401020103 李 伟 北 京 市 大 兴 县 010 唱 68902947 102600 560 0401050201 陈 红 武 汉 市 汉 口 区 027 唱 74565350 430000 560 0401010811 张 源 北 京 市 海 淀 区 010 唱 64572345 100080 560 0401010634 钱 昆 广 州 市 海 珠 区 020 唱 45672453 510000 560 0401050127 张 军 成 都 市 和 平 区 028_85249567 610041 570 (13 行 受 到 影 响 ) 1 > exit C :\ > osql 唱 Usa 唱 dstudent 唱 Q SELECT stud_id,name,address,telcode,zipcode,mark FROM stud_ info 密 码 : stud_id name address telcode zipcode mark 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 0401030101 王 刚 天 津 市 南 开 区 022 唱 83572336 300000 560 0401010704 王 一 明 甘 肃 省 兰 州 市 0621 唱 2221837 590000 573 0401010102 袁 飞 湖 南 省 长 沙 县 0731 唱 4572345 410000 560 0401010245 谢 仰 光 广 东 省 湛 江 市 0789 唱 4526345 514020 565
44 SQL Server 数 据 库 应 用 技 术 0401040123 孔 荣 云 南 省 昆 明 市 0871 唱 2647535 650000 600 0401040112 孙 强 重 庆 市 沙 坪 坝 023 唱 82342348 400000 560 0401020201 赵 明 上 海 市 浦 东 区 021 唱 64897232 201700 560 0401030213 郑 芳 江 苏 省 南 京 市 025 唱 84573941 210000 560 0401020103 李 伟 北 京 市 大 兴 县 010 唱 68902947 102600 560 0401050201 陈 红 武 汉 市 汉 口 区 027 唱 74565350 430000 560 0401010811 张 源 北 京 市 海 淀 区 010 唱 64572345 100080 560 0401010634 钱 昆 广 州 市 海 珠 区 020 唱 45672453 510000 560 0401050127 张 军 成 都 市 和 平 区 028_85249567 610041 570 (13 行 受 到 影 响 ) C :\ > 课 后 作 业 简 要 回 答 下 列 问 题 (1) 企 业 管 理 器 的 用 途 是 什 么? 使 用 它 可 以 完 成 哪 些 操 作? (2) 若 对 已 注 册 的 服 务 器 信 息 进 行 编 辑, 应 该 如 何 操 作? (3) 查 询 分 析 器 可 以 进 行 的 操 作 有 哪 些? (4) 可 使 用 SQ L Server 提 供 的 哪 种 工 具 来 执 行 T ransact 唱 SQ L 语 句? (5) 通 常, 使 用 什 么 工 具 可 启 动 SQ L Server 的 服 务? (6) 如 何 以 net 命 令 来 启 动 SQ L Server? (7) 在 命 令 提 示 符 中 执 行 sqlserver 命 令 来 启 动 SQ L Server 与 采 用 其 他 方 式 启 动 SQ L Server 有 哪 些 不 同 点? (8) 如 何 才 能 以 单 用 户 模 式 启 动 SQ L Server, 采 用 单 用 户 模 式 的 主 要 目 的 是 什 么? (9) 说 明 为 什 么 需 要 在 停 止 运 行 SQ L Server 前 先 暂 停 SQ L Server (10) 如 何 保 护 SQ L Server 的 实 例 对 象, 使 之 不 会 出 现 在 企 业 管 理 器 中?
第 3 章 数 据 库 及 其 管 理 数 据 库 由 包 含 数 据 的 基 本 表 和 对 象 ( 如 视 图 索 引 存 储 过 程 和 触 发 器 等 ) 组 成 其 主 要 用 途 是 处 理 数 据 管 理 活 动 产 生 的 信 息 例 如, 学 生 管 理 中 的 大 量 学 生 信 息, 需 要 一 个 基 于 数 据 技 术 的 学 生 信 息 管 理 系 统 来 提 供 应 用 支 持 本 章 主 要 讲 述 SQ L Server 2000 中 的 系 统 数 据 库, 以 及 它 们 在 SQ L Server 中 的 使 用 和 所 提 供 的 管 理 作 用 ; 最 后 讲 述 如 何 创 建 用 户 数 据 库 和 有 关 数 据 库 的 管 理 3.1 系 统 数 据 库 每 个 SQL Server 都 包 含 两 种 类 型 的 数 据 库 : 系 统 数 据 库 和 用 户 数 据 库 系 统 数 据 库 存 储 有 关 SQL Server 的 信 息,SQL Server 使 用 系 统 数 据 库 来 操 作 和 管 理 系 统, 例 如 下 面 将 要 介 绍 的 master 数 据 库 model 数 据 库 msdb 数 据 库 和 tempdb 数 据 库 而 用 户 数 据 库 由 用 户 来 建 立, 例 如 学 生 管 理 信 息 数 据 库 SQL Server 可 以 包 含 有 一 个 或 多 个 用 户 数 据 库 3.1.1 master 数 据 库 顾 名 思 义,master( 控 制 ) 数 据 库 是 SQ L Server 2000 中 的 总 控 数 据 库, 它 是 最 重 要 的 系 统 数 据 库, 记 录 系 统 中 所 有 系 统 级 的 信 息 它 对 其 他 的 数 据 库 实 施 管 理 和 控 制 的 功 能, 同 时 该 数 据 库 还 保 存 了 用 于 SQ L Server 管 理 的 许 多 系 统 级 别 信 息 master 数 据 库 记 录 所 有 的 登 录 账 户 和 系 统 配 置 设 置 ; 记 录 所 有 其 他 的 数 据 库, 其 中 包 括 数 据 库 文 件 的 位 置 ; 还 记 录 SQ L Server 的 初 始 化 信 息, 它 始 终 有 一 个 可 用 的 最 新 master 数 据 库 备 份 由 上 可 知, 在 计 算 机 上 安 装 了 一 个 SQ L Server 系 统, 那 么 系 统 首 先 会 建 立 一 个 master 数 据 库 来 记 录 系 统 的 有 关 登 录 账 户 系 统 配 置 数 据 库 文 件 等 初 始 化 信 息 ; 如 果 用 户 在 这 个 SQ L Server 系 统 里 面 建 立 一 个 用 户 数 据 库 ( 如 学 生 管 理 系 统 数 据 库 ), 系 统 马 上 将 用 户 数 据 库 的 有 关 用 户 管 理 文 件 配 置 数 据 库 属 性 等 信 息 写 入 到 master 数 据 库 系 统 正 是 根 据 master 数 据 库 里 的 信 息 来 管 理 系 统 和 其 他 数 据 库 因 此 如 果 master 数 据 库 信 息 被 破 坏, 整 个 SQ L Server 系 统 将 受 到 影 响, 用 户 数 据 库 将 不 能 被 使 用 3.1.2 model 数 据 库 model( 模 板 ) 数 据 库 为 用 户 新 创 建 的 数 据 库 提 供 模 板 和 原 型 它 包 含 了 用 户 数 据 库 中 应 该 包 含 的 所 有 系 统 表 的 结 构 当 用 户 创 建 数 据 库 时, 系 统 会 自 动 地 把 model 数 据 库
46 SQL Server 数 据 库 应 用 技 术 中 的 内 容 复 制 到 新 建 的 用 户 数 据 库 中 熟 悉 Microsoft Word 的 用 户 都 会 有 这 样 的 体 会, 当 修 改 了 文 档 的 页 面 设 置, 并 把 该 设 置 作 为 默 认 设 置 保 存 起 来, 那 么 在 此 之 后 新 建 的 任 何 文 档 的 格 式 都 会 默 认 为 该 设 置 格 式 也 就 是 说, 在 把 被 修 改 过 的 页 面 设 置 作 为 默 认 设 置 保 存 的 同 时, 也 就 修 改 了 Microsoft Word 中 基 于 所 有 新 建 文 档 的 Normal 模 板 同 样,SQ L Server 中 的 model 数 据 库 就 是 系 统 为 用 户 创 建 新 的 数 据 库 而 制 作 的 一 个 通 用 模 板, 用 户 在 系 统 中 新 创 建 的 所 有 数 据 库 的 内 容, 最 初 都 与 该 模 板 数 据 库 具 有 完 全 相 同 的 内 容 3.1.3 msdb 数 据 库 msdb 数 据 库 供 SQ L Server 代 理 程 序 调 度 警 报 作 业 以 及 记 录 操 作 员 时 使 用 当 很 多 用 户 在 使 用 一 个 数 据 库 时, 经 常 会 出 现 多 个 用 户 对 同 一 数 据 的 修 改 而 造 成 数 据 不 一 致 的 现 象, 或 者 是 用 户 对 某 些 数 据 和 对 象 的 非 法 操 作 等 为 了 防 止 上 述 现 象 的 发 生,SQ L Server 里 面 有 一 套 代 理 程 序 能 够 按 照 系 统 管 理 员 的 设 定 来 监 控 上 述 现 象 的 发 生, 否 则 及 时 向 系 统 管 理 员 发 出 警 报 那 么 当 代 理 程 序 调 度 警 报 和 作 业 记 录 操 作 员 的 时 候, 系 统 要 用 到 或 实 时 产 生 许 多 相 关 信 息, 这 些 信 息 一 般 存 储 在 msdb 数 据 库 里 面 3.1.4 tempdb 数 据 库 使 用 SQL Server 系 统 时, 经 常 产 生 一 些 临 时 表 和 临 时 数 据 库 对 象 等, 如 用 户 在 修 改 数 据 库 表 中 某 一 行 数 据 时, 在 修 改 数 据 这 一 事 务 没 有 被 提 交 的 情 况 下, 系 统 里 面 就 会 有 该 数 据 的 新 旧 版 本 之 分, 往 往 修 改 后 的 数 据 表 构 成 了 临 时 表 所 以 系 统 要 提 供 一 个 空 间 来 储 存 这 些 临 时 表 和 临 时 对 象 tempdb 数 据 库 保 存 所 有 的 临 时 表 和 临 时 存 储 过 程 tempdb 数 据 库 是 全 局 资 源, 所 有 连 接 到 系 统 的 用 户 的 临 时 表 和 存 储 过 程 都 被 存 储 在 该 数 据 库 中 tempdb 数 据 库 有 个 特 性, 即 它 是 临 时 的,tempdb 数 据 库 在 SQ L Server 每 次 启 动 时 都 被 重 新 创 建, 因 此 该 数 据 库 在 系 统 启 动 时 总 是 干 净 的, 上 一 次 的 临 时 数 据 都 被 清 除 掉 了 临 时 表 和 存 储 过 程 在 连 接 断 开 时 自 动 除 去, 而 且 当 系 统 关 闭 后 将 没 有 任 何 连 接 处 于 活 动 状 态, 因 此 tempdb 数 据 库 中 没 有 任 何 内 容 会 从 SQ L Server 的 一 个 启 动 工 作 保 存 到 另 一 个 启 动 工 作 之 中 默 认 情 况 下, 在 SQ L Server 在 运 行 时 tempdb 数 据 库 会 根 据 需 要 自 动 增 长 不 过, 与 其 他 数 据 库 不 同, 每 次 启 动 数 据 库 引 擎 时, 它 会 重 置 为 其 初 始 大 小 此 外,SQ L Server 2000 还 提 供 了 两 个 样 板 数 据 库 : pubs 和 Northwind 其 中 pubs 数 据 库 记 录 了 一 个 虚 构 的 出 版 公 司 的 数 据 信 息 而 Northwind 数 据 库 则 保 存 了 一 个 虚 构 的 贸 易 公 司 的 数 据 信 息 msdb tempdb pubs Northwind 这 四 个 系 统 数 据 库 和 两 个 样 板 数 据 库 都 是 在 系 统 安 装 时 生 成 的 3.2 创 建 用 户 数 据 库 在 一 个 SQ L Server 系 统 中 有 多 种 方 法 可 以 创 建 用 户 数 据 库, 一 种 是 使 用 企 业 管 理 器 建 立 数 据 库, 此 方 法 直 观 简 单, 以 图 形 化 的 方 式 完 成 数 据 库 的 创 建 和 数 据 库 属 性 的 设 置 ; 另 一 种 是 在 SQ L Server 查 询 分 析 器 中 使 用 T ransact 唱 SQ L 命 令 创 建 数 据 库, 此 方 法 使 用 T ransact 唱 SQ L 命 令 创 建 数 据 库 和 设 置 数 据 库 属 性, 它 还 可 以 将 创 建 数 据 库 的 脚 本 保 存 下 来, 在 其 他 机 器 上 运 行 以 创 建 相 同 的 数 据 库 此 外, 利 用 系 统 提 供 的 创 建 数 据 库 向 导 也 可
第 3 章 数 据 库 及 其 管 理 47 以 创 建 数 据 库 创 建 用 户 数 据 库 之 前, 必 须 先 确 定 数 据 库 的 名 称 数 据 库 所 有 者 初 始 大 小 数 据 库 文 件 增 长 方 式 数 据 库 文 件 的 最 大 允 许 增 长 的 大 小, 以 及 用 于 存 储 数 据 库 的 文 件 路 径 和 属 性 等 下 面 分 别 介 绍 两 种 创 建 数 据 库 的 方 法 3.2.1 使 用 企 业 管 理 器 创 建 用 户 数 据 库 在 企 业 管 理 器 界 面 里 展 开 SQ L Server 服 务 器, 右 击 数 据 库, 然 后 单 击 新 建 数 据 库 命 令 如 图 3 唱 1 所 示 图 3 唱 1 利 用 企 业 管 理 器 创 建 用 户 数 据 库 系 统 弹 出 数 据 库 属 性 对 话 框, 在 名 称 输 入 框 中 键 入 创 建 的 数 据 库 名 称 Student, 然 后 单 击 确 定 按 钮 如 图 3 唱 2 所 示 此 时 系 统 会 以 数 据 库 名 作 为 前 缀 创 建 主 数 据 库 文 件 和 事 务 日 志 文 件, 如 Student_Data.mdf 和 Student_ Log.ldf 主 数 据 库 和 事 务 日 志 文 件 图 3 唱 2 给 创 建 的 数 据 库 命 名
48 SQL Server 数 据 库 应 用 技 术 的 初 始 大 小 与 为 model 系 统 数 据 库 指 定 的 默 认 大 小 相 同 用 户 可 以 选 择 数 据 文 件 标 签, 对 数 据 文 件 的 默 认 属 性 进 行 修 改, 如 图 3 唱 3 所 示, 可 以 设 置 数 据 文 件 的 路 径 文 件 的 增 长 方 式 和 文 件 增 长 限 制 等 属 性 用 户 还 可 以 选 择 事 务 日 志 标 签, 对 数 据 库 的 事 务 日 志 文 件 的 默 认 属 性 进 行 修 改 如 图 3 唱 4 所 示 图 3 唱 3 设 置 数 据 文 件 属 性 图 3 唱 4 设 置 事 务 日 志 属 性 创 建 完 成 用 户 数 据 库 后, 就 可 以 在 企 业 管 理 器 的 控 制 台 根 目 录 窗 口 中, 展 开 SQ L 服 务 器 (Local)Window s N T 下 的 数 据 库, 用 户 就 可 以 看 到 新 建 立 的 数 据 库 3.2.2 使 用 SQL 查 询 分 析 器 创 建 用 户 数 据 库 使 用 SQ L 查 询 分 析 器 创 建 数 据 库, 其 实 就 是 在 查 询 分 析 器 的 编 辑 窗 口 中 使 用 CREA T E DA T ABASE 等 T ransact 唱 SQ L 语 句 并 运 行 这 些 T ransact 唱 SQ L 命 令, 来 创 建 用
第 3 章 数 据 库 及 其 管 理 49 户 数 据 库, 其 语 句 格 式 如 下 : CREATE DATABASE database_name ON {[PRIMARY] (NAME = logical_file_name, FILENAME = os_file_name, [,SIZE = size] [,MAXSIZE = {max_size UNLIMTED}] [,FILEGROWTH = grow_increment]) }[,...n] LOG ON {(NAME = logical_file_name, FILENAME = os_file_name [,SIZE = size] [,MAXSIZE = {max_size UNLIMTED}] [,FILEGROWTH = grow_increment]) }[,...n] 其 中 : 瞯 database_name : 要 建 立 的 数 据 库 名 称 瞯 PRIM ARY : 该 参 数 在 主 文 件 组 中 指 定 文 件 主 文 件 组 中 包 含 有 所 有 数 据 库 系 统 表, 还 包 含 所 有 未 指 派 给 用 户 文 件 组 的 对 象 主 文 件 组 的 第 一 个 logical_ file_ name 成 为 主 文 件, 该 文 件 包 含 数 据 库 的 逻 辑 起 点 及 其 系 统 表 一 个 数 据 库 只 能 有 一 个 主 文 件 如 果 没 有 指 定 PRIM ARY, 那 么 CREA T E DA T ABASE 语 句 中 列 出 的 第 一 个 文 件 将 成 为 主 文 件 瞯 ON : 指 定 显 式 定 义 用 来 存 储 数 据 库 数 据 部 分 的 磁 盘 文 件 ( 数 据 文 件 ) 瞯 LOG ON : 指 定 建 立 数 据 库 的 日 志 文 件 瞯 N A M E : 指 定 数 据 或 日 志 文 件 的 文 件 名 称 瞯 FILEN A ME : 指 定 文 件 的 操 作 系 统 文 件 名 和 路 径 os_file_name 中 的 路 径 必 须 指 定 为 SQ L Server 所 安 装 服 务 器 上 的 某 个 文 件 夹 瞯 SIZE : 指 定 数 据 或 日 志 文 件 的 大 小 用 户 可 以 以 MB 为 单 位 指 定 大 小, 也 可 以 使 用 默 认 单 位 KB 来 指 定 大 小 当 添 加 数 据 文 件 或 日 志 文 件 时, 其 默 认 大 小 是 1MB 瞯 M AXSIZE : 指 定 文 件 能 够 增 长 到 的 最 大 长 度 默 认 单 位 为 KB, 用 户 也 可 以 以 MB 来 指 定 该 长 度 如 果 没 有 指 定 长 度 的 话, 文 件 将 一 直 增 长 直 到 磁 盘 满 为 止 要 建 立 的 数 据 库 大 小 单 位 为 MB 瞯 FILEGROW T H : 指 定 文 件 的 增 长 增 量 该 参 数 设 置 不 能 超 过 M AXSIZE 参 数 指 定 值 的 默 认 单 位 为 MB, 用 户 也 可 以 以 KB 为 单 位 进 行 指 定, 此 外 还 可 以 使 用 百 分 比 ( % ) 如 果 该 参 数 没 有 指 定 的 话, 默 认 值 为 10 %, 最 小 值 为 64KB 例 3.1 创 建 一 个 名 为 student 的 用 户 数 据 库, 其 主 文 件 大 小 为 100MB, 最 大 长 度 为 50MB, 文 件 大 小 增 长 率 为 15 %, 日 志 文 件 大 小 为 10MB, 文 件 增 长 增 量 为 2MB
50 SQL Server 数 据 库 应 用 技 术 CREATE DAT ABASE student ON PRIMARY (NAME = student_data, FILENA ME = c :\Program Files\ Microsoft SQL Server\ MSSQL\Data\student.mdf, SIZE = 25, MAXSIZE = 100, FILEGROWT H = 15 % ) LOG ON (NAME = student_log, FILENA ME = c :\Program Files\ Microsoft SQL Server\ MSSQL\Data\student.ldf, SIZE = 10, MAXSIZE = 20, FILEGROWT H = 2) 如 图 3 唱 5 所 示, 在 SQ L 查 询 分 析 器 的 编 辑 窗 口 输 入 编 辑 上 述 T ransact 唱 SQ L 语 句 并 执 行, 即 可 创 建 指 定 的 数 据 库 图 3 唱 5 使 用 查 询 分 析 器 创 建 数 据 库 说 明 : 使 用 一 条 CREA T E DA T ABASE 语 句 即 可 创 建 数 据 库 以 及 存 储 该 数 据 库 的 文 件 SQ L Server 分 两 步 实 现 CREA T E DA T ABASE 语 句 首 先,SQ L Server 使 用 model 数 据 库 的 副 本 初 始 化 数 据 库 及 其 元 数 据 ; 然 后,SQ L Server 使 用 空 页 填 充 数 据 库 的 剩 余 部 分, 每 个 新 数 据 库 都 从 model 数 据 库 继 承 数 据 库 选 项 设 置 3.2.3 事 务 日 志 在 SQ L Server 2000 中, 数 据 库 必 须 包 含 一 个 或 多 个 数 据 文 件 和 一 个 事 务 日 志 文 件, 并 且 每 个 文 件 只 能 由 一 个 数 据 库 使 用, 如 图 3 唱 5 中 的 学 生 管 理.mdf 和 学 生 管 理.ldf
第 3 章 数 据 库 及 其 管 理 51 两 个 文 件, 只 能 由 学 生 管 理 这 个 数 据 库 使 用 前 面 已 经 讲 过, 数 据 库 的 数 据 文 件 主 要 记 录 数 据 库 的 启 动 信 息 并 用 来 存 储 数 据, 而 数 据 库 的 事 务 日 志 文 件 里 包 含 着 用 于 恢 复 数 据 库 的 事 务 日 志 信 息 SQ L Server 使 用 各 数 据 库 的 事 务 日 志 来 恢 复 事 务 事 务 ( T ransaction) 是 作 为 单 个 逻 辑 工 作 单 元 执 行 的 一 系 列 操 作, 如 在 数 据 库 中 创 建 一 张 数 据 表 对 数 据 表 中 的 某 一 数 据 进 行 修 改 等 操 作 都 是 一 个 事 务 事 务 日 志 是 数 据 库 中 已 发 生 的 所 有 修 改 和 执 行 每 次 修 改 的 事 务 的 一 连 串 记 录 事 务 日 志 记 录 每 个 事 务 的 开 始, 它 记 录 了 在 每 个 事 务 期 间, 对 数 据 的 更 改 及 撤 销 更 改 所 需 的 足 够 信 息 对 于 一 些 大 的 操 作 ( 如 CREA T E INDEX), 事 务 日 志 则 记 录 该 操 作 发 生 的 事 实 随 着 数 据 库 中 发 生 被 记 录 的 操 作, 日 志 会 不 断 地 增 长 事 务 日 志 记 录 数 据 页 的 分 配 和 释 放, 以 及 每 个 事 务 的 提 交 或 回 滚 这 允 许 SQ L Server 采 用 下 列 方 式 应 用 ( 前 滚 ) 或 收 回 ( 回 滚 ) 每 个 事 务 在 应 用 事 务 日 志 时, 事 务 将 前 滚 SQ L Server 将 每 次 修 改 后 的 映 像 复 制 到 数 据 库 中, 或 者 重 新 运 行 语 句 ( 如 CREA T E INDEX) 这 些 操 作 将 按 照 其 原 始 发 生 顺 序 进 行 应 用 此 过 程 结 束 后, 数 据 库 将 处 于 与 事 务 日 志 备 份 时 相 同 的 状 态 当 收 回 未 完 成 的 事 务 时, 事 务 将 回 滚 SQL Server 将 恢 复 到 此 未 完 成 事 务 之 前 的 状 态 3.2.4 查 看 数 据 库 信 息 对 于 已 有 的 数 据 库, 可 以 分 别 利 用 企 业 管 理 器 和 Transact 唱 SQL 语 句 来 查 看 数 据 库 信 息 1. 用 企 业 管 理 器 查 看 数 据 库 信 息 打 开 SQ L Server 企 业 管 理 器, 在 控 制 台 根 目 录 窗 口 中, 选 中 需 要 查 看 信 息 的 数 据 库 student, 右 击, 在 弹 出 菜 单 中 选 择 查 看 菜 单, 在 弹 出 的 子 菜 单 中 选 择 并 单 击 任 务 板 菜 单, 如 图 3 唱 6 图 3 唱 7 所 示 图 3 唱 6 带 快 捷 菜 单 的 企 业 管 理 器
52 SQL Server 数 据 库 应 用 技 术 图 3 唱 7 数 据 库 信 息 在 任 务 板 的 常 规 选 项 卡 中, 此 时 会 列 出 数 据 库 备 份 和 维 护 计 划, 以 及 空 间 配 置 等 信 息 数 据 库 本 身 的 信 息 包 括 数 据 库 的 所 有 者 创 建 的 日 期 大 小 可 用 空 间 数 据 库 选 项 与 用 户 数 ; 在 维 护 方 面, 则 会 列 出 上 一 次 执 行 数 据 库 完 全 备 份 差 异 备 份 事 务 日 志 备 份 的 日 期 时 间 以 及 先 前 创 建 的 各 个 维 护 计 划 ; 至 于 空 间 配 置 则 会 将 各 个 数 据 文 件 与 日 志 文 件 的 已 使 用 空 间 可 用 空 间 及 总 空 间 清 楚 地 显 示 出 来 2. 使 用 Transact 唱 SQL 命 令 查 看 数 据 库 信 息 在 T ransact 唱 SQ L 语 句 格 式 中 有 许 多 查 看 数 据 库 信 息 的 语 句 如 可 以 使 用 存 储 过 程 sp_helpdb 来 显 示 有 关 数 据 库 和 数 据 库 参 数 的 信 息 图 3 唱 8 使 用 存 储 过 程 sp_helpdb 对 数 据 库 student 进 行 属 性 查 询, 图 中 显 示 了 该 数 据 库 的 所 有 者 状 态 创 建 时 间 文 件 尺 图 3 唱 8 使 用 sp_helpdb 显 示 数 据 库 信 息
第 3 章 数 据 库 及 其 管 理 53 寸 文 件 增 长 属 性 等 数 据 库 信 息 其 命 令 为 : sp_helpdb student 图 3 唱 9 显 示 了 使 用 存 储 过 程 sp_spaceused 查 看 数 据 库 空 间 信 息 结 果 显 示 了 数 据 库 student 的 基 本 信 息 和 数 据 库 的 空 间 尺 寸, 以 及 已 使 用 空 间 和 未 分 配 空 间 等 信 息 3.3 管 理 数 据 库 图 3 唱 9 使 用 sp_spaceused 显 示 数 据 库 空 间 信 息 数 据 库 在 使 用 过 程 中 一 些 属 性 会 发 生 变 化, 例 如 空 间 尺 寸 数 据 库 性 能 等, 用 户 需 要 以 自 动 或 手 工 等 方 式 对 数 据 库 进 行 增 删 改, 数 据 库 收 缩, 数 据 库 属 性 选 项 的 修 改 等 有 效 的 管 理 3.3.1 打 开 数 据 库 当 用 户 登 录 SQ L Server 服 务 器, 连 接 上 SQ L Server 后, 用 户 需 要 连 接 上 SQ L Server 服 务 器 中 的 一 个 数 据 库, 才 能 使 用 该 数 据 库 中 的 数 据 如 果 用 户 没 有 预 先 指 定 连 接 哪 个 数 据 库,SQ L Server 会 自 动 替 用 户 连 上 master 系 统 数 据 库 一 般 地, 用 户 需 要 指 定 连 接 SQ L Server 服 务 器 中 的 哪 个 数 据 库, 或 者 从 一 个 数 据 库 切 换 至 另 一 个 数 据 库, 可 以 在 查 询 分 析 器 的 查 询 子 窗 口 利 用 use 命 令 来 打 开 或 切 换 至 不 同 的 数 据 库 打 开 或 切 换 数 据 库 的 命 令 数 据 如 下 : USE database_name 其 中 : database_name 表 示 想 打 开 或 切 换 的 数 据 库 名 称 3.3.2 增 加 和 缩 减 数 据 库 容 量 当 数 据 库 的 数 据 增 长 到 要 超 过 它 的 使 用 空 间 时, 必 须 加 大 数 据 库 的 容 量 增 加 数 据 库 容 量 就 是 给 它 提 供 额 外 的 设 备 空 间 如 果 指 派 给 某 数 据 库 过 多 的 设 备 空 间, 可 以 通 过 缩 减 数 据 库 容 量 来 减 少 设 备 空 间 的 浪 费 增 加 和 缩 减 数 据 库 容 量 的 方 法 一 般 有 两 种, 即 用 T ransact 唱 SQ L 命 令 和 利 用 企 业 管 理 器 来 增 缩 数 据 库 容 量
54 SQL Server 数 据 库 应 用 技 术 1. 在 查 询 分 析 器 中, 用 Transact 唱 SQL 语 句 增 缩 数 据 库 容 量 扩 增 数 据 库 语 句 格 式 : ALTER DATABASE database_name MODIFY FILE (NAME = file_name, SIZE = newsize ) 其 中 : 瞯 database_name : 想 扩 充 容 量 的 数 据 库 名 称 瞯 file_name : 需 要 增 加 容 量 的 数 据 库 文 件 瞯 new size : 为 数 据 库 文 件 指 定 新 的 容 量 尺 寸, 该 容 量 必 须 大 于 现 有 数 据 库 的 空 间 例 3.2 数 据 库 student 的 数 据 库 文 件 student.mdf 的 初 始 分 配 空 间 大 小 为 10MB, 现 在 想 将 其 大 小 扩 充 到 20MB, 则 具 体 语 句 如 下 : USE student GO ALTER DAT ABASE student MODIFY FILE (NAME = c :\Program Files\ Microsoft SQL Server\ MSSQL\Data\student.mdf, SIZE = 20MB ) 缩 减 数 据 库 一 般 通 过 执 行 DBCC S HRIN KDA T ABASE 命 令 来 完 成, 其 语 句 格 式 如 下 : DBCC SHRINKDATABASE (database_name[,new_size[, MASTEROVERRIDE ]]) 其 中 : database_name : 要 缩 减 的 数 据 库 名 称 new_size : 缩 减 数 据 库 后 剩 余 多 少 容 量, 假 如 不 指 定, 那 么 数 据 库 将 缩 减 至 最 小 的 容 量 例 3.3 将 student 数 据 库 的 空 间 缩 减 至 最 小 容 量 : USE student GO DBCC SHRINKDAT ABASE ( student ) 2. 用 企 业 管 理 器 来 增 缩 数 据 库 容 量 如 果 需 要 增 加 数 据 库 容 量, 如 图 3 唱 10 所 示 的 数 据 库 属 性 对 话 框 中, 通 过 选 择 数 据 文 件 或 事 务 日 志 标 签, 在 属 性 页 中 对 对 应 数 据 库 文 件 的 分 配 的 空 间 进 行 重 新 指 定, 如 图 3 唱 11 所 示, 单 击 确 定 按 钮 后 即 可 扩 充 数 据 库 容 量 注 意 : 重 新 指 定 的 数 据 库 分 配 空 间 必 须 大 于 现 有 空 间, 否 则 SQ L Server 会 报 错
第 3 章 数 据 库 及 其 管 理 55 图 3 唱 10 数 据 库 student 属 性 图 3 唱 11 数 据 库 文 件 的 分 配 空 间 扩 充 重 新 指 定 如 果 需 要 缩 减 数 据 库 容 量, 可 以 在 企 业 管 理 器 的 窗 口 里 选 择 student 数 据 库, 按 右 键 选 择 所 有 任 务 菜 单 下 的 子 菜 单 收 缩 数 据 库, 如 图 3 唱 12 所 示 在 弹 出 的 收 缩 数 据 库 对 话 框 中, 选 择 默 认 设 置, 单 击 确 定 按 钮, 数 据 库 将 收 缩 至 最 小 如 图 3 唱 13 所 示 如 果 单 击 收 缩 数 据 库 对 话 框 中 的 文 件 按 钮, 可 以 选 择 指 定 缩
56 SQL Server 数 据 库 应 用 技 术 图 3 唱 12 选 择 收 缩 数 据 库 菜 单 图 3 唱 13 收 缩 数 据 库 小 后 数 据 库 文 件 的 大 小, 如 图 3 唱 14 所 示 当 然 此 时 指 定 的 数 据 库 文 件 收 缩 后 的 尺 寸 大 小 必 须 比 现 有 数 据 库 文 件 尺 寸 小, 否 则 SQ L Server 会 报 错 3.3.3 查 看 目 前 数 据 库 选 项 设 定 及 修 改 设 定 数 据 库 选 项 可 以 控 制 数 据 库 是 否 为 单 用 户 使 用 模 式 或 db_ow ner 模 式 此 数 据 库 是 否 仅 可 读 取 数 据 等, 可 以 设 置 此 数 据 库 是 否 自 动 关 闭 自 动 收 缩 和 数 据 库 的 兼 容 级 别
第 3 章 数 据 库 及 其 管 理 57 图 3 唱 14 收 缩 数 据 库 文 件 大 小 等 选 项 如 果 想 查 看 目 前 数 据 库 选 项, 如 图 3 唱 15 所 示, 在 企 业 管 理 器 的 窗 口 里 单 击 数 据 库 student 的 属 性 菜 单, 然 后 在 弹 出 的 student 属 性 对 话 框 中 单 击 选 项 标 签, 在 这 里 可 以 查 看 和 修 改 数 据 库 选 项 设 定 图 3 唱 15 数 据 库 选 项 查 看 和 设 定
58 SQL Server 数 据 库 应 用 技 术 也 可 以 在 查 询 分 析 器 里 使 用 T ransact 唱 SQ L 命 令 来 查 看 和 更 改 数 据 库 选 项 一 般 使 用 sp_options 存 储 过 程 来 查 看 数 据 库 选 项, 其 语 句 格 式 如 下 : EXEC sp_dboption master 在 查 询 分 析 器 里 使 用 带 参 数 的 存 储 过 程 sp _ dboption 可 以 修 改 数 据 库 的 选 项 设 定 值 例 3.4 将 数 据 库 student 设 为 只 读 状 态 的 语 句 格 式 如 下 : EXEC sp_dboption student, read only,true 执 行 结 果 如 图 3 唱 16 所 示 3.3.4 数 据 库 更 名 图 3 唱 16 使 用 Transact 唱 SQL 命 令 查 看 数 据 库 选 项 设 定 通 常 情 况 下, 在 一 个 应 用 程 序 的 开 发 过 程 中, 往 往 需 要 改 变 数 据 库 的 名 称, 但 是 在 SQ L Server 中 更 改 数 据 库 名 称 并 不 像 在 Window s 中 那 样 简 单, 要 改 变 名 称 的 那 个 数 据 库 很 可 能 正 被 其 他 用 户 使 用, 所 以 变 更 数 据 库 名 称 的 操 作 必 须 在 单 用 户 模 式 下 方 可 进 行, 然 后 使 用 系 统 存 储 过 程 sp_renamedb 来 更 改 数 据 库 的 名 称 例 3.5 将 数 据 库 student 更 名 为 pupil, 可 按 下 列 步 骤 进 行 操 作 : (1) 将 student 数 据 库 设 置 为 单 用 户 模 式 打 开 企 业 管 理 器 窗 口, 单 击 服 务 器, 展 开 数 据 库 项, 右 击 student 数 据 库, 选 择 属 性 选 项, 打 开 student 属 性 对 话 框, 单 击 选 项 标 签, 选 中 存 取 项 目 中 的 单 用 户 复 选 框, 单 击 确 定 按 钮 (2) 执 行 sp_renamedb 存 储 过 程 进 行 更 名 操 作 打 开 SQ L 查 询 分 析 器 窗 口, 输 入 如 下 语 句 :
第 3 章 数 据 库 及 其 管 理 59 EXEC sp_renamedb student, pupil 然 后, 单 击 执 行 查 询 ( 绿 色 箭 头 ) 图 标 或 按 F5 键, 执 行 该 SQ L 语 句 (3) 重 复 第 (1) 步 操 作, 取 消 选 中 单 用 户 复 选 框 这 样, 把 数 据 库 student 更 名 为 pupil 的 操 作 就 完 成 了 另 外, 还 可 以 直 接 使 用 SQ L 查 询 分 析 器 进 行 操 作, 首 先 打 开 SQ L 查 询 分 析 器 窗 口, 输 入 下 列 语 句 : EXEC sp_dboption pupil, single user, ture EXEC sp_renamedb pupil, student EXEC sp_dboption student, single user, false 然 后, 单 击 工 具 栏 上 的 执 行 查 询 ( 绿 色 箭 头 ) 图 标 或 按 F5 键, 执 行 该 SQ L 语 句, 更 名 操 作 就 完 成 了 3.3.5 删 除 数 据 库 删 除 数 据 库 比 较 简 单, 但 是 应 该 注 意 的 是, 如 果 删 除 某 个 正 在 使 用 的 数 据 库 时, 则 无 法 对 该 数 据 库 进 行 删 除 可 以 使 用 DROP DA T ABASE 语 句 格 式 来 删 除 某 个 数 据 库 例 3.6 删 除 名 为 student 的 数 据 库 DROP DAT ABASE student 执 行 完 毕 后,SQ L Server 将 返 回 该 数 据 库 的 数 据 文 件 和 日 志 文 件 均 被 删 除 的 信 息 另 外, 也 可 以 在 企 业 管 理 器 中 用 鼠 标 右 键 选 择 所 要 删 除 的 数 据 库 名 字, 单 击 弹 出 子 菜 单 上 的 删 除 菜 单 项 即 可 完 成 数 据 库 的 删 除 操 作 如 图 3 唱 17 所 示 图 3 唱 17 删 除 数 据 库
60 SQL Server 数 据 库 应 用 技 术 实 训 1. 实 训 目 的 (1) 了 解 系 统 数 据 库 的 作 用 (2) 学 会 使 用 企 业 管 理 器 创 建 用 户 数 据 库 (3) 学 会 使 用 查 询 分 析 器 创 建 用 户 数 据 库 (4) 学 会 压 缩 和 扩 充 数 据 库 (5) 学 会 查 看 和 修 改 数 据 库 选 项 (6) 学 会 给 数 据 库 改 名 和 删 除 数 据 库 2. 实 训 的 知 识 准 备 在 SQ L Server 2000 中, 既 可 以 使 用 企 业 管 理 器 来 创 建 数 据 库, 也 可 以 在 查 询 分 析 器 中 编 写 SQ L 语 句 代 码, 来 创 建 数 据 库 创 建 时 首 先 要 明 确, 能 够 创 建 数 据 库 的 用 户 必 须 是 系 统 管 理 员 或 是 被 授 权 使 用 CREA T E DA T ABASE 语 句 的 用 户 ; 其 次 创 建 数 据 库 必 须 要 确 定 数 据 库 名 称 的 定 义, 包 括 数 据 文 件 和 日 志 文 件 的 逻 辑 名 称 物 理 名 称 ; 数 据 库 初 始 大 小 增 长 方 式 最 大 尺 寸 3. 实 训 内 容 和 步 骤 (1) 分 别 使 用 企 业 管 理 器 和 查 询 分 析 器 创 建 一 个 数 据 库 数 据 库 名 称 为 student, 主 数 据 文 件 的 逻 辑 名 称 为 student_data, 操 作 系 统 文 件 的 名 称 为 D : \mssql\data\student_ mdf, 大 小 为 20MB, 最 大 为 50MB, 以 25 % 的 速 度 增 长 数 据 库 的 日 志 文 件 逻 辑 名 称 为 student_log, 操 作 系 统 文 件 的 名 称 为 d : \ mssql\data\student_ldf, 大 小 为 3MB, 最 大 为 10MB, 以 1MB 的 速 度 增 长 1 用 向 导 方 式 创 建 数 据 库 开 始 程 序 Microsoft SQ L Server 企 业 管 理 器 工 具 向 导 数 据 库 创 建 数 据 库 向 导 命 名 数 据 库 并 指 定 它 的 位 置 命 名 数 据 库 文 件, 指 定 文 件 的 初 始 大 小 定 义 数 据 库 文 件 的 增 长 命 名 事 务 日 志 文 件, 指 定 文 件 的 初 始 大 小 定 义 事 务 日 志 的 增 长 完 成 2 直 接 右 击 数 据 库 方 式 开 始 程 序 Microsoft SQ L Server 企 业 管 理 器 数 据 库 单 击 右 键 选 定 新 建 数 据 库 命 名 数 据 库 并 指 定 它 的 位 置 命 名 数 据 库 文 件, 指 定 文 件 的 初 始 大 小 定 义 数 据 库 文 件 的 增 长 命 名 事 务 日 志 文 件, 指 定 文 件 的 初 始 大 小 定 义 事 务 日 志 的 增 长 完 成 3 参 考 T ransact 唱 SQ L 命 令 如 下 : CREATE DAT ABASE student ON PRIMARY (NAME = student_data, FILENA ME = d :\mssql\data\student.mdf,
第 3 章 数 据 库 及 其 管 理 61 SIZE =, MAXSIZE =, FILEGROWT H = ) LOG ON (NAME = student_log, FILENA ME = d :\mssql\data\student.ldf, SIZE =, MAXSIZE =, FILEGROWT H = ) (2) 分 别 使 用 企 业 管 理 器 和 查 询 分 析 器 将 数 据 库 student 的 初 始 分 配 空 间 大 小 扩 充 到 40MB 参 考 T ransact 唱 SQ L 命 令 如 下 : USE student GO ALTER DAT ABASE student MODIFY FILE (NAME = student.mdf, SIZE = ) (3) 分 别 使 用 企 业 管 理 器 和 查 询 分 析 器 将 student 数 据 库 的 空 间 压 缩 至 最 小 容 量 参 考 T ransact 唱 SQ L 命 令 如 下 : USE student GO DBCC SHRINKDAT ABASE ( ) (4) 分 别 使 用 企 业 管 理 器 和 查 询 分 析 器 将 student 数 据 库 重 新 设 置 为 只 读 状 态 参 考 T ransact 唱 SQ L 命 令 如 下 : EXEC sp_dboption student,,true (5) 分 别 使 用 企 业 管 理 器 和 查 询 分 析 器 将 student 数 据 库 改 名 为 scholastic 参 考 T ransact 唱 SQ L 命 令 如 下 : EXEC sp_dboption student, single user, EXEC student, scholastic EXEC sp_dboption pupil, single user, (6) 分 别 使 用 企 业 管 理 器 和 查 询 分 析 器 删 除 scholastic 数 据 库 参 考 T ransact 唱 SQ L 命 令 如 下 : scholastic
62 SQL Server 数 据 库 应 用 技 术 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 关 系 型 数 据 库 是 以 什 么 形 式 来 存 储 数 据 的? (2) SQ L Server 中 包 含 了 哪 两 种 类 型 的 数 据 库? (3) 系 统 数 据 库 有 哪 些? 它 们 各 自 的 功 能 是 什 么? (4) 创 建 用 户 数 据 库 的 方 法 有 哪 些? 具 体 操 作 步 骤 是 什 么? (5) 试 说 明 创 建 一 个 用 户 数 据 库 的 语 句 格 式 中 各 个 选 项 的 含 义 (6) 什 么 是 事 务? 事 务 日 志 有 什 么 用 处? 2. 请 在 空 白 处 填 写 最 适 合 的 内 容, 以 完 善 下 列 语 句 (1) 创 建 一 个 名 为 company 的 用 户 数 据 库 其 数 据 文 件 的 初 始 大 小 为 10MB, 无 最 大 限 制, 以 10 % 的 速 度 增 长 日 志 文 件 的 初 始 大 小 为 1MB, 最 大 为 5MB, 以 1MB 的 速 度 增 长 CREATE DAT ABASE company ON PRIMARY (NAME = company_data,filename = d :\mssql\data\company.mdf, SIZE =, MAXSIZE =, FILEGROWT H = ) LOG ON (NAME = company_log,filename = d :\mssql\data\company.ldf, SIZE =, MAXSIZE =, FILEGROWT H = ) (2) 将 company 数 据 库 设 置 为 只 读 状 态 EXEC sp_dboption company,,false (3) 将 数 据 库 company 的 初 始 分 配 空 间 大 小 扩 充 到 20MB ALTER DAT ABASE company MODIFY FILE (NAME company_data, SIZE = ) (4) 给 company 用 户 数 据 库 改 名 为 corporation EXEC sp_dboption company, single user, EXEC company, corporation EXEC sp_dboption corporation, single user,
第 3 章 数 据 库 及 其 管 理 63 (5) 将 corporation 数 据 库 的 空 间 压 缩 至 最 小 容 量 ( corporation ) (6) 删 除 scholastic 数 据 库 corporation
第 4 章 数 据 库 中 表 的 基 本 操 作 从 前 面 的 章 节 中, 可 以 已 经 知 道 数 据 库 由 数 据 和 对 象 组 成 一 般 而 言, 数 据 库 中 存 储 有 数 据, 但 是 正 确 高 效 地 组 织 显 示 和 使 用 存 放 在 数 据 库 中 的 数 据, 就 需 要 一 系 列 的 数 据 库 对 象 来 完 成 此 重 要 任 务 常 见 的 数 据 库 对 象 包 括 数 据 表 约 束 规 则 视 图 存 储 过 程 触 发 器 等 本 章 首 先 简 要 介 绍 有 关 的 数 据 库 对 象, 然 后 详 细 介 绍 数 据 表 约 束 默 认 和 规 则 四 个 数 据 库 对 象 的 使 用, 其 他 的 数 据 库 对 象 将 在 后 续 章 节 里 一 一 介 绍 4.1 数 据 库 对 象 4.1.1 数 据 表 创 建 了 用 户 数 据 库 之 后, 接 下 来 的 工 作 就 是 创 建 数 据 表 因 为 要 使 用 数 据 库 就 需 要 数 据 库 中 有 种 对 象 能 够 存 储 用 户 输 入 的 各 种 数 据, 以 后 使 用 数 据 库 完 成 各 种 应 用 也 是 在 数 据 表 的 基 础 上 完 成 的 所 以 数 据 表 是 数 据 库 中 最 重 要 的 对 象 数 据 表 被 定 义 为 列 的 集 合 它 与 电 子 表 格 类 似, 数 据 在 表 中 是 按 照 行 和 列 的 格 式 来 组 织 排 列 的 每 行 代 表 一 个 惟 一 的 记 录, 每 列 代 表 记 录 中 的 一 个 域 例 如 一 个 包 含 学 生 基 本 信 息 的 数 据 表, 表 中 的 每 一 行 代 表 一 个 学 生, 每 一 列 分 别 表 示 学 生 的 详 细 资 料, 如 学 号 姓 名 专 业 班 级 等 如 图 4 唱 1 所 示 为 student 数 据 库 中 的 学 生 基 本 信 息 表 stu_info 图 4 唱 1 数 据 表 SQ L Server 中 每 个 数 据 库 最 多 可 储 存 20 亿 个 数 据 表, 每 个 表 可 以 有 1024 列, 每 行 最 多 可 以 存 储 8060 字 节 SQ L Server 中 有 两 种 表 : 永 久 表 和 临 时 表 永 久 表 在 创 建 后
第 4 章 数 据 库 中 表 的 基 本 操 作 65 一 直 存 储 在 数 据 库 文 件 中, 除 非 用 户 删 除 该 表 ; 临 时 表 系 统 运 行 过 程 中 由 系 统 创 建, 一 旦 用 户 退 出 或 系 统 修 复 时, 临 时 表 将 被 自 动 删 除 4.1.2 约 束 现 在 已 经 了 解 了 创 建 用 户 数 据 库 和 在 数 据 库 中 创 建 表 以 存 储 数 据 读 者 自 然 会 知 道 数 据 库 中 的 数 据 是 现 实 世 界 的 反 映, 各 个 数 据 之 间 有 一 定 的 联 系 和 存 在 规 则, 如 学 生 的 学 号 必 须 是 惟 一 的, 学 生 姓 名 可 能 相 同 但 学 号 一 定 不 一 样 ; 每 个 学 生 的 性 别 只 能 是 男 和 女 中 的 一 种 取 值, 不 可 能 有 其 他 的 取 值 存 在 类 似 的 例 子 有 许 多, 这 也 说 明 一 个 问 题, 一 个 成 功 的 数 据 库 系 统 必 须 能 够 保 证 上 述 现 实 情 况 的 实 现 所 以 在 学 习 约 束 这 种 数 据 库 对 象 之 前, 有 必 要 先 学 习 数 据 完 整 性 知 识 什 么 是 数 据 完 整 性 呢? 它 就 是 指 存 储 在 数 据 库 中 数 据 的 一 致 性 和 正 确 性 为 了 保 证 数 据 完 整 性,SQ L Server 提 供 了 定 义 检 查 和 控 制 数 据 完 整 性 的 机 制 根 据 数 据 完 整 性 措 施 所 作 用 的 数 据 库 对 象 和 范 围 不 同, 数 据 完 整 性 分 为 : 实 体 完 整 性 域 完 整 性 参 照 完 整 性 和 用 户 定 义 完 整 性 四 种 实 体 完 整 性 也 成 为 行 完 整 性, 是 将 行 定 义 为 特 定 表 的 惟 一 实 体 简 而 言 之, 表 的 所 有 记 录 在 某 一 列 上 必 须 取 值 惟 一 如 记 录 有 多 个 学 生 信 息 的 表, 表 中 学 号 那 个 列 对 应 的 值 每 一 行 都 不 相 同, 否 则 没 有 一 个 列 来 区 分 每 一 行, 这 将 造 成 学 生 信 息 管 理 的 混 乱 域 完 整 性 也 称 列 完 整 性, 用 以 指 定 列 的 数 据 输 入 是 否 具 有 正 确 的 数 据 类 型 格 式 以 及 有 效 的 数 据 范 围 如 学 生 每 门 课 程 的 考 试 成 绩 必 定 是 一 个 不 大 于 100 的 正 数 值, 如 果 表 中 存 在 一 个 小 于 0 的 学 生 成 绩, 则 没 有 意 义 参 照 完 整 性 是 保 证 参 照 表 与 被 参 照 表 中 数 据 的 一 致 性 例 如, 学 生 基 本 信 息 表 中 有 学 生 的 学 号 且 学 生 成 绩 表 中 也 有 学 号 这 个 列, 那 么 两 个 表 中 的 学 号 值 必 须 一 致, 如 果 输 入 过 程 中 出 现 错 误 且 又 没 有 被 系 统 检 查 出 来, 数 据 之 间 就 造 成 混 乱 用 户 定 义 完 整 性 允 许 用 户 定 义 不 属 于 其 他 任 何 完 整 性 分 类 的 特 定 规 则 所 有 的 完 整 性 类 型 都 支 持 用 户 定 义 完 整 性 由 此 可 见, 保 证 数 据 完 整 性 在 数 据 库 管 理 系 统 中 十 分 重 要 数 据 库 系 统 中 必 须 有 些 措 施 来 防 止 数 据 混 乱 的 产 生 建 立 和 使 用 约 束 的 目 的 就 是 保 证 数 据 的 完 整 性 约 束 是 SQ L Server 强 制 实 行 的 应 用 规 则, 它 通 过 限 制 列 行 和 表 之 间 数 据 来 保 证 数 据 完 整 性 约 束 是 种 对 象, 它 可 以 加 到 表 上 以 限 制 列 行 和 表 间 的 数 据 当 表 删 除 时, 表 所 带 的 约 束 也 随 之 被 删 除 约 束 包 括 CHECK 约 束 PRIM ARY KEY 约 束 FOREIGN KEY 约 束 U NIQ UE 约 束 和 DEFA U L T 约 束 等, 这 些 内 容 将 在 4.3 节 中 介 绍 4.1.3 默 认 当 向 数 据 表 中 输 入 数 值 时, 希 望 表 里 面 的 某 些 列 已 经 具 有 一 些 默 认 值, 不 必 用 户 一 一 输 入, 或 者 是 用 户 现 在 还 不 准 备 输 入 但 又 不 想 空 着 例 如, 输 入 学 生 性 别 的 时 候, 先 默 认 所 有 学 生 的 性 别 为 男, 如 果 输 入 的 是 个 男 生 则 性 别 列 不 必 每 次 输 入 了, 如 果 是 女 生 就 将 男 改 为 女, 这 样 大 大 减 少 输 入 数 据 的 工 作 量 又 如 输 入 一 个 班 的 课 程 信 息, 由 于 全 班 同 学 在 一 个 教 室 上 课, 那 么 设 定 教 室 为 一 个 默 认 值, 则 每 个 同 学 的 上 课 教 室 就 不 必 输 入 了
66 SQL Server 数 据 库 应 用 技 术 默 认 是 实 现 上 述 目 的 的 一 种 数 据 库 对 象, 可 以 先 定 义 好, 需 要 时 将 它 绑 定 到 一 列 或 多 列 上 在 表 中 插 入 数 据 行 时, 系 统 自 动 为 没 有 指 定 数 据 的 列 提 供 事 先 定 义 的 默 认 值 4.1.4 规 则 有 时 会 遇 到 这 种 情 况 : 一 个 班 的 学 生 学 号 往 往 是 一 段 连 续 的 正 整 数, 而 设 计 的 表 被 其 他 用 户 输 入 学 号 值 时 必 须 要 有 效 而 不 能 是 超 出 此 范 围 的 无 效 值 ; 还 有 学 生 的 身 份 证 号 码 长 度 要 么 是 15 位 要 么 是 18 位, 不 可 能 是 其 他 位 数 长 度 的 数 值, 如 果 用 户 输 入 的 身 份 证 号 码 长 度 不 是 这 样 就 应 改 提 醒 用 户 数 值 输 入 有 误 规 则 这 种 数 据 库 对 象 的 作 用 就 是 当 向 表 中 插 入 数 据 时, 指 定 该 列 接 受 数 据 值 的 范 围 规 则 与 默 认 一 样 在 数 据 库 中 只 需 定 义 一 次, 就 可 以 被 多 次 应 用 于 任 意 表 中 的 一 列 或 多 列 上 4.1.5 视 图 可 以 从 现 实 情 况 来 了 解 视 图 这 种 数 据 库 对 象 一 般 地, 一 个 学 生 在 一 个 学 期 要 上 多 门 课 程, 这 些 课 程 的 成 绩 存 储 在 多 张 数 据 表 里 面, 班 主 任 想 了 解 班 上 同 学 的 学 习 成 绩, 需 要 打 开 一 张 张 的 表 来 看 能 否 将 存 储 在 多 张 表 中 的 课 程 成 绩 汇 总 在 一 张 新 表 上, 这 张 新 表 又 需 要 不 重 新 创 建 呢? 答 案 是 肯 定 的 因 为 课 程 成 绩 已 经 记 录 在 单 科 课 程 表 上, 只 要 提 取 其 数 据 就 可 以 汇 总 成 一 张 新 表, 这 样 就 可 以 避 免 数 据 多 存 储 一 遍, 即 数 据 冗 余 另 外 还 有 一 种 情 况 : 班 主 任 上 教 务 科 查 询 本 班 学 生 情 况, 但 教 务 科 数 据 库 中 记 录 的 是 全 校 的 学 生 信 息, 显 然 班 主 任 只 对 本 班 学 生 感 兴 趣, 但 全 校 的 学 生 却 都 在 一 张 表 上, 查 找 起 来 十 分 困 难 而 数 据 库 中 有 了 视 图 这 种 对 象, 上 述 问 题 迎 刃 而 解 视 图 是 从 一 个 或 多 个 相 关 联 表 中 派 生 出 来 的, 常 用 于 集 中 简 化 和 定 制 显 示 数 据 库 中 的 信 息 它 限 制 了 用 户 所 能 看 到 和 修 改 的 数 据, 视 图 像 一 个 过 滤 器, 对 于 一 个 或 多 个 基 表 中 的 数 据 进 行 筛 选 和 引 用 如 上 述 问 题 中 从 各 科 成 绩 表 中 将 本 班 学 生 的 成 绩 筛 选 出 来 做 成 一 张 视 图, 以 后 班 主 任 直 接 看 这 个 视 图, 而 不 必 一 张 张 地 查 询 所 有 表 就 可 以 查 询 到 本 班 学 生 的 成 绩 将 表 中 班 主 任 感 兴 趣 的 数 据 抽 取 出 来 做 成 一 张 视 图, 这 样 班 主 任 就 只 能 看 到 本 班 学 生 的 成 绩 而 看 不 到 其 他 班 学 生 的 成 绩 这 在 一 定 程 度 上 可 以 保 证 数 据 的 安 全 性 概 括 地 说, 视 图 是 一 种 虚 拟 表, 它 不 是 数 据 库 中 的 实 际 存 在 的 表, 其 内 容 来 自 于 其 他 一 些 基 表 ( 理 解 这 一 点 尤 其 重 要 ) 但 它 与 实 际 的 表 格 在 形 式 上 相 同, 每 个 视 图 都 含 有 列 名 与 记 录 视 图 并 不 存 储 数 据, 因 为 它 是 虚 拟 表, 视 图 中 的 数 据 实 际 上 是 对 组 成 视 图 的 基 表 内 存 储 数 据 的 引 用, 它 来 自 于 组 成 视 图 的 多 张 基 本 表 视 图 着 重 于 特 定 数 据, 可 以 简 化 数 据 操 作 以 及 组 合 区 分 数 据 有 关 视 图 的 创 建 修 改 等 操 作 将 在 第 8 章 中 加 以 介 绍 4.1.6 存 储 过 程 从 前 面 章 节 的 知 识 中 可 以 知 道, 许 多 种 数 据 库 操 作, 如 创 建 数 据 库 创 建 数 据 表 修 改 数 据 库 属 性 等 操 作 既 可 以 在 企 业 管 理 器 中 完 成, 也 可 以 在 查 询 分 析 器 中 编 写 T ransact 唱 SQ L 语 句 命 令 来 完 成 其 实,SQ L Server 中 所 有 的 有 关 数 据 库 ( 包 括 数 据 库 对 象 ) 的 操 作 均 能 编 写 T ransact 唱 SQ L 命 令 语 句, 在 查 询 分 析 器 中 运 行 由 此, 我 们 头 脑 中 自 然 会 想 到, 能 否 将 一 些 T ransact 唱 SQ L 命 令 语 句 打 包 成 一 个 数 据
第 4 章 数 据 库 中 表 的 基 本 操 作 67 库 对 象 并 存 储 在 SQ L Server 服 务 器 上, 等 到 需 要 完 成 这 些 T ransact 唱 SQ L 语 句 的 功 能 时 就 触 发 该 数 据 库 对 象 来 完 成 这 些 工 作 这 样 做 的 好 处 是 不 必 每 次 在 查 询 分 析 器 的 窗 口 中 重 复 编 写 T ransact 唱 SQ L 语 句, 而 是 编 写 了 一 次, 想 什 么 时 候 运 行 就 运 行 另 外 运 行 速 度 可 大 大 加 快 存 储 过 程 就 是 这 样 一 种 数 据 库 对 象, 它 是 存 放 在 服 务 器 上 的 预 先 编 译 好 的 T ransact 唱 SQ L 语 句, 它 在 第 一 次 运 行 时 进 行 语 法 检 查 和 编 译, 编 译 好 的 存 储 过 程 在 计 算 机 的 高 速 缓 存 中 用 于 后 续 调 用, 这 样 执 行 存 储 过 程 迅 速 而 高 效 存 储 过 程 由 应 用 程 序 激 活, 而 不 是 由 SQ L Server 自 动 执 行 存 储 过 程 除 了 执 行 迅 速 高 效 的 特 点 外, 还 可 用 于 安 全 机 制, 用 户 可 以 被 授 权 执 行 某 些 存 储 过 程 若 要 改 变 业 务 规 则 或 策 略, 只 需 改 写 存 储 过 程 的 语 句 再 编 译 即 可 SQ L Server 中 的 存 储 过 程 有 两 类 : 系 统 提 供 的 存 储 过 程 和 用 户 定 义 的 存 储 过 程 系 统 提 供 的 存 储 过 程 是 系 统 已 经 编 译 好 的 存 储 过 程, 用 户 不 能 修 改, 主 要 为 数 据 库 系 统 管 理 员 管 理 SQ L Server 提 供 支 持 用 户 自 定 义 存 储 过 程 是 由 用 户 创 建 并 能 完 成 某 一 特 定 功 能 ( 如 查 询 用 户 所 需 的 数 据 信 息 ) 的 存 储 过 程 4.1.7 触 发 器 4.1.6 节 中 简 要 介 绍 了 存 储 过 程 这 个 对 象 的 概 念 和 功 能 存 储 过 程 的 运 行 不 是 自 动 运 行, 而 是 由 应 用 程 序 激 发 运 行 这 里 将 要 讲 到 的 对 象 触 发 器, 它 是 一 种 能 够 自 动 运 行 的 SQ L Server 对 象, 由 预 先 设 定 的 条 件 触 发 当 用 户 在 操 作 数 据 表 中 的 数 据 时, 系 统 管 理 员 或 应 用 程 序 开 发 人 员 有 时 要 防 止 用 户 对 某 些 数 据 的 修 改 和 删 除, 以 避 免 出 现 对 数 据 进 行 不 一 致 或 不 正 确 的 修 改 如 果 系 统 里 面 有 编 译 好 的 触 发 器, 一 旦 用 户 对 某 些 数 据 进 行 修 改 或 删 除 操 作, 事 先 设 定 的 条 件 被 满 足 就 触 发 触 发 器 的 运 行, 要 么 是 弹 出 一 些 对 话 框 告 诉 用 户 正 在 对 数 据 进 行 非 法 操 作, 要 么 是 此 处 数 据 的 更 新 引 起 其 他 记 录 或 其 他 表 中 的 数 据 的 同 步 变 化, 从 而 避 免 出 现 数 据 不 一 致 和 不 正 确 的 混 乱 现 象 触 发 器 这 种 数 据 库 对 象 的 主 要 作 用 就 是 可 以 像 存 储 过 程 那 样 包 含 复 杂 的 处 理 逻 辑, 实 现 约 束 规 则 等 不 能 实 现 的 复 杂 的 数 据 完 整 性 和 一 致 性, 并 且 由 逻 辑 条 件 触 发 而 自 动 执 行 触 发 器 就 像 一 个 监 视 器 一 样 时 刻 监 视 着 用 户 的 数 据 操 作, 一 旦 用 户 对 数 据 的 操 作 满 足 预 先 设 定 的 条 件, 就 立 即 触 发 一 定 的 操 作 有 关 存 储 过 程 和 触 发 器 的 创 建 修 改 等 操 作 将 在 第 9 章 中 加 以 介 绍 4.2 数 据 表 的 设 计 和 创 建 4.2.1 SQL Server 中 的 数 据 类 型 在 创 建 表 的 时 候, 涉 及 数 据 表 结 构 的 重 要 问 题, 也 就 是 牵 涉 到 确 定 数 据 表 中 各 列 数 据 的 格 式, 是 数 值 字 符 日 期 还 是 货 币 图 像 等 其 他 格 式 的 数 据 因 为 只 有 设 计 好 了 数 据 表 中 各 列 应 该 填 写 什 么 格 式 的 数 据, 系 统 才 会 在 磁 盘 上 开 辟 相 应 的 空 间, 用 户 才 能 向 表 中 填 写 数 据 因 此 在 讲 述 数 据 表 的 操 作 前 必 须 重 点 介 绍 SQ L Server 的 数 据 类 型
68 SQL Server 数 据 库 应 用 技 术 在 SQ L Server 数 据 表 中, 列 的 数 据 类 型 既 可 以 是 系 统 提 供 的 数 据 类 型, 也 可 以 是 用 户 自 定 义 的 数 据 类 型 SQ L Server 系 统 提 供 了 丰 富 的 数 据 类 型 如 表 4 唱 1 所 示 bigint 表 4 唱 1 SQL Server 所 支 持 的 数 据 类 型 数 据 类 型 说 明 - 2 63 ( - 922337203685477.5808) ~ 2 63-1( + 922337203685477.5807) 的 整 型 数 据 ( 所 有 数 字 ) int - 2 31 ( - 2147483648) ~ 2 31-1(2147483647) 的 整 型 数 据 ( 所 有 数 字 ) smallint tinyint bit decimal numeric 从 - 2 15 ( - 32768) 到 2 15-1(32767) 的 整 数 数 据 从 0 到 255 的 整 数 数 据 1 或 0 的 整 数 数 据 - 10 38 + 1 到 10 38-1 的 固 定 精 度 和 小 数 位 的 数 字 数 据 功 能 上 等 同 于 decimal money 货 币 数 据 值 介 于 - 2 63 与 2 63-1 之 间, 精 确 到 货 币 单 位 的 1 % smallmoney 货 币 数 据 值 介 于 - 214748.3648 与 + 214748.3647 之 间, 精 确 到 货 币 单 位 的 1 % float real - 1.79E + 308 ~ 1.79E + 308 的 浮 点 精 度 数 字 - 3.40E + 38 ~ 3.40E + 38 的 浮 点 精 度 数 字 datetime 1753 年 1 月 1 日 ~ 9999 年 12 月 31 日 的 日 期 和 时 间 数 据, 精 确 到 3 % s( 或 3.33 毫 秒 ) smalldatetime char varchar text nchar nvarchar ntext binary varbinary image cursor sql_variant table timestamp uniqueidentifier 1900 年 1 月 1 日 ~ 2079 年 6 月 6 日 的 日 期 和 时 间 数 据, 精 确 到 分 钟 固 定 长 度 的 非 Unicode 字 符 数 据, 最 大 长 度 为 8000 个 字 符 可 变 长 度 的 非 Unicode 数 据, 最 长 为 8000 个 字 符 可 变 长 度 的 非 Unicode 数 据, 最 大 长 度 为 2 31-1(2147483647) 个 字 符 固 定 长 度 的 Unicode 数 据, 最 大 长 度 为 4000 个 字 符 可 变 长 度 Unicode 数 据, 其 最 大 长 度 为 4000 字 符 可 变 长 度 Unicode 数 据, 其 最 大 长 度 为 2 30-1(1073741823) 个 字 符 固 定 长 度 的 二 进 制 数 据, 其 最 大 长 度 为 8000 个 字 节 可 变 长 度 的 二 进 制 数 据, 其 最 大 长 度 为 8000 个 字 节 可 变 长 度 的 二 进 制 数 据, 其 最 大 长 度 为 2 31-1(2147483647) 个 字 节 游 标 的 引 用 一 种 存 储 SQL Server 支 持 的 各 种 数 据 类 型 (text ntext timestamp 和 sql_variant 除 外 ) 值 的 数 据 类 型 一 种 特 殊 的 数 据 类 型, 存 储 供 以 后 处 理 的 结 果 集 数 据 库 范 围 的 惟 一 数 字, 每 次 更 新 行 时 也 进 行 更 新 全 局 惟 一 标 识 符 (GUID) 1.SQL Server 所 支 持 的 数 据 类 型 变 量 或 列 的 数 据 类 型 定 义 了 每 一 变 量 或 列 可 以 接 受 的 数 据 值 也 就 是 说, 一 个 数 据 类 型 指 定 变 量 或 列 所 占 用 的 内 存 空 间, 也 决 定 访 问 显 示 更 新 数 据 的 方 法 表 4 唱 1 列 出 了 SQ L Server 所 支 持 的 数 据 类 型 SQ L Server 中 的 每 个 列 本 地 变 量 表 达 式 和 参 数 都 有 一 个 相 关 的 数 据 类 型, 一 般 情 况 下,SQ L Server 提 供 的 基 本 数 据 类 型 主 要 用 于 定 义 内 存 单 元 的 数 量, 以 便 指 定 信 息 大 小 和 存 储 格 式 的 类 型, 存 储 列 的 格 式, 存 储 过 程 参 数 和 本 地 变 量
2.SQL Server 第 4 章 数 据 库 中 表 的 基 本 操 作
70 SQL Server 数 据 库 应 用 技 术 (3) 二 进 制 型 二 进 制 型 数 据 是 指 字 符 串 是 由 二 进 制 值 组 成, 而 不 是 由 字 符 组 成, 该 类 型 通 常 用 于 时 间 标 记 (timestamp) 和 image 类 型 对 于 二 进 制 型 数 据 的 存 储 来 说,SQ L Server 提 供 了 三 种 数 据 类 型 : binary varbinary 和 image 其 中 binary 用 于 存 储 长 度 固 定 的 二 进 制 字 符 串 ;varbinary 用 于 存 储 长 度 可 变 的 二 进 制 字 符 串 ;image 用 于 存 储 大 的 二 进 制 字 符 串 ( 每 行 可 达 2GB) binary 型 数 据 类 似 于 字 符 型 数 据, 当 实 际 的 字 符 串 长 度 小 于 给 定 长 度 时,binary 类 型 会 在 实 际 的 字 符 串 尾 部 添 加 0, 而 不 是 空 格 (4) 整 型 和 精 确 数 值 型 SQ L Server 2000 提 供 的 整 型 和 精 确 数 值 型 类 型 有 : bit int smallint tinyint 和 decimal numeric 其 中 最 常 用 的 就 是 int 和 numeric 类 型 int 类 型 是 指 取 值 范 围 在 - 2147483648 到 2147483647 之 间 的 整 数 ;numeric 类 型 则 是 指 十 进 制 数 另 外,bit 数 据 类 型 可 用 于 存 储 逻 辑 数 据, 可 用 作 状 态 标 志 位, 它 只 存 储 1 或 者 0 并 且 该 类 型 的 列 不 允 许 为 空 值 不 允 许 建 立 索 引 几 个 bit 列 可 占 用 同 一 字 节 (5) 浮 点 型 SQ L Server 2000 提 供 了 float 和 real 类 型 来 表 示 浮 点 数 据 类 型 和 实 型 数 据 其 中 float 型 数 据 的 取 值 范 围 是 - 1.79E + 308 到 1.79E + 308 ;real 型 数 据 的 取 值 范 围 是 - 3.40E + 38 到 3.40E + 38 real 类 型 存 储 在 4 个 字 节 中, 可 以 在 real 数 据 类 型 中 存 储 正 的 或 者 负 的 十 进 制 数 值 ; 如 果 不 指 定 float 数 据 类 型 的 长 度, 它 会 被 存 储 在 8 个 字 节 中 用 户 可 以 指 定 float 型 数 值 的 长 度, 当 指 定 为 1 到 7 之 间 的 数 值 时, 则 实 际 上 定 义 了 一 个 real 数 据 类 型 (6) 日 期 型 SQ L Server 2000 可 以 用 datetime 和 smalldatetime 数 据 类 型 来 存 储 日 期 和 时 间 数 据 其 中,smalldatetime 的 精 度 较 低, 包 含 的 日 期 范 围 也 较 窄, 但 占 用 的 空 间 小 datetime 型 数 据 类 型 的 取 值 范 围 是 1753 年 1 月 1 日 到 9999 年 12 月 31 日, 可 以 省 略 datetime 的 部 分 值, 但 如 果 全 部 省 略, 则 默 认 的 取 值 为 1900,1,1,12 :00 :00 :00A M 如 果 省 略 的 是 时 间 部 分, 默 认 值 为 12 :00 :00 :00 如 果 省 略 的 是 日 期 部 分, 则 默 认 值 为 1,1,1900 smalldatetime 型 数 据 类 型 的 取 值 范 围 是 1900 年 1 月 1 日 到 2079 年 6 月 6 日, 它 的 精 度 小 于 datetime 类 型 用 户 输 入 的 datetime 与 smalldatetime 类 型 数 据 格 式 完 全 相 同 默 认 情 况 下, 日 期 型 数 据 的 格 式 是 按 照 月 / 日 / 年 的 顺 序 来 设 定 的 (7) Unicode 字 符 串 数 据 类 型 SQ L Server 2000 提 供 了 三 种 Unicode 字 符 串 数 据 类 型 : nchar nvarchar 和 ntext SQ L Server Unicode 数 据 类 型 是 基 于 SQ L 唱 92 标 准 中 的 National Character 数 据 类 型 的 SQ L 唱 92 使 用 前 缀 字 符 n 来 表 示 这 些 数 据 类 型 和 值 使 用 Unicode 数 据 类 型, 一 个 列 可 以 存 储 由 Unicode 标 准 所 定 义 的 任 何 字 符, 该 字 符 包 括 各 种 字 符 集 中 所 定 义 的 所 有 字 符
第 4 章 数 据 库 中 表 的 基 本 操 作 71 其 中,ntext 数 据 类 型 用 来 存 储 大 量 的 文 本, 存 储 在 其 中 的 数 据 通 常 是 直 接 能 够 输 出 到 显 示 设 备 上 的 字 符, 显 示 设 备 可 以 是 显 示 器 窗 口 或 者 打 印 机 ntext 类 型 可 以 存 储 的 数 据 范 围 是 1 到 2 147 483 647 个 字 节 的 数 据 另 外, 值 得 注 意 的 是, 如 果 用 ntext 数 据 类 型 定 义 列 并 且 允 许 为 空, 则 使 用 INSER T 语 句 且 不 插 入 任 何 值 时, 将 不 会 分 配 任 何 空 间, 但 是 如 果 使 用 U PDA T E 语 句 来 更 新 数 据 库, 则 会 至 少 分 配 2 个 字 节 的 空 间 image 型 的 数 据 存 储 长 度 为 1 到 2 147 483 647 个 字 节 的 位 模 式, 可 以 用 来 存 储 照 片 目 录 图 片 或 者 图 画 通 常 存 储 在 image 列 中 的 数 据 不 能 直 接 用 INSER T 语 句 输 入 3. 用 户 定 义 数 据 类 型 用 户 定 义 数 据 类 型 是 基 于 SQ L Server 的 系 统 提 供 数 据 类 型 当 多 个 表 的 列 中 要 存 储 同 样 类 型 的 数 据, 且 想 确 保 这 些 列 具 有 完 全 相 同 的 数 据 类 型 长 度 和 是 否 为 空 属 性 时, 可 使 用 用 户 定 义 数 据 类 型 创 建 用 户 定 义 的 数 据 类 型 必 须 提 供 名 称 新 数 据 类 型 所 依 据 的 系 统 数 据 类 型 数 据 类 型 是 否 允 许 空 值 ( 如 果 未 定 义, 系 统 将 依 据 数 据 库 或 连 接 的 ANSI Null 默 认 设 置 进 行 指 派 ) 可 以 利 用 企 业 管 理 器 和 T ransact 唱 SQ L 命 令 语 句 两 种 方 法 来 创 建 用 户 定 义 数 据 类 型 下 面 分 别 用 两 种 方 法 创 建 一 个 名 为 birthday, 基 于 smalldatetime, 该 列 不 允 许 为 空 值 的 用 户 定 义 数 据 类 型 以 后 在 设 计 某 些 数 据 表 中 的 出 生 年 月 列 时 就 可 应 用 此 用 户 定 义 数 据 类 型 1 使 用 SQ L Server 企 业 管 理 器 创 建 用 户 定 义 的 数 据 类 型 首 先 在 企 业 管 理 器 中 展 开 要 创 建 用 户 定 义 数 据 类 型 的 数 据 库, 右 击 用 户 定 义 的 数 据 类 型, 单 击 新 建 用 户 定 义 数 据 类 型 子 菜 单, 如 图 4 唱 2 所 示 图 4 唱 2 创 建 用 户 定 义 数 据 类 型 在 弹 出 的 用 户 定 义 的 数 据 类 型 属 性 对 话 框 中, 如 图 4 唱 3 所 示, 输 入 新 建 数 据 类 型 的 名 称 birthday, 并 在 数 据 类 型 列 表 中 选 择 所 基 于 的 系 统 数 据 类 型
72 SQL Server 数 据 库 应 用 技 术 smalldatetime ; 在 长 度 栏 中 可 以 更 改 此 数 据 类 型 可 存 储 的 最 大 数 据 长 度 长 度 可 变 的 数 据 类 型 有 : binary varchar nvarchar varbinary 等 如 果 要 允 许 此 数 据 类 型 接 受 空 值, 可 选 择 允 许 N U L L 值, 这 里 创 建 的 数 据 类 型 不 能 为 空 值, 所 以 在 这 里 就 不 勾 选 在 对 话 框 上 的 规 则 和 默 认 值 列 表 中 可 选 择 一 个 规 则 或 默 认 值, 以 将 其 绑 定 到 用 户 定 义 的 数 据 类 型 上, 这 里 不 选 图 4 唱 3 用 户 定 义 数 据 类 型 属 性 对 话 框 最 后 单 击 确 定 按 钮, 创 建 用 户 定 义 数 据 类 型 完 毕 此 时 查 看 企 业 管 理 器 就 可 以 发 现 系 统 中 已 有 刚 才 创 建 的 birthday 的 数 据 类 型 2 利 用 T ransact 唱 SQ L 命 令 语 句 创 建 用 户 定 义 数 据 类 型 T ransact 唱 SQ L 中 用 系 统 存 储 过 程 sp_addtype 来 创 建 用 户 定 义 数 据 类 型,sp_addtype 具 体 的 用 法 读 者 可 以 查 看 SQ L Server 帮 助 文 档, 也 可 以 参 考 下 面 的 例 题 例 4.1 在 student 数 据 库 中 创 建 一 个 名 为 birthday, 基 于 smalldatetime 数 据 类 型, 该 列 不 允 许 为 空 值 的 用 户 定 义 数 据 类 型 USE student GO EXEC sp_addtype birthday,smalldatetime, NOT NULL 例 4.2 在 student 数 据 库 中 创 建 一 个 名 为 gdqy, 基 于 varchar(10) 数 据 类 型, 该 列 允 许 为 空 值 USE student GO EXEC sp_addtype gdqy, VARCH AR(10), NULL 3 删 除 用 户 定 义 的 数 据 类 型 如 图 4 唱 4 所 示, 右 击 用 户 定 义 的 数 据 类 型, 单 击 删 除 子 菜 单, 在 除 去 对 象 对 话 框 中 ( 如 图 4 唱 5 所 示 ), 单 击 全 部 除 去 按 钮, 就 可 完 成 删 除 用 户 定 义 的 数 据 类 型
第 4 章 数 据 库 中 表 的 基 本 操 作 73 图 4 唱 4 删 除 用 户 定 义 的 数 据 类 型 图 4 唱 5 除 去 对 象 对 话 框 也 可 以 在 查 询 分 析 器 的 窗 口 里 编 写 运 行 T ransact 唱 SQ L 命 令 来 删 除 用 户 定 义 的 数 据 类 型 例 4.3 删 除 在 student 数 据 库 中 创 建 的 数 据 类 型 birthday USE student GO EXEC sp_droptype birthday 4.2.2 数 据 表 设 计 与 创 建 SQ L Server 数 据 库 通 常 包 含 多 个 表, 表 是 一 个 存 储 数 据 的 实 体, 具 有 惟 一 的 名 称 可 以 说 数 据 库 实 际 上 是 表 的 集 合, 具 体 的 数 据 都 是 存 储 在 表 中 的 表 是 对 数 据 进 行 存 储 和 操 作 的 一 种 逻 辑 结 构, 每 一 个 表 代 表 一 个 对 象 例 如, 学 生 管 理 数 据 库 中 会 有 学 生 基 本 信 息 表 教 师 基 本 信 息 表 学 生 成 绩 表 课 程 信 息 表 专 业 代 码 表 教 研 室 信 息 表 教 室 信 息
74 SQL Server 数 据 库 应 用 技 术 表 等 这 些 表 就 是 数 据 表, 它 们 是 由 行 和 列 组 成 的, 通 过 表 名 和 列 名 来 识 别 数 据 表 中 各 列 包 含 了 列 的 名 字 数 据 类 型 以 及 列 的 其 他 属 性, 行 包 含 了 若 干 列 的 数 据 创 建 表 的 实 质 就 是 定 义 表 的 结 构 以 及 约 束 等, 下 面 将 分 别 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 两 种 方 法 创 建 表 在 创 建 表 之 前 的 重 要 工 作 是 设 计 表 结 构, 即 确 定 表 的 名 字 所 包 含 的 各 个 列 的 列 名 列 的 数 据 类 型 和 长 度 是 否 为 空 值 等 1. 学 生 管 理 数 据 库 (student) 的 表 结 构 表 由 若 干 个 列 组 成, 每 一 个 列 的 列 名 在 表 中 应 该 是 惟 一 的 ; 其 列 值 应 该 为 SQ L Server 可 选 的 数 据 类 型 ; 大 小 则 规 定 列 值 的 最 大 长 度 ; 小 数 位 用 于 定 义 数 值 型 numeric 列 的 小 数 位 数 ; 是 否 为 空 说 明 列 值 是 否 允 许 为 空 值 ; 默 认 值 用 于 定 义 不 经 输 入 所 确 定 的 列 值 针 对 上 述 数 据 表 作 了 如 下 设 计, 以 帮 助 同 学 们 创 建 数 据 表 时 参 考 使 用 (1) 学 生 基 本 信 息 表 (stud_info) 的 结 构 设 计 ( 如 表 4 唱 2 所 示 ) 表 4 唱 2 stud_info 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 STUD_ID char 10 N 0401010101 学 生 编 号 2 NAME varchar 8 N 姓 名 3 BIRT HDAY datetime 出 生 日 期 4 GENDER char 2 性 别 5 ADDRESS nvarchar 20 家 庭 地 址 6 TELCODE char 12 电 话 7 ZIPCODE char 6 邮 编 8 MARK int 3 560 入 学 成 绩 (2) 教 师 基 本 信 息 表 (teacher_info) 的 结 构 设 计 ( 如 表 4 唱 3 所 示 ) 表 4 唱 3 teacher_info 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 TEACHER_ID char 6 N 010101 教 师 编 号 2 NAME varchar 8 N 姓 名 3 GENDER char 2 性 别 4 AGE int 2 年 龄 5 TECH_TITLE char 10 职 称 6 TELEPHONE varchar 12 电 话 7 SALARY decimal 7 2 418 工 资 8 COURSE_ID char 10 任 教 课 程 编 码
第 4 章 数 据 库 中 表 的 基 本 操 作 75 (3) 学 生 成 绩 表 (stud_grade) 的 结 构 设 计 ( 如 表 4 唱 4 所 示 ) 表 4 唱 4 stud_grade 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 ST UD_ID char 10 N 0401010101 学 生 编 号 2 NAME varchar 8 N 姓 名 3 COURSE_ID char 10 课 程 号 4 Grade numeric 4 1 成 绩 (4) 课 程 信 息 表 (lesson_info) 的 结 构 设 计 ( 如 表 4 唱 5 所 示 ) 表 4 唱 5 lesson_info 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 COURSE_ID char 10 N 0401010101 课 程 号 2 COURSE_NAME varchar 24 N 课 程 名 3 COURSE_TYPE char 4 N 考 试 课 程 类 型 4 COURSE_MARK int 3 N 课 程 学 时 5 COURSE_TIME decimal 3 1 课 程 学 分 (5) 课 程 安 排 表 (teach_schedule) 的 结 构 设 计 ( 如 表 4 唱 6 所 示 ) 表 4 唱 6 teach_schedule 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 COURSE_ID char 10 N 课 程 号 2 COURSE_TIME datetime 起 始 时 间 3 COURSE_WEEK int 2 0 教 学 周 数 4 ROOM_ID char 6 教 室 编 码 5 DEPTCODE char 2 院 系 编 码 6 TEACHER_ID char 6 教 师 编 号 (6) 院 系 代 码 表 (dept_code) 的 结 构 设 计 ( 如 表 4 唱 7 所 示 ) 表 4 唱 7 dept_code 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 DEPTCODE char 2 N 01 院 系 编 号 2 DEPTNAME varchar 20 院 系 名 称 (7) 专 业 代 码 表 (specialty_code) 的 结 构 设 计 ( 如 表 4 唱 8 所 示 ) 表 4 唱 8 specialty_code 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 SPECCODE char 6 N 040101 专 业 编 号 2 SPECNAME varchar 20 专 业 名 称
76 SQL Server 数 据 库 应 用 技 术 (8) 教 研 室 信 息 表 (staffroom_info) 的 结 构 设 计 ( 如 表 4 唱 9 所 示 ) 表 4 唱 9 staffroom_info 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 JYSH_ID char 4 N 0101 教 研 室 编 码 2 JYSH_NAME varchar 20 教 研 室 名 称 3 JYSH_TYPE char 4 专 业 教 研 室 类 型 4 JYSH_LEADER varchar 8 教 研 室 主 任 (9) 教 室 信 息 表 (classroom_info) 的 结 构 设 计 ( 如 表 4 唱 10 所 示 ) 表 4 唱 10 classroom_info 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 ROOM_ID char 6 N 010101 教 室 编 码 2 ROOM_NAME varchar2 8 教 室 名 称 3 ROOM_TYPE varchar2 10 普 通 教 室 类 型 4 ROOM_DEVICE varchar2 20 投 影 仪 教 室 设 备 5 ROOM_SIZE int 3 60 教 室 容 量 2. 学 生 管 理 数 据 库 的 表 数 据 (1) 学 生 基 本 信 息 表 (stud_info)( 如 表 4 唱 11 所 示 ) 表 4 唱 11 stud_info 的 表 数 据 S T U D_ID N A M E BIR T H D A Y G E N DE R A DDRESS T E L CO DE ZIP CO DE M A R K 0401010811 张 源 12 唱 05 唱 1986 男 北 京 市 海 淀 区 010 唱 64572345 100080 560 0401020201 赵 明 08 唱 06 唱 1986 男 上 海 市 浦 东 区 021 唱 64897232 201700 560 0401030101 王 刚 01 唱 02 唱 1986 男 天 津 市 南 开 区 022 唱 83572336 300000 560 0401050201 陈 红 25 唱 10 唱 1986 女 武 汉 市 汉 口 区 027 唱 74565350 430000 560 0401040112 孙 强 06 唱 07 唱 1986 男 重 庆 市 沙 坪 坝 023 唱 82342348 400000 560 0401020103 李 伟 09 唱 01 唱 1986 男 北 京 市 大 兴 县 010 唱 68902947 102600 560 0401010634 钱 昆 12 唱 06 唱 1986 男 广 州 市 海 珠 区 020 唱 45672453 510000 560 0401030213 郑 芳 08 唱 09 唱 1986 女 江 苏 省 南 京 市 025 唱 84573941 210000 560 0401010102 袁 飞 03 唱 11 唱 1986 男 湖 南 省 长 沙 县 0731 唱 4572345 410000 560 0401040123 孔 荣 31 唱 05 唱 1986 男 云 南 省 昆 明 市 0871 唱 2647535 650000 600 0401050127 张 军 11 唱 03 唱 1987 男 成 都 市 和 平 区 028 唱 85249567 610041 570 0401010704 王 一 明 03 唱 03 唱 1986 男 甘 肃 省 兰 州 市 0621 唱 2221837 590000 573 其 中, 学 号 ST UD_ID 的 10 位 数 字 说 明 年 级 (2 位 ) + 院 系 编 码 (2 位 ) + 专 业 编 码 (2 位 ) + 班 次 (2 位 ) + 顺 序 号 (2 位 ) 例 如, 0401010101 之 中 第 1 ~ 2 位 的 04 表 示 2004 级, 第 3 ~ 4 位 的 01 表 示 计 算 机 工 程 系, 第 5 ~ 6 位 的 01 表 示 计 算 机 应 用 技 术 专 业, 第 7 ~ 8 位 的 01 表 示 班 次 编 号, 第 9 ~ 10 位 的 01 表 示 张 源 同 学 的 顺 序 号
第 4 章 数 据 库 中 表 的 基 本 操 作 77 (2) 教 师 基 本 信 息 表 (teacher_info)( 如 表 4 唱 12 所 示 ) 表 4 唱 12 teacher_info 的 表 数 据 T E A C H E R_ID N A M E G E N DER A G E T E C H_ T I T L E T E L E P H O N E S A L A R Y C O U R SE_ID 010101 刘 娜 女 34 讲 师 020 唱 34601254 418 0401010102 010102 邵 云 鹏 男 45 教 授 020 唱 34607811 458 0401010105 010103 孙 乐 多 男 27 助 教 020 唱 34602622 380 0401010106 010104 赵 一 欧 女 26 助 教 020 唱 34603472 380 0401010101 010106 王 吉 林 男 32 讲 师 020 唱 34603232 418 0401010103 010105 王 小 悦 女 35 讲 师 020 唱 34603790 448 0401010104 其 中,T EAC HER_ID 的 6 位 说 明 院 系 编 码 (2) + 教 研 室 编 码 (2) + 顺 序 号 (2) 例 如, 010101 计 算 机 工 程 系 编 码 (01) + 计 算 机 应 用 教 研 室 编 码 (01) + 刘 娜 老 师 的 顺 序 号 (01) (3) 学 生 成 绩 表 (stud_grade)( 如 表 4 唱 13 所 示 ) 表 4 唱 13 stud_grade 的 表 数 据 ST UD_ID 学 号 NAME 姓 名 Course_ID 课 程 号 Grade 成 绩 0401010811 张 源 0401010102 90 0401020201 赵 明 0401010105 89 0401030101 王 刚 0401010103 87 0401050201 陈 红 0401010101 91 0401040112 孙 强 0401010104 83 0401020103 李 伟 0401010106 86 0401010634 钱 昆 0401010106 78 0401030213 郑 芳 0401010106 95 0401010102 袁 飞 0401010106 95 0401040123 孔 荣 0401010106 83 0401050127 张 军 0401010106 84 (4) 课 程 信 息 表 (lesson_info)( 如 表 4 唱 14 所 示 ) Course_ID ( 课 程 号 ) Course_name ( 课 程 名 ) 表 4 唱 14 lesson_info 的 表 数 据 Course_type ( 课 程 类 型 ) Course_mark ( 课 程 学 分 ) Course_time ( 课 程 学 时 ) 0401010101 计 算 机 导 论 考 查 1.5 30 0401010102 Java 程 序 设 计 考 试 3.5 60 0401010103 微 型 计 算 机 原 理 考 试 3.5 60 0401010104 IT 市 场 营 销 考 查 1.5 30 0401010105 网 络 互 联 设 备 与 配 置 考 查 3.5 60 0401010106 多 媒 体 技 术 考 查 3 60
78 SQL Server 数 据 库 应 用 技 术 其 中, 课 程 号 (CO URSE_ID)10 位 数 字 的 详 细 说 明 如 下 第 1 ~ 2 位 第 3 ~ 4 位 第 5 ~ 6 位 第 7 ~ 8 位 第 9 ~ 10 位 年 级 编 号 院 系 编 号 专 业 编 号 学 期 编 号 课 程 编 号 04 01 01 01 01 04 级 计 算 机 系 计 算 机 应 用 第 1 学 期 计 算 机 导 论 (5) 课 程 安 排 表 (teach_schedule)( 如 表 4 唱 15 所 示 ) CO U RSE_ID ( 课 程 号 ) CO U RSE_ T I M E ( 起 始 时 间 ) 表 4 唱 15 teach_schedule 的 表 数 据 C O U RSE_ W E E K ( 使 用 周 数 ) RO O M _ID ( 教 室 编 码 ) DE P T CO DE ( 院 系 编 码 ) T E A C H E R_ID ( 教 师 编 号 ) 0401010101 30 唱 08 唱 2004 15 120703 01 010104 0401010102 30 唱 08 唱 2004 15 120704 01 010101 0401010103 30 唱 08 唱 2004 13 120705 01 010106 0401010104 30 唱 08 唱 2004 10 120706 01 010105 0401010105 30 唱 08 唱 2004 19 120707 01 010102 0401010106 30 唱 08 唱 2004 14 120708 01 010103 (6) 院 系 代 码 表 (dept_code)( 如 表 4 唱 16 所 示 ) 表 4 唱 16 dept_code 的 表 数 据 DEPTcode( 院 系 编 号 ) DEPTname( 院 系 名 称 ) DEPTcode( 院 系 编 号 ) DEPTname( 院 系 名 称 ) 01 计 算 机 工 程 系 05 轻 化 工 程 系 02 管 理 工 程 系 06 通 信 工 程 系 03 机 电 工 程 系 07 外 语 工 程 系 04 食 品 工 程 系 (7) 专 业 代 码 表 (specialty_code)( 如 表 4 唱 17 所 示 ) 表 4 唱 17 specialty_code 的 表 数 据 SPECcode( 专 业 编 号 ) SPECname( 专 业 名 称 ) SPECcode( 专 业 编 号 ) SPECname( 专 业 名 称 ) 040101 计 算 机 应 用 技 术 040105 计 算 机 软 件 技 术 040102 计 算 机 网 络 技 术 040106 计 算 机 通 信 技 术 040103 计 算 机 控 制 技 术 040107 计 算 机 管 理 技 术 040104 多 媒 体 技 术 其 中,SPECcode 的 6 位 构 成 学 年 (2) + 院 系 编 码 (2) + 专 业 顺 序 号 (2), 例 如, 040101 之 中 第 1 ~ 2 位 的 04 表 示 2004 年, 第 3 ~ 4 位 的 01 表 示 计 算 机 工 程 系, 第 5 ~ 6 位 的 01 表 示 计 算 机 应 用 技 术 专 业 的 顺 序 号
第 4 章 数 据 库 中 表 的 基 本 操 作 79 (8) 教 研 室 信 息 表 (staffroom_info)( 如 表 4 唱 18 所 示 ) JYSH_ID ( 教 研 室 编 码 ) 表 4 唱 18 staffroom_info 的 表 数 据 JYSH_NAME ( 教 研 室 名 称 ) JYSH_ TYPE ( 教 研 室 类 型 ) JYSH_LEADER ( 教 研 室 主 任 ) 0101 计 算 机 应 用 专 业 王 二 毛 0102 计 算 机 网 络 专 业 李 四 冲 0103 计 算 机 软 件 专 业 赵 一 生 0104 计 算 机 管 理 专 业 汪 三 洋 其 中,JYSH_ID 的 4 位 组 成 院 系 编 码 (2) + 教 研 室 编 码 (2), 例 如, 0101 计 算 机 工 程 系 编 码 (01) + 计 算 机 应 用 教 研 室 编 码 (01) (9) 教 室 信 息 表 (classroom_info)( 如 表 4 唱 19 所 示 ) ROOM_ID ( 教 室 编 码 ) ROOM_NAME ( 教 室 名 称 ) 表 4 唱 19 classroom_info 的 表 数 据 ROOM_ TYPE ( 教 室 类 型 ) ROOM_DEVICE ( 教 室 设 备 ) ROOM_SIZE ( 教 室 容 量 ) 120703 微 机 组 装 与 维 护 实 训 微 机 投 影 仪 40 120704 计 算 机 网 络 实 验 交 换 机 路 由 器 等 40 120705 数 据 库 计 算 机 机 房 微 机 投 影 仪 60 120706 软 件 设 计 计 算 机 机 房 微 机 投 影 仪 60 120707 多 媒 体 计 算 机 机 房 微 机 投 影 仪 60 120708 普 通 白 板 投 影 仪 120 其 中,ROO M_ID( 教 室 编 码 ) 的 6 位 组 成 为 2 位 楼 栋 号 2 位 楼 层 号 2 位 教 室 顺 序 号 例 如, 120708 表 示 12 栋 7 楼 第 8 号 教 室 上 述 9 个 表 可 以 用 图 4 唱 6 来 描 述 它 们 之 间 的 相 互 关 系 图 4 唱 6 学 生 管 理 中 数 据 表 及 它 们 之 间 的 相 互 关 系 3. 创 建 数 据 表 的 实 现 例 4.4 在 student 数 据 库 中, 创 建 学 生 信 息 表 (stud_info), 该 表 存 储 某 学 院 每 个 年 级 的 学 生 信 息 表 结 构 如 表 4 唱 2 所 示 注 意 表 4 唱 2 中 的 学 生 编 号 (S T UD_ID) 为 表 的 主 键, 主 键 是 惟 一 的 且 不 能 为 空 值, 正 是 由 于 设 定 学 生 编 号 为 主 键, 才 使 得 表 中 的 每 一 行 记 录 都 不 相 同 以 区 别 每 一 名 学 生 入
80 SQL Server 数 据 库 应 用 技 术 学 成 绩 (M ARK) 有 个 默 认 值 560, 也 就 是 说 以 后 输 入 学 生 信 息 的 数 据 时, 如 果 不 输 入 学 生 的 入 学 成 绩, 系 统 就 默 认 设 定 它 为 560 下 面 分 别 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 来 创 建 上 述 表 (1) 使 用 企 业 管 理 器 创 建 学 生 信 息 表 在 企 业 管 理 器 里 面 展 开 已 经 创 建 的 student 数 据 库 右 击 表, 单 击 新 建 表 子 菜 单, 如 图 4 唱 7 所 示 图 4 唱 7 新 建 表 在 弹 出 的 编 辑 窗 口 中 分 别 输 入 各 列 的 名 称 数 据 类 型 长 度 是 否 允 许 为 空 等 属 性 如 图 4 唱 8 所 示 图 4 唱 8 定 义 表 结 构 属 性
第 4 章 数 据 库 中 表 的 基 本 操 作 81 输 入 完 各 列 属 性 后, 单 击 工 具 栏 上 的 保 存 按 钮, 弹 出 选 择 名 称 对 话 框, 如 图 4 唱 9 所 示 在 选 择 名 称 对 话 框 中 输 入 表 的 名 称 stud_info, 表 就 创 建 好 了 (2) 使 用 Transact 唱 SQL 语 句 创 建 表 stud_ info 可 以 用 T ransact 唱 SQ L 语 句 中 的 CREA TE 图 4 唱 9 选 择 名 称 对 话 框 T ABLE 命 令 创 建 表, 其 语 法 格 式 如 下 : CREATE TABLE [ database_name.[ owner ]. owner.] table_name ( { < column_definition > column_name AS computed_column_expression < table_constraint > = [ CONSTRAINT constraint_name ] } [ { PRIMARY KEY UNIQUE } [,...n ] ) [ ON { filegroup DEFAULT } ] [ TEXTIMAGE_ON { filegroup DEFAULT } ] < column_definition > = { column_name data_type} [ COLLATE < collation_name > ] 其 中 主 要 参 数 说 明 如 下 : 瞯 database_name : 是 要 在 其 中 创 建 表 的 数 据 库 名 称 database_name 必 须 是 现 有 数 据 库 的 名 称 如 果 不 指 定 数 据 库,database_name 默 认 为 当 前 数 据 库 瞯 table_name : 是 新 建 表 的 名 称 表 名 必 须 符 合 标 识 符 规 则 瞯 column_name : 是 表 中 的 列 名 列 名 必 须 符 合 标 识 符 规 则, 并 且 在 表 内 惟 一 瞯 computed_column_expression : 是 定 义 计 算 列 值 的 表 达 式 也 就 是 说, 设 计 表 时, 表 中 的 某 些 列 的 数 值 可 由 同 一 表 中 的 其 他 列 通 过 定 义 的 公 式 计 算 得 到 例 如, 平 均 分 = 总 分 /n 其 实 在 企 业 管 理 器 中 设 计 表 时, 在 图 4 唱 7 中 也 可 以 定 义 计 算 列 值 的 表 达 式 如 果 读 者 对 此 内 容 感 兴 趣 可 以 查 阅 SQ L Server 帮 助 文 档 瞯 ON {filegroup DEFA U L T} : 指 定 存 储 表 的 文 件 组 如 果 指 定 filegroup, 则 表 将 存 储 在 指 定 的 文 件 组 中 数 据 库 中 必 须 存 在 该 文 件 组 如 果 指 定 DEFA U L T, 或 者 根 本 未 指 定 ON 参 数, 则 表 存 储 在 默 认 文 件 组 中 瞯 TEXTIMAGE_ON : 是 表 示 text ntext 和 image 列 存 储 在 指 定 文 件 组 中 的 关 键 字 如 果 表 中 没 有 text ntext 或 image 列, 则 不 能 使 用 TEXTIMAGE ON 如 果 没 有 指 定 TEXTIMAGE_ON, 则 text ntext 和 image 列 将 与 表 存 储 在 同 一 文 件 组 中 瞯 data_type : 指 定 列 的 数 据 类 型 可 以 是 系 统 数 据 类 型 或 用 户 定 义 数 据 类 型 看 了 上 面 的 T ransact 唱 SQ L 语 法, 容 易 人 遮 雾 里, 先 看 看 下 面 的 例 子, 再 回 过 头 去 看 看 上 面 的 语 法, 就 会 理 清 头 绪 以 后 也 可 以 创 建 更 复 杂 的 数 据 表
82 SQL Server 数 据 库 应 用 技 术 例 4.5 利 用 CREA T E T ABLE 命 令 创 建 表 stud_info USE student GO CREATE T ABLE stud_info ( stud_id CHAR(10) NOT NULL, name VARCH AR(8) NOT NULL, birthday DATETIME, gender CH AR(2), address NVARCH AR(20), telcode CH AR(12), zipcode CHAR(6), mark DECIMAL(3,0) ) 4.2.3 修 改 表 结 构 数 据 表 创 建 以 后, 在 使 用 过 程 中 可 能 需 要 对 原 先 定 义 的 表 的 结 构 进 行 修 改 修 改 表 的 结 构 也 可 以 通 过 SQ L Server 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 两 种 方 法 进 行 对 表 结 构 的 修 改 包 括 : 更 改 表 名 增 加 列 删 除 列 修 改 已 有 列 的 属 性 等 1. 使 用 企 业 管 理 器 修 改 表 (1) 修 改 表 名 SQ L Server 允 许 修 改 一 个 表 的 名 字, 但 当 表 名 改 变 后, 与 此 相 关 的 某 些 对 象 ( 如 视 图 存 储 过 程 等 ) 将 无 效, 因 为 它 们 都 与 表 名 有 关 因 此, 建 议 一 般 不 要 随 便 更 改 一 个 已 有 的 表 名, 特 别 是 在 其 上 已 经 定 义 了 视 图 等 对 象 在 企 业 管 理 器 中 展 开 student 数 据 库, 选 择 其 中 的 表 classroom_info 并 按 右 键, 单 击 重 命 名 子 菜 单, 如 图 4 唱 10 所 示 图 4 唱 10 修 改 表 名 接 着 在 表 名 的 位 置 上 输 入 新 的 表 名 教 室 信 息 表 后 回 车 马 上 弹 出 图 4 唱 11 所 示 的
第 4 章 数 据 库 中 表 的 基 本 操 作 83 对 话 框, 提 示 用 户 更 改 表 名 将 导 致 引 用 该 表 的 存 储 过 程 视 图 触 发 器 无 效, 要 求 用 户 予 以 确 认 单 击 是 确 认 该 操 作, 单 击 否 放 弃 改 名 操 作 图 4 唱 11 修 改 表 名 操 作 确 认 (2) 增 加 列 当 需 要 向 表 中 增 加 项 目 时, 就 要 向 表 中 增 加 列 例 如, 将 student 数 据 库 中 的 stud_ info 表 增 加 一 列 身 份 证 号 码 操 作 如 下 : 在 企 业 管 理 器 中 右 击 表 stud_info, 在 弹 出 的 菜 单 上 选 择 设 计 表, 如 图 4 唱 12 所 示 图 4 唱 12 设 计 表 接 着 在 设 计 表 窗 口 中 单 击 第 一 个 空 白 行, 输 入 列 名 身 份 证 号 码, 选 择 数 据 类 型 varchar, 并 选 择 允 许 为 空 值 如 图 4 唱 13 所 示 最 后 单 击 图 4 唱 13 中 工 具 栏 上 的 保 存 按 钮, 即 完 成 了 添 加 列 的 操 作, 按 此 操 作 可 添 加 多 个 列 (3) 删 除 列 也 可 以 删 除 刚 才 在 stud_info 表 中 建 立 的 身 份 证 号 码 列 注 意 : SQ L Server 中 被 删 除 的 列 不 能 再 恢 复, 所 以 删 除 列 时 要 慎 重 考 虑 删 除 身 份 证 号 码 列 的 操 作 如 下 : 在 企 业 管 理 器 中 打 开 stud_info 表 的 设 计 表 窗 口, 右 击 身 份 证 号 码 列, 单 击 删 除 列 子 菜 单 该 列 即 被 删 除, 最 后 单 击 工 具 栏 上 的 保 存 按 钮, 以 保 存 操 作 结 果 如 图 4 唱 14 所 示 (4) 修 改 已 有 列 的 属 性 类 似 增 加 删 除 列 那 样, 在 SQ L Server 企 业 管 理 器 中 打 开 表 的 设 计 表 窗 口, 可 以 对 已
84 SQL Server 数 据 库 应 用 技 术 图 4 唱 13 向 表 中 增 加 列 图 4 唱 14 删 除 列 有 列 的 列 名 数 据 类 型 长 度 以 及 是 否 允 许 为 空 值 等 属 性 直 接 进 行 修 改 修 改 完 毕 后, 单 击 工 具 栏 上 的 保 存 按 钮 以 保 存 修 改 结 果 但 是, 当 表 中 已 有 记 录 后, 不 要 轻 易 修 改 表 的 结 构, 特 别 是 修 改 列 的 数 据 类 型, 以 免 造
第 4 章 数 据 库 中 表 的 基 本 操 作 85 成 错 误 例 如, 表 中 某 列 原 来 的 数 据 类 型 是 decimal 型, 如 果 将 它 改 为 int 型, 那 么 表 中 原 有 的 记 录 值 将 丢 掉 部 分 数 据, 从 而 引 起 数 值 错 误 2. 使 用 Transact 唱 SQL 语 句 修 改 表 结 构 T ransact 唱 SQ L 中 的 A L TER T ABLE 语 句 能 够 完 成 上 述 企 业 管 理 器 中 的 修 改 表 的 操 作 现 在 先 学 习 其 基 本 语 法, 然 后 用 A L T ER T ABLE 语 句 完 成 上 述 操 作 A L T ER T ABLE 的 语 法 格 式 : ALTER TABLE table_name { [ ALTER COLUMN column_name { new_data_type [ ( precision [,scale ] ) ] [ COLLATE < collation_name > ] [ NULL NOT NULL] ADD { [ < column_definition > ] [,...n ] DROP{[ CONSTRAINT ] constraint_name COLUMN column_name} [,...n ] } 其 中 : 瞯 table_name : 希 望 修 改 结 构 的 表 名 称 ; 瞯 A L TER/ADD/DROP : 修 改 增 加 删 除 现 存 表 中 的 一 个 列 或 约 束 ; 瞯 new_ data_ type : 要 修 改 列 的 新 数 据 类 型,precision 指 定 精 度,scale 指 定 小 数 位 数 ; 瞯 COLLA T E collation_name : 为 更 改 列 指 定 新 的 排 序 规 则 ; 瞯 COL U M N column_name : 希 望 修 改 结 构 中 的 列 名 ; 瞯 CONS T RAIN T constraint_name : 希 望 修 改 结 构 中 的 列 约 束 名 例 4.6 利 用 A L TER T ABLE 命 令 在 表 stud_info 中 增 加 一 列 身 份 证 号 码, 数 据 类 型 为 varchar, 允 许 为 空 值 USE student GO ALTER T ABLE stud_info ADD 身 份 证 号 码 varchar NULL GO 例 4.7 删 除 表 stud_info 中 的 身 份 证 号 码 列 USE student GO ALTER T ABLE stud_info DROP COLU MN 身 份 证 号 码 GO 例 4.8 修 改 表 stud _ info 中 已 有 列 的 属 性 : 将 birthday 的 数 据 类 型 改 为 smalldatetime
86 SQL Server 数 据 库 应 用 技 术 USE student GO ALTER T ABLE stud_info ALTER COLU MN birthday smalldatetime GO 3. 使 用 DROP 语 句 删 除 数 据 表 DELE T E 语 句 只 能 删 除 数 据 库 中 表 的 记 录 行, 但 删 除 行 后 的 表 仍 然 在 数 据 库 中 使 用 DROP 语 句 可 以 从 数 据 库 中 删 除 表 其 语 法 格 式 : DROP TABLE table_name 注 意 : DROP T ABLE 语 句 不 能 删 除 系 统 表 如 果 希 望 删 除 表 内 的 所 有 行, 使 用 DELE T E table_name 语 句, 则 表 中 数 据 全 部 被 删 除 例 4.9 删 除 数 据 库 student 中 的 表 stud_info USE student DROP T ABLE stud_info 4.2.4 插 入 更 新 和 删 除 表 数 据 1. 数 据 库 中 表 的 查 看 (1) 查 看 表 结 构 1 使 用 企 业 管 理 器 查 看 在 企 业 管 理 器, 右 击 需 要 查 看 结 构 的 表, 在 弹 出 的 快 捷 菜 单 中 选 择 属 性 命 令, 打 开 表 属 性 对 话 框, 单 击 常 规 标 签 页 即 可 查 看 表 信 息 2 使 用 系 统 存 储 过 程 sp_help 查 看 语 法 格 式 : [EXECUTE] sp_help [table_name] 例 4.10 查 看 学 生 基 本 信 息 表 (stud_info) 的 结 构, 可 以 使 用 下 列 语 句 : EXEC sp_help stud_info (2) 查 看 表 中 的 数 据 1 使 用 企 业 管 理 器 查 看 表 中 的 数 据 在 企 业 管 理 器 中, 右 击 需 要 查 看 数 据 的 表, 弹 出 快 捷 菜 单, 单 击 打 开 表 唱 返 回 所 有 行 命 令, 打 开 查 询 结 果 窗 口 即 可 看 到 表 中 的 数 据 另 外, 还 可 以 在 企 业 管 理 器 中, 右 击 需 要 查 看 的 表, 在 弹 出 的 快 捷 菜 单 中 选 择 打 开 表 唱 查 询, 就 可 打 开 企 业 管 理 器 中 的 查 询 设 计 器 此 时, 不 仅 可 以 在 尽 量 保 留 原 有 数 据 的 情 况 下 对 表 结 构 重 新 进 行 设 计 和 修 改, 同 时 还 可 以 随 意 查 看 修 改 和 删 除 表 中 的 数 据, 这 项 功 能 对 于 数 据 库 开 发 人 员 来 说, 是 非 常 方 便 的 SQ L Server 提 供 的 数 据 视 图
第 4 章 数 据 库 中 表 的 基 本 操 作 87 (Data View) 类 似 于 Access 数 据 库 中 的 数 据 视 图 格 式, 完 全 是 表 格 方 式, 这 样 即 便 表 中 的 列 数 和 行 数 都 很 多, 用 户 也 可 以 根 据 表 格 线 和 使 用 滚 动 条 来 查 看 表 中 的 记 录 同 时, 数 据 视 图 还 是 一 个 查 询 设 计 器, 使 用 它 可 以 设 计 SQ L 语 句 或 者 以 图 形 方 式 设 计 查 询 条 件, 并 通 过 单 击 工 具 栏 上 的 RU N 按 钮 ( 红 色 惊 叹 号 ), 获 得 该 SQ L 语 句 的 执 行 结 果 2 使 用 查 询 分 析 器 查 看 表 中 的 数 据 打 开 查 询 分 析 器, 在 对 象 浏 览 器 中 选 择 相 应 的 数 据 库, 展 开 数 据 库 目 录 和 用 户 表 目 录 右 击 要 查 看 的 表, 从 弹 出 快 捷 菜 单 中 选 择 打 开 命 令, 就 会 打 开 表 窗 口, 在 此 窗 口 中 用 户 可 以 查 看 修 改 和 删 除 表 中 的 数 据 3 使 用 SELEC T 语 句 查 看 表 中 的 数 据 例 4.11 查 看 学 生 基 本 信 息 表 (stud_info) 表 中 的 数 据, 可 在 查 询 分 析 器 中 输 入 下 列 语 句 : SELECT 倡 FROM stud_info 数 据 表 的 操 作 中 的 一 项 重 要 内 容 就 是 对 表 的 数 据 内 容 进 行 查 询 查 询 主 要 是 根 据 用 户 提 供 的 限 定 条 件 进 行, 查 询 的 结 果 将 返 回 一 张 能 满 足 用 户 要 求 的 表 SQ L Server 中 用 SELEC T 语 句 完 成 对 数 据 库 中 数 据 的 查 询 关 于 使 用 SELEC T 语 句 查 看 表 中 的 数 据, 将 在 第 6 章 中 做 详 细 介 绍 2. 使 用 INSERT 语 句 插 入 数 据 向 表 中 插 入 数 据 就 是 将 一 条 或 多 条 记 录 添 加 到 表 尾 T ransact 唱 SQ L 中 使 用 INSER T 命 令 完 成 数 据 插 入, 其 语 法 如 下 : INSERT [INTO] table_name [(column1,column2,...)] values(value1,value2,...) 其 中 : 瞯 table_name : 指 定 插 入 数 据 的 表 格 名 称 ; 瞯 column1,column2,...: 将 要 插 入 数 据 的 列 名 ; 瞯 value1,value2,...: 插 入 的 列 值 例 4.12 在 表 stud_info 中 插 入 如 下 一 条 记 录 : 0401040125, 傅 兵,08 唱 12 唱 1985, 男, 甘 肃 省 天 水 市,0863 唱 7647456,564000,627 USE student INSERT INTO stud_info VALUES( 0401040125, 傅 兵, 08 唱 12 唱 1985, 男, 甘 肃 省 天 水 市, 0863 唱 7647456, 564000, 627 ) GO 打 开 表 stud_info, 看 到 表 尾 已 经 添 加 了 上 面 的 一 行 记 录 例 4.13 在 表 stud_info 中 插 入 部 分 记 录, 只 输 入 stud_id name address 三 个 列 值 : 0401050129, 护 军, 河 南 省 新 乡 市
88 SQL Server 数 据 库 应 用 技 术 USE student INSERT stud_info(stud_id,name,address) VALUES( 0401050129, 护 军, 河 南 省 新 乡 市 ) GO 从 企 业 管 理 器 打 开 表 stud_info, 可 以 看 到 上 述 部 分 数 据 已 经 添 加 到 表 尾 的 一 条 记 录 中, 其 他 被 填 入 了 空 值 3. 使 用 UPDATE 语 句 修 改 数 据 使 用 U PDA T E 语 句 可 以 更 新 改 变 数 据 表 中 现 存 记 录 中 的 数 据 U PDA TE 命 令 的 语 法 如 下 : UPDATE table_name SET column1 = modified_value1[,column2 = modified_values[,...]] [WHERE column1 = value1][,column2 = value2] 其 中 : 瞯 table_name : 指 定 要 更 新 数 据 的 表 名 ; 瞯 SE T column1 = modified_value1 : 指 定 要 更 新 的 列 及 该 列 改 变 后 的 值 ; 瞯 W H ERE : 指 定 被 更 新 的 记 录 所 应 满 足 的 条 件 本 语 法 代 表 的 语 句 将 实 现 在 表 table_name 中 符 合 条 件 的 记 录 中 修 改 指 定 列 的 列 值 例 4.14 把 例 4.11 在 表 stud_info 中 添 加 的 记 录 进 行 修 改, 修 改 记 录 的 命 令 如 下 : USE student UPDATE stud_info SET birthday = 03 唱 12 唱 87,gender = 男,telcode = 0373 唱 4354357,zipcode = 453000 WHERE stud_id = 0401050129 GO 在 企 业 管 理 器 中 打 开 表 stud_info, 可 以 发 现 最 后 一 行 记 录 中 原 先 的 空 值 已 经 被 更 新 为 新 的 数 据 值 4. 使 用 DELETE 语 句 删 除 数 据 使 用 DELE T E 语 句 可 以 从 表 中 删 除 一 行 或 多 行 记 录 DELE T E 命 令 的 语 法 如 下 : DELETE FROM table_name [WHERE column1 = value1],[column2 = value2] 其 中 : W HERE 子 句 用 来 指 定 删 除 行 的 条 件 例 4.15 删 除 表 stud_info 中 所 有 的 记 录 DELETE FROM stud_info 例 4.16 删 除 表 stud_info 中 学 生 地 址 列 address 为 空 的 记 录 DELETE FROM stud_info WHERE stud_id is NULL
第 4 章 数 据 库 中 表 的 基 本 操 作 89 4.3 定 义 约 束 4.3.1 约 束 的 类 型 通 常 创 建 表 的 步 骤 为 : 首 先 定 义 表 结 构, 即 给 表 的 每 一 列 取 列 名, 并 确 定 每 一 列 的 数 据 类 型 数 据 长 度 列 数 据 是 否 可 以 为 空 等 ; 然 后, 为 了 限 制 某 列 输 入 值 的 取 值 范 围, 以 保 证 输 入 数 据 的 正 确 性 和 一 致 性 而 设 置 约 束 ; 当 表 结 构 和 约 束 建 立 完 成 之 后, 最 后 就 可 以 向 表 中 输 入 数 据 了 本 节 将 介 绍 创 建 表 过 程 中 如 何 设 置 SQ L Server 中 有 五 种 约 束 类 型, 分 别 是 C HECK 约 束 DEFA U L T 约 束 PRIM ARY KEY 约 束 FOREIGN KEY 约 束 U NIQ UE 约 束 (1) C HECK 约 束 C HECK 约 束 用 于 限 制 输 入 到 一 列 或 多 列 的 值 的 范 围, 从 逻 辑 表 达 式 判 断 数 据 的 有 效 性, 也 就 是 一 个 列 的 输 入 内 容 必 须 满 足 CHECK 约 束 的 条 件, 否 则, 数 据 无 法 正 常 输 入, 从 而 强 制 数 据 的 域 完 整 性 (2) DEFA U L T 约 束 若 将 表 中 某 列 定 义 了 DEFA U L T 约 束 后, 用 户 在 插 入 新 的 数 据 行 时, 如 果 没 有 为 该 列 指 定 数 据, 那 么 系 统 将 默 认 值 赋 给 该 列, 当 然 该 默 认 值 也 可 以 是 空 值 (N U L L) (3) PRIM ARY KEY 约 束 表 中 经 常 有 一 列 或 多 列 的 组 合, 其 值 能 惟 一 标 识 表 中 的 每 一 行 这 样 的 一 列 或 多 列 称 为 表 的 主 键 (Primary Key), 通 过 它 可 以 强 制 表 的 实 体 完 整 性 一 个 表 只 能 有 一 个 主 键, 而 且 主 键 约 束 中 的 列 不 能 为 空 值 如 将 学 生 信 息 表 (stud_info) 中 学 生 的 学 号 设 为 该 表 的 主 键, 因 为 它 能 惟 一 标 识 该 表, 且 该 列 的 值 不 为 空 如 果 主 键 约 束 定 义 在 不 止 一 列 上, 则 一 列 中 的 值 可 以 重 复, 但 主 键 约 束 定 义 中 的 所 有 列 的 组 合 的 值 必 须 惟 一, 因 为 该 组 合 列 成 为 表 的 主 键 (4) FOREIGN KEY 约 束 外 键 (Foreign Key) 是 用 于 建 立 和 加 强 两 个 表 ( 主 表 与 从 表 ) 的 一 列 或 多 列 数 据 之 间 的 链 接, 当 数 据 添 加 修 改 或 删 除 时, 通 过 参 照 完 整 性 保 证 它 们 之 间 数 据 的 一 致 性 定 义 表 之 间 的 参 照 完 整 性 是 先 定 义 主 表 的 主 键, 再 对 从 表 定 义 外 键 约 束 (5) U NIQ UE 约 束 U NIQ UE 约 束 用 于 确 保 表 中 的 两 个 数 据 行 在 非 主 键 列 中 没 有 相 同 的 列 值 与 PRIM ARY KEY 约 束 类 似,U NIQ UE 约 束 也 强 制 惟 一 性, 为 表 中 的 一 列 或 多 列 提 供 实 体 完 整 性 但 U NIQ UE 约 束 用 于 非 主 键 的 一 列 或 多 列 组 合, 且 一 个 表 可 以 定 义 多 个 U NIQ UE 约 束, 另 外 U NIQ UE 约 束 可 以 用 于 定 义 允 许 空 值 的 列 ; 而 PRIM ARY KEY 约 束 只 能 用 在 惟 一 列 上 且 不 能 为 空 值 4.3.2 约 束 的 创 建 查 看 删 除 4.3.1 节 中 已 经 介 绍 了 五 种 类 型 的 约 束, 本 节 介 绍 各 种 约 束 的 创 建 查 看 和 删 除 等 操 作 这 些 操 作 均 可 在 企 业 管 理 器 中 进 行, 也 可 利 用 T ransact 唱 SQ L 命 令 进 行
90 SQL Server 数 据 库 应 用 技 术 1.CHECK 约 束 的 创 建 查 看 和 删 除 在 数 据 库 student 中 的 表 stud_info 中 定 义 学 生 性 别 列 (gender) 只 能 是 男 或 女, 避 免 用 户 输 入 其 他 的 值 要 解 决 此 问 题, 需 要 用 到 C HECK 约 束, 使 得 学 生 性 别 列 的 值 只 有 男 女 两 种 可 能, 如 果 用 户 输 入 其 他 值, 系 统 均 提 示 用 户 输 入 无 效 下 面 看 看 在 企 业 管 理 器 中 是 如 何 解 决 此 问 题 的 首 先, 在 企 业 管 理 器 中 右 击 表 stud_info, 选 择 设 计 表, 弹 出 如 图 4 唱 15 所 示 的 设 计 表 界 面 然 后, 单 击 设 计 表 窗 口 工 具 栏 表 和 索 引 属 性 按 钮, 在 属 性 窗 口 中, 选 择 C HECK 约 束 标 签, 如 图 4 唱 16 所 示 单 击 新 建 按 钮, 输 入 约 束 表 达 式 gender = 男 or gender = 女 然 后, 单 击 关 闭 按 钮 最 后, 在 设 计 表 窗 口 单 击 工 具 栏 上 的 保 存 按 钮, 即 完 成 了 创 建 并 保 存 C HECK 约 束 的 操 作 以 后 用 户 输 入 数 据 时, 若 输 入 性 别 不 是 男 或 女, 系 统 将 报 告 输 入 无 效 图 4 唱 15 设 计 stud_info 表 要 想 删 除 上 面 创 建 的 CHECK 约 束, 在 图 4 唱 16 所 示 的 C HECK 约 束 属 性 窗 口, 单 击 删 除 按 钮, 然 后 单 击 关 闭 按 钮, 即 可 删 除 CHECK 约 束 也 可 使 用 T ransact 唱 SQ L 语 句 创 建 和 删 除 CHECK 约 束, 其 C HECK 约 束 的 语 句 格 式 : [CONSTRAINT CHECK constraint_name] CHECK (logical_expression) 例 4.17 使 用 T ransact 唱 SQ L 语 句 为 stud_info 创 建 C HECK 约 束
第 4 章 数 据 库 中 表 的 基 本 操 作 91 图 4 唱 16 属 性 窗 口 ALTER T ABLE stud_info ADD CONSTRAINT ck_stud_info CHECK(gender = 男 or gender = 女 ) 删 除 CHECK 约 束 的 语 句 格 式 是 : DROP CONSTRAINT CHECK constraint_name 那 么 删 除 上 面 的 约 束 的 语 句 是 : ALTER T ABLE stud_info DROP CONSTRAINT ck_stud_info 2.DEFAULT 约 束 的 创 建 查 看 和 删 除 在 企 业 管 理 器 定 义 表 stud_info 的 DEFA U L T 约 束, 要 求 学 生 性 别 列 (gender) 的 默 认 值 为 男 其 操 作 如 下 : 打 开 表 stud_info 的 设 计 表 窗 口, 如 图 4 唱 17 所 示 用 鼠 标 选 择 gender 列, 在 下 面 的 默 认 值 栏 输 入 男, 然 后 单 击 保 存 工 具 栏 按 钮 要 想 在 企 业 管 理 器 中 删 除 已 建 立 的 DEFA U L T 约 束, 只 需 要 在 图 4 唱 17 中 删 除 该 列 的 默 认 值, 然 后 保 存 即 可 使 用 T ransact 唱 SQ L 语 句 创 建 DEFA U L T 约 束 的 语 法 是 : [CONSTRAINT DEFAULT constraint_name] DEFAULT constraint_expression 删 除 已 创 建 的 DEFA U L T 约 束 的 语 法 格 式 : DROP CONSTRAINT DEFAULT constraint_name
92 SQL Server 数 据 库 应 用 技 术 图 4 唱 17 创 建 DEFAULT 约 束 例 4.18 创 建 上 述 的 DEFA U L T 约 束 的 T ransact 唱 SQ L 语 句 为 : ALTER T ABLE stud_info ADD CONSTRAINT gender DEFAULT 男 FOR gender 删 除 这 个 DEFA U L T 约 束 的 语 句 如 下 : ALTER T ABLE stud_info DROP CONSTRAINT de_gender 3.PRIMARY KEY 约 束 的 创 建 查 看 和 删 除 在 企 业 管 理 器 中 将 stud _ info 表 的 学 生 学 号 ( stud _ ID) 定 义 为 主 键 ( PRIM ARY KEY) 其 操 作 如 下 : 右 击 表 stud_info, 选 择 设 计 表 子 菜 单, 弹 出 如 图 4 唱 18 所 示 的 设 计 表 窗 口 右 击 学 号 列 (stud_id), 在 弹 出 菜 单 上 选 择 设 置 主 键 子 菜 单, 即 可 将 stud_id 列 设 为 主 键 也 可 先 用 鼠 标 选 择 stud_id 列, 然 后 单 击 工 具 栏 上 的 设 置 主 键 按 钮, 最 后 保 存 也 可 以 在 stud_info 列 上 创 建 PRIM ARY KEY 约 束 如 果 再 次 单 击 设 置 主 键 按 钮, 就 可 取 消 刚 才 设 置 的 主 键 如 果 主 键 由 多 列 组 成, 先 选 中 此 列, 然 后 按 住 Ctrl 键 不 放, 同 时 用 鼠 标 选 择 其 他 列, 最 后 选 择 工 具 栏 的 设 置 主 键 按 钮, 即 可 将 多 列 组 合 设 置 成 主 键 例 4.19 用 T ransact 唱 SQ L 语 句 完 成 上 述 例 子 的 语 句 如 下 : ALTER T ABLE stud_info ADD CONSTRAINT PK_XH PRIMARY KEY CLUSTERED(stud_id) 删 除 该 主 键 的 T ransact 唱 SQ L 语 句 如 下 :
第 4 章 数 据 库 中 表 的 基 本 操 作 93 图 4 唱 18 设 置 PRIMARY KEY 约 束 ALTER T ABLE stud_info DROP CONSTRAINT PK_XH 4.FOREIGN KEY 约 束 的 创 建 查 看 和 删 除 4.3.1 节 讲 述 的 FOREIGN KEY 的 概 念 是 它 被 用 于 建 立 和 加 强 两 个 表 ( 主 表 与 从 表 ) 数 据 之 间 的 链 接 的 一 列 或 多 列, 当 数 据 被 添 加 修 改 或 删 除 时, 通 过 参 照 完 整 性 保 证 它 们 之 间 数 据 的 一 致 性 根 据 它 的 概 念, 我 们 来 看 student 数 据 库 中 的 学 生 成 绩 表 stud_ grade 中 记 录 每 名 学 生 的 每 门 课 程 的 成 绩, 它 里 面 包 含 有 课 程 号 (course_id) ; 另 一 张 课 程 信 息 表 (lesson_info) 记 录 的 是 每 门 课 程 的 名 称 学 时 数 学 分 等 信 息, 它 里 面 也 包 含 有 课 程 号 (course_id) 如 果 要 查 询 某 学 生 某 门 课 程 的 成 绩, 必 须 两 张 表 联 合 起 来 查 询, 那 么 就 需 要 将 两 张 表 连 接 起 来 设 置 外 键 (FOREIGN KEY) 就 是 实 现 两 张 表 的 连 接, 对 于 表 lesson_info 设 置 course_id 列 为 其 主 键, 对 于 表 stud_grade 设 置 course_id 列 为 其 外 键, 这 样 通 过 course_id 列 建 立 起 两 个 表 之 间 的 外 键 约 束 关 系 注 意 : 建 立 外 键 的 关 键 是 某 列 必 须 是 两 张 表 中 的 同 名 同 数 据 类 型 列, 且 该 列 为 一 张 表 的 主 键, 该 列 为 另 一 张 表 的 外 键 下 面 通 过 企 业 管 理 器 来 创 建 学 生 成 绩 表 stud_grade 与 课 程 信 息 表 (lesson_info) 之 间 的 外 键 约 束 关 系 首 先, 检 查 在 课 程 信 息 表 (lesson_info) 中 是 否 将 course_id 列 设 置 为 主 键, 如 果 没 有 就 先 设 置 它 为 该 表 的 主 键 接 着, 打 开 学 生 成 绩 表 stud_grade 的 设 计 表 窗 口, 单 击 工 具 栏 上 的 表 和 索 引 属 性 按 钮, 在 弹 出 的 表 属 性 窗 口 上 单 击 关 系 标 签, 然 后 单 击 新 建 按 钮 如 图 4 唱 19 所 示 单 击 新 建 按 钮 后, 图 4 唱 19 的 主 键 表 下 拉 选 择 框 中 选 定 lesson_
94 SQL Server 数 据 库 应 用 技 术 info 表, 并 单 击 主 键 表 下 的 下 拉 按 钮 选 择 其 中 的 course_id ; 在 外 键 表 下 拉 选 择 框 中 选 定 stud_grade 表, 并 单 击 外 键 表 下 的 下 拉 按 钮 选 择 其 中 的 course_id 如 果 想 重 命 名 外 键 约 束 名, 可 以 在 关 系 名 文 本 框 中 重 新 输 入 新 的 名 称 最 后, 单 击 关 闭 按 钮, 即 完 成 外 键 约 束 的 创 建 这 样 两 张 表 通 过 course_id 而 连 接 起 来 如 图 4 唱 20 所 示 图 4 唱 19 创 建 外 键 关 系 图 4 唱 20 选 择 主 从 表 的 外 键 约 束 列
第 4 章 数 据 库 中 表 的 基 本 操 作 95 例 4.20 完 成 上 述 任 务 的 T ransact 唱 SQ L 语 句 如 下 : 为 lesson_info 表 中 的 course_id 列 建 立 主 键 约 束 ALTER T ABLE lesson_info ADD CONSTRAINT pk_course_id PRIM ARY KEY CLUSTERED(course_id) 为 stud_grade 表 中 的 course_id 列 建 立 外 键 约 束 ALTER T ABLE stud_grade ADD CONSTRAINT fk_course_id FOREIGN KEY (course_id) REFERENCES lesson_info (course_id) 5.UNIQUE 约 束 的 创 建 查 看 和 删 除 使 用 企 业 管 理 器 创 建 表, 并 且 要 一 并 创 建 所 需 的 U NIQ UE 约 束, 可 以 按 下 列 步 骤 进 行 : 在 结 构 定 义 窗 口 中 完 成 所 有 列 的 定 义 后, 单 击 工 具 栏 中 的 管 理 表 / 索 引... 按 钮, 打 开 属 性 对 话 框, 单 击 索 引 / 键 标 签 页 并 切 换 到 该 页 面, 单 击 新 建 按 钮 此 时 属 性 对 话 框, 可 以 为 所 需 的 列 创 建 U NIQ UE 约 束 首 先 必 须 决 定 要 为 哪 一 个 列 或 哪 些 列 的 组 合 创 建 U NIQ UE 约 束, 并 依 次 在 列 名 表 框 的 各 行 选 取 列 名 例 如, 为 电 话 号 码 创 建 U NIQ UE 约 束, 则 必 须 在 列 名 列 表 框 的 第 一 行 选 取 telcode 列, 在 索 引 名 文 本 框 中 键 入 U NIQ U E 约 束 的 名 称 注 意 : SQ L Server 要 求 同 一 个 数 据 库 中 各 个 约 束 的 名 称 绝 对 不 能 相 同, 即 使 这 些 约 束 是 不 同 的 类 型 就 此 处 而 言, 指 派 给 U NIQ UE 约 束 的 名 称 必 须 是 数 据 库 中 惟 一 的, 也 就 是 它 不 能 与 同 一 个 数 据 库 中 所 有 表 的 现 有 各 类 型 约 束 的 名 称 相 同 企 业 管 理 器 默 认 会 将 U NIQ UE 约 束 的 惟 一 索 引 存 放 在 PRIM ARY 文 件 组 中, 如 果 想 将 它 存 放 在 其 他 的 文 件 组, 请 从 索 引 文 件 组 列 表 框 中 选 取 所 需 文 件 组 选 中 复 选 框 创 建 U NIQ UE(U), 并 确 认 单 选 按 钮 约 束 (O) 已 被 选 中 在 填 满 因 子 文 本 框 中 键 入 U NIQ UE 约 束 的 惟 一 索 引 的 填 充 因 子, 可 设 置 值 为 0 ~ 100 如 果 希 望 将 U NIQ UE 约 束 的 惟 一 索 引 创 建 成 聚 集 惟 一 索 引, 请 选 中 复 选 框 创 建 为 CL US T ERED(C) ; 如 果 希 望 将 U NIQ UE 约 束 的 惟 一 索 引 创 建 成 非 聚 集 惟 一 索 引, 就 不 要 选 中 复 选 框 创 建 为 CL U S T ERED(C) 此 外, 选 中 复 选 框 创 建 为 CL US T ERED(C) 会 使 得 索 引 文 件 组 列 表 框 自 动 设 置 成 存 放 表 的 文 件 组 由 于 表 可 以 拥 有 多 个 U NIQ UE 约 束, 因 此 请 重 复 上 述 操 作, 直 到 为 所 需 的 各 个 单 列 或 多 列 的 组 合 创 建 U NIQ UE 约 束 为 止 单 击 关 闭 按 钮 返 回 结 构 定 义 窗 口 单 击 工 具 栏 中 的 保 存 按 钮 将 表 存 盘, 关 闭 结 构 定 义 窗 口 使 用 T ransact 唱 SQ L 语 句 创 建 U NIQ U E 约 束 的 语 法 是 : [CONSTRAINT constraint_name] UNIQUE [CLUSTERED NONCLUSTERBD] [WITH FILLFACTOR = fillfactor] [ON{filegroup DEFAULT}] 删 除 已 创 建 的 DEFA U L T 约 束 的 语 法 格 式 :
96 SQL Server 数 据 库 应 用 技 术 DROP CONSTRAINT UNIQUE constraint_name 例 4.21 针 对 学 生 基 本 信 息 表 的 电 话 号 码 创 建 U NIQ UE 约 束 ALTER T ABLE stud_info ADD CONSTRAINT UN_telcode UNIQUE(telcode) 删 除 U NIQ UE 约 束 的 T ransact 唱 SQ L 语 句 如 下 : ALTER T ABLE stud_info DROP CONSTRAINT UN_telcode 4.4 使 用 默 认 和 规 则 4.4.1 使 用 默 认 前 面 已 经 学 习 过 DEFA U L T 约 束, 对 它 的 作 用 有 了 一 定 的 了 解 默 认 与 DEFA U L T 约 束 的 作 用 一 样, 可 以 实 现 当 用 户 向 数 据 库 表 中 插 入 一 行 数 据 时, 如 果 没 有 明 确 给 出 某 列 的 输 入 值 时, 则 由 SQ L Server 自 动 为 该 列 输 入 默 认 值 但 与 DEFA U L T 约 束 不 同 的 是, 默 认 值 是 一 种 数 据 库 对 象, 在 数 据 库 中 只 需 定 义 一 次 后, 就 可 以 被 一 次 或 多 次 应 用 于 任 意 表 中 的 一 列 或 多 列, 还 可 以 用 于 用 户 定 义 的 数 据 类 型 创 建 和 使 用 默 认 也 可 以 使 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 命 令 下 面 分 别 用 两 种 方 法 创 建 默 认 打 开 企 业 管 理 器, 展 开 student 数 据 库, 右 击 默 认, 在 弹 出 的 子 菜 单 里 选 择 新 建 默 认... 子 菜 单 如 图 4 唱 21 所 示 我 们 拟 在 数 据 库 student 中 创 建 默 认 MR_GRADE, 并 将 其 绑 定 到 表 stud_info 中 的 学 生 总 分 (mark) 列 上 从 而 实 现 每 名 学 生 的 总 分 默 认 为 560 分 图 4 唱 21 新 建 默 认 在 弹 出 的 默 认 属 性 对 话 框 里 分 别 输 入 默 认 的 名 称 和 值, 然 后 单 击 确 定 按 钮, 即 完 成 默 认 的 创 建, 如 图 4 唱 22 所 示 此 时 如 果 用 户 查 看 企 业 管 理 器, 单 击 默 认, 就 会 看 到 刚 创 建 的 默 认 M R_GRADE 已 经 存 入 到 系 统 中
第 4 章 数 据 库 中 表 的 基 本 操 作 97 图 4 唱 22 设 置 默 认 的 属 性 创 建 了 默 认 后, 就 可 以 把 它 绑 定 到 表 上 的 某 列 从 而 可 以 使 用 该 默 认 此 时 在 企 业 管 理 器 中 单 击 student 数 据 库 下 的 默 认 值, 然 后 鼠 标 右 击 右 边 窗 口 里 的 默 认 M R _ GRADE, 在 弹 出 菜 单 中 选 择 属 性 子 菜 单, 如 图 4 唱 23 所 示 图 4 唱 23 默 认 值 属 性 此 时, 用 户 会 看 到 弹 出 的 默 认 属 性 对 话 框 里 的 绑 定 列 按 钮 已 经 由 灰 变 黑, 单 击 绑 定 列 按 钮, 如 图 4 唱 24 所 示 图 4 唱 24 绑 定 列
98 SQL Server 数 据 库 应 用 技 术 在 绑 定 列 属 性 对 话 框 里, 先 选 定 要 绑 定 默 认 的 数 据 表 stud_info, 然 后 在 未 绑 定 的 列 的 列 表 框 中 选 择 列 名 mark, 然 后 单 击 添 加 按 钮, 最 后 单 击 确 定 按 钮, 如 图 4 唱 25 所 示 至 此 刚 才 创 建 的 默 认 M R_GRADE 已 绑 定 到 表 stud_info 中 的 mark 列 上, 以 后 向 该 表 输 入 数 据 时,mark 列 的 默 认 值 为 560 图 4 唱 25 设 置 绑 定 列 属 性 其 中 : 使 用 T ransact 唱 SQ L 语 句 创 建 默 认 的 命 令 如 下 : CREATE DEFAULT default_name AS constraint_expression default_name : 表 示 新 建 立 的 默 认 的 名 称 ; Constraint_expression : 指 定 默 认 常 量 表 达 式 的 值 将 默 认 绑 定 到 表 中 某 列 上 的 T ransact 唱 SQ L 语 句 如 下 : EXEC sp_bindefault default_name table_name.[column_name[,...] user_datetype] 例 4.22 下 面 用 T ransact 唱 SQ L 的 命 令 语 句 来 创 建 默 认 M R_GRADE USE student GO CREATE DEFAUL T MR_GRADE AS 560 GO EXEC sp_bindefault MR_GRADE, stud_info.mark GO
第 4 章 数 据 库 中 表 的 基 本 操 作 99 最 后 在 查 询 分 析 器 中 运 行 上 述 语 句, 即 可 将 默 认 值 560 绑 定 到 stud _ info 表 的 mark 列 4.4.2 使 用 规 则 前 面 已 经 学 习 了 规 则 的 概 念, 其 实 规 则 与 C HECK 约 束 的 关 系 相 对 于 默 认 与 DEFA U L T 约 束 的 关 系 一 样, 规 则 这 种 数 据 库 对 象 的 作 用 与 C HECK 约 束 一 样, 只 不 过 规 则 不 固 定 于 哪 个 列, 而 是 创 建 好 以 后 可 以 随 便 地 绑 定 于 表 中 地 某 个 列 上 通 过 使 用 规 则, 用 户 可 以 指 定 插 入 数 据 库 表 上 列 中 的 有 效 值, 从 而 确 保 用 户 输 入 在 该 列 上 的 数 据 在 指 定 的 范 围 之 内 下 面 来 看 一 个 例 子 : 在 数 据 库 student 中 创 建 规 则 GZ_ GRADE, 并 将 其 绑 定 到 表 stud_grade 中 的 学 生 成 绩 (grade) 列 上, 使 得 用 户 输 入 的 学 生 成 绩 在 0 ~ 100 的 范 围 之 内, 否 则 提 示 输 入 无 效 在 企 业 管 理 器 中 展 开 student 数 据 库, 右 击 规 则, 选 择 弹 出 菜 单 上 的 新 建 规 则... 子 菜 单 如 图 4 唱 26 所 示 图 4 唱 26 新 建 规 则 在 弹 出 的 规 则 属 性 对 话 框 里 输 入 规 则 的 名 称 和 规 则 文 本, 如 图 4 唱 27 所 示 然 后 单 击 确 定 按 钮 注 意 这 里 的 @ grade 是 个 变 量, 现 在 还 不 知 道 它 代 表 数 据 表 中 的 哪 个 列, 只 有 待 该 规 则 绑 定 到 表 中 一 个 具 体 列 上, 它 才 代 表 那 个 具 体 列 的 列 值 下 面 将 它 绑 定 到 表 stud_grade 中 的 grade 列, 此 时, 变 量 @ grade 代 表 grade 的 列 值 至 此, 已 经 创 建 好 规 则 接 下 来 的 任 务 是 将 它 绑 定 到 表 stud_grade 的 grade 列 上 单 击 企 业 管 理 器 数 据 库 student 下 的 规 则, 在 企 业 管 理 器 右 侧 窗 口 上 用 户 就 会 看 到 刚 才 创 建 的 规 则 GZ_GRADE, 双 击, 弹 出 规 则 属 性 窗 口 此 时 可 以 修 改 刚 才 书 写 的 规 则 文 本, 同 时 发 现 它 的 绑 定 列 按 钮 已 由 灰 变 黑 单 击 绑 定 列 按 钮, 弹 出 如 图 4 唱 28 所 示 的 绑 定 列 规 则 设 置 窗 口 在 表 下 拉 选 择 框 中 选 择 表 stud_grade, 然 后 将 左 边 的 grade 列 选 中, 并 单 击 添 加 按 钮 这 样, 左 边 的 grade 列 就 被 添 加 到 右 边 的 列 表 中 单 击 确 定 按 钮, 即 将 创 建 的 规 则 绑 定 到 表 stud_ grade 的 grade 列 上, 以 后 输 入 的 学 生 成 绩 在 0 ~ 100 之 内 才 有 效
100 SQL Server 数 据 库 应 用 技 术 图 4 唱 27 设 置 规 则 属 性 图 4 唱 28 选 择 绑 定 列 使 用 T ransact 唱 SQ L 语 句 创 建 规 则 的 语 法 如 下 : CREATE RULE rule_name AS condition_expression 其 中, rule_name : 新 建 的 规 则 名 ; condition_expression : 定 义 规 则 的 条 件 执 行 绑 定 规 则 的 命 令 语 句 如 下 :
第 4 章 数 据 库 中 表 的 基 本 操 作 101 EXEC sp_bindrule rule_name, table_name.[column_name[,...] user_datetype] 例 4.23 使 用 T ransact 唱 SQ L 语 句 来 创 建 上 述 规 则, 其 语 句 如 下 : USE student GO CREATE RULE GZ_GRADE AS @ grade > = 0 and @ grade < = 100 GO EXEC sp_bindrule GZ_GRADE, stud_grade.grade 在 查 询 分 析 器 中 运 行 上 述 语 句, 即 可 创 建 一 个 规 则 并 将 它 绑 定 到 表 stud_ grade 的 grade 列 上 实 训 1. 实 训 目 的 (1) 了 解 SQ L Server 的 数 据 类 型 (2) 了 解 数 据 表 的 结 构 特 点 (3) 学 会 使 用 企 业 管 理 器 和 查 询 分 析 器 创 建 数 据 表 (4) 学 会 在 企 业 管 理 器 中 对 数 据 表 进 行 插 入 修 改 和 删 除 数 据 的 操 作 (5) 学 会 使 用 SQ L 语 句 对 数 据 表 进 行 插 入 修 改 和 删 除 数 据 的 操 作 (6) 学 会 定 义 约 束 使 用 默 认 和 规 则 2. 实 训 的 知 识 准 备 创 建 数 据 表, 需 要 为 每 一 个 数 据 表 的 设 计 表 结 构 参 照 4.2.2 节 数 据 表 样 本 的 设 计 方 法, 为 数 据 表 设 计 列 名 称 列 类 型 列 宽 度 是 否 允 许 为 空 同 时, 需 要 实 施 数 据 完 整 性, 即 PRIM ARY KEY( 主 关 键 字 ) 约 束 FOREIGN KEY( 外 关 键 字 ) 约 束 U NIQ UE( 惟 一 ) 约 束 CHECK( 检 查 ) 约 束 DEFA U L T( 缺 省 ) 约 束 除 此 之 外, 还 需 要 使 用 默 认 和 规 则 对 表 数 据 的 插 入 删 除 修 改 都 属 于 数 据 库 对 象 的 基 本 操 作 其 操 作 可 以 在 企 业 管 理 器 中 进 行, 也 可 以 由 SQ L 语 句 实 现 当 然, 使 用 SQ L 语 句 对 表 数 据 进 行 插 入 修 改 及 删 除, 比 在 企 业 管 理 器 中 操 作 表 数 据 更 为 灵 活, 功 能 更 强 大 另 外, 在 插 入 操 作 过 程 中, 可 以 收 集 真 实 数 据 或 相 关 的 虚 拟 数 据, 不 过 要 特 别 注 意 在 执 行 插 入 删 除 修 改 等 操 作 时, 必 须 保 证 数 据 的 完 整 性 3. 实 训 内 容 和 步 骤 (1) 在 企 业 管 理 器 中 分 别 创 建 学 生 信 息 表 (stud_info) 教 师 基 本 信 息 表 (teacher_ info) 学 生 成 绩 表 (stud_grade) 课 程 信 息 表 (lesson_info) 课 程 安 排 表 (teach_schedule) 院 系 代 码 表 (dept_code) 专 业 代 码 表 (specialty_code) 教 研 室 信 息 表 (staffroom_info) 和 教 室 信 息 表 (classroom_info) (2) 在 查 询 分 析 器 中, 首 先 使 用 DROP T ABLE 删 除 在 企 业 管 理 器 中 创 建 的 表, 然 后
102 SQL Server 数 据 库 应 用 技 术 使 用 SQ L 语 句 再 次 创 建 数 据 表 stud_info teacher_info stud_ grade lesson_info teach_ schedule dept_code specialty_code staffroom_info 和 classroom_info 自 行 练 习 : 为 学 生 考 试 管 理 创 建 对 应 的 数 据 表 stud_exam 数 据 包 括 考 试 课 程 考 试 类 型 考 试 人 数 考 试 时 间 考 室 编 号 监 考 人 考 试 班 级 考 试 规 则 考 场 记 录 等 (3) 分 别 使 用 企 业 管 理 器 和 SQ L 语 句 修 改 表 结 构 1 将 teacher_info 表 中 的 teacher_id 列 长 度 从 6 个 字 符 改 变 到 8 个 字 符 ALTER T ABLE teacher_info (teacher_id CH AR(8)) 2 在 dept_code 表 中 最 后 加 一 列 dept_memo, 其 数 据 类 型 为 可 变 长 字 符 型 30 位 ALTER T ABLE dept_code (dept_memo VARCH AR(30)) 3 向 stud_info 表 增 加 入 学 时 间 列, 其 数 据 类 型 为 日 期 型 ALTER T ABLE stud_info scome DA TE 自 行 练 习 : 假 设 在 创 建 数 据 表 lesson_info 时 错 将 课 程 学 分 course_ mark 设 计 为 CH AR(2), 现 欲 修 改 为 DECIM A L(3,1) 请 写 出 其 对 应 语 句, 并 上 机 测 试 (4) 建 立 约 束 1 为 student 数 据 库 的 stud_info 表 中 的 mark 列 建 立 CHECK 约 束 ALTER T ABLE stud_info ADD (CONSTRAINT ch_mark (mark BETWEEN 560 AND 600)) ; 2 使 SQ L 语 句 创 建 表 stud_info, 设 置 stud_id 为 PRIM ARY KEY 约 束 CREATE T ABLE stud_info (stud_id CH AR(10) NOT NULL CONSTRAIN T pk_stud_id, name VARCH AR(8) NOT NULL, birthday DA TE, gender CHAR(2), address VARCHAR(20), telcode CHAR(12), zipcode CHAR(6), mark DECIMAL(3,0) ) 3 为 表 stud_info 的 telcode 列 建 立 U NIQ UE 约 束 ALTER T ABLE stud_info ADD CONSTRAINT un_telephone (telcode) 4 为 stud_grade 表 中 的 stud_id 列 建 立 FOREIGN KEY 约 束 ALTER T ABLE stud_grade ADD CONSTRAINT fk_stud_id FOREIGN KEY(stud_id) stud_info(stud_id)
第 4 章 数 据 库 中 表 的 基 本 操 作 103 自 行 练 习 : 为 表 stud_info 的 zipcode 列 建 立 DEFA U L T 约 束 (5) 向 数 据 库 student 的 表 中 插 入 数 据 1 向 学 生 信 息 表 (stud_info) 中 插 入 数 据, 并 使 用 SELEC T 语 句 检 索 所 插 入 的 数 据 INSERT INTO stud_info VALUES ( 0401010811, 张 源, 12 唱 05 唱 1986, 男, 北 京 市 海 淀 区, 010 唱 64572345, 100080, 560) SELECT 倡 FROM 自 行 练 习 : 请 读 者 参 见 4.2.2 小 节 学 生 管 理 数 据 库 的 样 本, 完 成 stud_info 数 据 表 的 其 他 数 据 输 入 2 向 教 师 基 本 信 息 表 teacher_info 中 插 入 数 据, 并 在 企 业 管 理 器 中 检 查 所 插 入 的 数 据 INSERT INTO teacher_info VALUES( 010101, 刘 娜, 女,34, 讲 师, 020 唱 34601254,418, 0401010102 ) 自 行 练 习 : 请 读 者 参 见 4.2.2 小 节 学 生 管 理 数 据 库 的 样 本, 完 成 teacher_info 数 据 表 的 其 他 数 据 输 入 3 在 查 询 分 析 器 中, 依 据 4.2.2 小 节 学 生 管 理 数 据 库 的 样 本 使 用 SQ L 命 令 分 别 向 数 据 表 stud_ grade lesson_info teach_ schedule dept _code specialty _code staffroom _ info 和 classroom_info 中 插 入 一 行 或 多 行 数 据 记 录 (6) 修 改 数 据 库 student 的 表 数 据 1 在 学 生 成 绩 表 中, 将 课 程 号 0401010101 的 成 绩 在 原 来 基 础 上 增 加 10 % UPDATE stud_grade SET grade = grade + grade 倡 0.1 WHERE = 0401010101 2 将 所 有 低 于 60 分 的 成 绩 置 空 UPDATE stud_grade SET grade = NULL WHERE 3 将 所 有 教 师 的 年 龄 增 加 1 岁 UPDATE teacher_info SET 自 行 练 习 : 将 赵 明 同 学 的 入 学 成 绩 更 新 成 与 学 号 为 0401040123 的 孔 荣 同 学 的 入 学 成 绩 相 同 (7) 删 除 数 据 库 student 的 表 数 据 1 删 除 学 号 为 0401020201 的 学 生 记 录 stud_info WHERE stud_id = 0401020201 2 删 除 计 算 机 工 程 系 所 有 学 生 的 成 绩 记 录 DELETE FROM stud_grade WHERE = 01 自 行 练 习 : 使 用 SQ L 命 令 删 除 表 teacher_info 中 的 所 有 记 录
104 SQL Server 数 据 库 应 用 技 术 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 什 么 是 表? 什 么 是 列? 如 何 确 定 列 值 的 数 据 类 型? 数 据 类 型 中 char 和 varchar 有 什 么 区 别? (2) 简 述 CREA TE T ABLE 语 句 的 各 个 参 数 的 作 用 (3) 如 果 创 建 表 时, 没 有 指 定 N U LL 或 NO T N U L L, 默 认 用 什 么? (4) INSER T 语 句 的 用 途 是 什 么? 如 果 在 INSER T 语 句 中 列 出 了 6 个 列 名, 需 要 提 供 几 个 列 值? 如 果 向 一 个 没 有 默 认 值 而 且 也 不 允 许 N U L L 值 的 列 中 插 入 一 个 N U L L 值, 结 果 会 怎 样? (5) U PDA T E 语 句 的 作 用 是 什 么? 为 什 么 在 使 用 U PDA T E 语 句 时 提 供 一 个 W HERE 子 句 很 重 要? (6) DELE T E 语 句 的 作 用 是 什 么? 使 用 DELE TE 语 句 能 一 次 删 除 多 个 行 吗? (7) 说 明 DELE T E FRO M teacher _ info 与 A L T ER T ABLE teacher _ info DROP COL U M N teacher_id 的 区 别? (8) 对 表 stud_score 增 加 一 列 total_score, 数 据 类 型 为 int, 用 什 么 命 令? (9) 什 么 是 约 束? 请 分 别 说 明 各 种 不 同 类 型 约 束 的 含 义 如 何 创 建 和 删 除 约 束? 写 出 其 SQ L 的 语 句 格 式 (10) 试 述 默 认 和 规 则 的 概 念 和 作 用? 创 建 一 个 名 为 stud_info_gz 的 规 则, 并 将 其 绑 定 到 表 stud_info 中 的 性 别 (gender) 列 上, 使 用 户 输 入 的 性 别 只 能 是 男 或 女, 否 则 提 示 输 入 无 效 2. 选 择 最 适 合 的 答 案 (1) 假 如 定 义 表 时 没 有 为 一 个 CH AR 数 据 类 型 的 列 指 定 长 度, 其 默 认 长 度 是 多 少? ( ) A.256 B.1000 C.64 D.1 (2) 关 系 数 据 库 是 若 干 ( ) 的 集 合 A. 表 ( 关 系 ) B. 视 图 C. 列 D. 行 (3) 从 下 列 选 项 中 选 择 一 个 无 效 的 数 据 类 型 ( ) A. binary B. varchar C. time D.image (4) 不 允 许 在 关 系 中 出 现 重 复 记 录 的 约 束 通 过 ( ) 实 现 A. CHECK B. DEFA U L T C. FOREIGN KEY D. PRIM ARY KEY 或 U NIQ UE (5) 参 照 完 整 性 规 则 : 表 的 ( ) 必 须 是 另 一 个 表 主 键 的 有 效 值, 或 者 是 空 值 A. 次 关 键 字 B. 外 关 键 字 C. 主 关 键 字 D. 主 属 性 (6) 从 表 stud_info 中 删 除 一 列 telcode 的 命 令 是 什 么? ( ) A. A L T ER T ABLE stud_info DROP COL U M N telcode
第 4 章 数 据 库 中 表 的 基 本 操 作 B. A L T ER T ABLE stud_info RE M OVE COL U M N telcode C. DROP COL U M N telcode FRO M stud_info D. 不 能 从 表 中 删 除 一 列 (7) 下 列 哪 一 条 语 句 将 在 教 师 基 本 信 息 表 (teacher_info) 的 teacher_id 列 上 建 立 一 个 主 键 约 束 PK_teacher_id? ( ) A. CREA T E PRIM ARY KEY ON teacher_info (teacher_id) B. CREA T E CONS T RAIN T PK _ teacher _ id PRIM ARY KEY ON teacher _ info (teacher_id) C. A L TER T ABLE teacher_info ADD CONS T RAIN T PK_teacher_id PRIM ARY KEY(teacher_id) D. A L T ER T ABLE teacher_info ADD PRIM ARY KEY(teacher_id) (8) 假 如 已 经 建 立 了 表 stud_score, 该 表 有 6
第 5 章 索 引 及 其 应 用 在 实 际 数 据 库 应 用 中, 在 数 据 表 上 创 建 和 维 护 索 引 是 一 项 重 要 的 工 作 本 章 详 细 全 面 地 介 绍 了 SQ L Server 2000 的 索 引 技 术 首 先 介 绍 索 引 的 基 本 概 念 和 特 点 ; 接 着 介 绍 创 建 索 引 的 方 法 和 维 护 索 引 的 技 术 ; 最 后 介 绍 创 建 索 引 统 计 和 查 看 索 引 信 息 5.1 索 引 的 基 础 知 识 5.1.1 数 据 存 储 为 了 学 习 索 引, 先 来 学 习 一 些 SQ L Server 如 何 进 行 数 据 存 储 和 访 问 的 相 关 知 识 在 SQ L Server 系 统 中, 可 管 理 的 最 小 空 间 是 页 一 个 页 是 8KB 的 磁 盘 物 理 空 间 当 向 数 据 库 中 插 入 数 据 的 时 候, 数 据 按 照 插 入 的 时 间 顺 序 被 放 置 在 数 据 页 上 一 般 地, 放 置 数 据 的 顺 序 与 数 据 本 身 的 逻 辑 关 系 之 间 并 没 有 任 何 联 系 的 因 此, 从 数 据 之 间 的 逻 辑 关 系 方 面 来 讲, 数 据 是 乱 七 八 糟 地 堆 放 在 一 起 的 数 据 的 这 种 堆 放 方 式 称 为 堆 当 一 个 数 据 页 上 的 数 据 堆 满 之 后, 其 他 的 数 据 就 堆 放 在 另 外 一 个 数 据 页 上 根 据 上 面 的 叙 述, 在 没 有 建 立 索 引 的 表 内, 使 用 堆 的 集 合 的 方 法 组 织 数 据 页 在 堆 的 集 合 中, 数 据 行 不 按 任 何 顺 序 进 行 存 储, 数 据 页 序 列 也 没 有 任 何 特 殊 顺 序 因 此 扫 描 这 些 数 据 堆 集 花 费 的 时 间 肯 定 较 长 在 建 有 索 引 的 表 内, 数 据 行 基 于 索 引 的 键 值 按 顺 序 存 放, 必 然 改 善 了 系 统 查 询 数 据 的 速 度 SQ L Server 2000 数 据 库 的 数 据 文 件 中 包 含 八 种 页 类 型 : 数 据 索 引 文 本 / 图 像 全 局 分 配 映 射 表 与 辅 助 全 局 分 配 映 射 表 页 的 可 用 空 间 索 引 分 配 映 射 表 大 容 量 更 改 映 射 表 差 异 更 改 映 射 表 在 数 据 存 储 基 础 上,SQ L Server 提 供 了 两 种 数 据 访 问 方 法 : (1) 表 扫 描 法 在 没 有 建 立 索 引 的 表 内 进 行 数 据 访 问 时,SQ L Server 通 过 表 扫 描 法 来 获 取 所 需 要 的 数 据 当 SQ L Server 执 行 表 扫 描 时, 它 从 表 的 第 一 行 开 始 逐 行 查 找, 直 到 将 符 合 查 询 条 件 的 行 提 取 出 来 显 然, 使 用 表 扫 描 法 所 耗 费 的 时 间 将 直 接 同 数 据 库 表 中 存 在 的 数 据 量 成 正 比 因 此 当 数 据 库 中 存 在 大 量 的 数 据 时, 使 用 表 扫 描 法 将 造 成 系 统 响 应 时 间 过 长 (2) 使 用 索 引 在 建 有 索 引 的 表 内 进 行 数 据 访 问 时,SQ L Server 将 通 过 使 用 索 引 来 获 取 所 需 要 的 数
第 5 章 索 引 及 其 应 用 107 据 当 SQ L Server 使 用 索 引 时, 它 会 通 过 遍 历 索 引 来 查 找 所 需 行 的 存 储 位 置, 并 通 过 查 找 的 结 果 提 取 所 需 的 行 一 般 而 言, 由 于 索 引 加 速 了 对 表 中 数 据 行 的 检 索, 所 以 通 过 使 用 索 引 可 以 加 快 SQ L Server 访 问 数 据 的 速 度, 减 少 数 据 访 问 时 间 5.1.2 索 引 1. 使 用 索 引 的 意 义 索 引 是 以 表 列 为 基 础 建 立 的 数 据 库 对 象, 它 保 存 着 表 中 排 序 的 索 引 列, 并 且 记 录 了 索 引 列 在 数 据 表 中 的 物 理 存 储 位 置, 实 现 了 表 中 数 据 的 逻 辑 排 序 其 主 要 目 的 是 提 高 SQ L Server 系 统 的 性 能, 加 快 数 据 的 查 询 速 度 和 减 少 系 统 的 响 应 时 间 为 了 方 便 理 解 索 引, 先 来 看 书 籍 中 的 目 录 在 一 本 书 中, 利 用 目 录 可 以 快 速 查 找 到 相 关 信 息, 而 无 须 阅 读 整 本 书 在 数 据 库 中, 数 据 的 查 询 就 是 对 数 据 表 进 行 扫 描 如 果 没 有 索 引, 就 需 要 一 行 一 行 地 扫 描 整 张 表, 势 必 查 询 花 费 的 时 间 较 长 ; 如 果 将 数 据 表 中 的 某 些 列 ( 例 如 主 键 ) 制 作 成 索 引, 查 询 数 据 的 时 候 先 查 看 一 下 索 引 而 不 扫 描 整 张 表, 这 相 当 于 先 翻 翻 书 籍 的 目 录, 从 索 引 里 确 定 了 用 户 要 查 找 的 数 据 在 表 中 哪 些 行 里 面, 再 去 扫 描 这 些 行, 查 询 的 速 度 会 大 大 加 快, 使 得 SQ L Server 系 统 的 性 能 得 以 提 高 至 此, 索 引 是 一 个 表 中 所 包 含 的 值 的 列 表, 它 说 明 了 表 中 包 含 各 个 值 的 行 所 在 的 存 储 位 置 索 引 除 了 可 以 提 高 查 询 表 内 数 据 的 速 度 以 外, 还 可 以 使 表 和 表 之 间 的 连 接 速 度 加 快 例 如, 在 实 现 数 据 的 参 照 完 整 性 时, 可 以 将 表 的 外 键 制 作 成 索 引, 这 样 将 加 速 表 与 表 之 间 的 连 接 2. 使 用 索 引 的 代 价 虽 然 索 引 具 有 如 此 多 的 优 点, 但 索 引 的 存 在 也 让 系 统 付 出 一 定 的 代 价 本 身 创 建 索 引 和 维 护 索 引 都 会 耗 费 时 间, 当 对 表 中 的 数 据 进 行 增 加 删 除 和 修 改 的 时 候, 索 引 就 要 进 行 维 护, 否 则 索 引 的 作 用 就 会 下 降 ; 另 外, 每 个 索 引 都 会 占 用 一 定 的 物 理 空 间, 如 果 占 有 的 物 理 空 间 过 多, 就 会 影 响 到 整 个 SQ L Server 系 统 的 性 能 3. 建 立 索 引 的 原 则 我 们 已 经 知 道 创 建 索 引 虽 然 可 以 提 高 查 询 速 度, 但 是 它 需 要 牺 牲 一 定 的 系 统 性 能 因 此 创 建 索 引 时, 哪 些 列 适 合 创 建 索 引, 哪 些 列 不 适 合 创 建 索 引, 需 要 进 行 一 番 判 断 考 察 才 能 进 行 索 引 的 创 建 (1) 定 义 有 主 键 的 数 据 列 一 定 要 建 立 索 引 因 为 主 键 可 以 惟 一 表 示 行, 通 过 主 键 可 以 快 速 定 位 到 表 中 的 某 一 行 (2) 定 义 有 外 键 的 数 据 列 可 以 建 索 引 外 键 列 通 常 用 于 表 与 表 之 间 的 连 接, 在 其 上 创 建 索 引 可 以 加 快 表 间 的 连 接 (3) 在 经 常 查 询 的 数 据 列 最 好 建 立 索 引 1 需 要 在 指 定 范 围 内 快 速 或 频 繁 查 询 的 数 据 列, 因 为 索 引 已 经 排 序, 其 指 定 的 范 围 是 连 续 的, 查 询 可 以 利 用 索 引 的 排 序, 加 快 排 序 查 询 的 时 间 2 经 常 用 在 W HERE 子 句 的 数 据 列, 将 索 引 建 立 在 W H ERE 字 句 的 集 合 过 程 中 需 要 快 速 或 频 繁 检 索 的 数 据 列, 可 以 让 这 些 经 常 参 与 查 询 的 数 据 列 按 照 索 引 的 排 序 进 行 查 询, 加 快 查 询 时 间
108 SQL Server 数 据 库 应 用 技 术 (4) 对 于 那 些 查 询 中 很 少 涉 及 的 列 重 复 值 比 较 多 的 列 不 要 建 索 引 例 如, 在 查 询 中 很 少 使 用 的 列, 有 无 索 引 并 不 能 提 高 查 询 速 度, 相 反 增 加 了 系 统 维 护 时 间 和 消 耗 了 系 统 空 间 ; 又 如, 性 别 列 只 有 列 值 男 和 女, 增 加 索 引 并 不 能 显 著 提 高 查 询 速 度 (5) 对 于 定 义 为 text,image 和 bit 数 据 类 型 的 列 上 不 要 建 立 索 引 因 为 数 据 类 型 为 text ntext 或 image 的 数 据 列 的 数 据 量 要 么 很 大, 要 么 很 小, 不 利 于 使 用 索 引 5.1.3 索 引 的 分 类 SQ L Server 中 有 两 种 类 型 的 索 引, 分 别 是 聚 集 索 引 (Clustered Index) 和 非 聚 集 索 引 (Nonclustered Index) 这 是 从 索 引 表 的 物 理 顺 序 与 表 中 数 据 行 的 物 理 存 储 顺 序 是 否 相 同 的 角 度 来 分 类 的 当 表 中 有 PRIM ARY KEY 约 束 或 U NIQ UE 约 束 时,SQ L Server 会 自 动 在 列 上 建 立 索 引, 至 于 是 聚 集 索 引 还 是 非 聚 集 索 引 由 CL U S T ERED 或 NONCL U S T ERED 关 键 字 决 定 1. 聚 集 索 引 当 在 表 格 中 的 某 些 列 上 建 立 聚 集 索 引 时, 表 格 中 的 数 据 会 以 该 字 段 作 为 排 序 根 据 表 中 数 据 行 的 物 理 存 储 顺 序 与 索 引 顺 序 完 全 相 同 正 因 如 此, 一 个 表 格 中 只 能 建 立 一 个 聚 集 索 引, 但 该 索 引 可 以 包 含 多 个 列 ( 组 合 索 引 ) 当 表 中 保 存 有 连 续 值 的 列 时, 在 这 些 列 上 建 立 聚 集 索 引 非 常 有 效, 因 为 当 使 用 聚 集 索 引 快 速 找 到 一 个 值 时, 其 他 连 续 的 值 自 然 就 在 附 近 默 认 情 况 下,SQ L Server 为 PRIM ARY KEY 约 束 自 动 建 立 聚 集 索 引, 也 可 在 CREA T E INDEX 语 句 中 用 CL U S TERED 或 NONCL U S T ERED 关 键 字 建 立 聚 集 或 非 聚 集 索 引 聚 集 索 引 是 指 表 中 数 据 行 的 物 理 存 储 顺 序 与 索 引 顺 序 完 全 相 同 聚 集 索 引 由 上 下 两 层 组 成, 上 层 为 索 引 页, 包 含 表 中 的 索 引 页 面, 用 于 数 据 检 索, 下 层 为 数 据 页 2. 非 聚 集 索 引 非 聚 集 索 引 不 改 变 表 中 数 据 行 的 物 理 存 储 顺 序, 数 据 与 索 引 分 开 存 储 非 聚 集 索 引 中 仅 包 含 索 引 值 和 指 向 数 据 存 储 位 置 的 指 针 索 引 中 的 项 目 按 索 引 键 值 的 顺 序 存 储, 而 表 中 的 信 息 按 另 一 种 顺 序 存 储 SQ L Server 在 查 询 数 据 时, 现 对 非 聚 集 索 引 进 行 搜 索, 找 到 数 据 在 表 中 的 位 置 然 后 从 根 据 得 到 的 数 据 位 置 信 息, 到 磁 盘 上 的 该 位 置 处 读 取 数 据 非 聚 集 索 引 中 的 数 据 排 列 顺 序 并 不 是 表 格 中 的 数 据 排 列 顺 序, 这 是 与 聚 集 索 引 的 主 要 区 别 因 此 聚 集 索 引 的 查 询 速 度 比 非 聚 集 索 引 快, 非 聚 集 索 引 又 比 没 有 索 引 快 但 是 聚 集 索 引 要 求 数 据 按 照 索 引 顺 序 在 磁 盘 上 排 列 在 一 起 非 聚 集 索 引 不 改 变 表 中 数 据 行 的 物 理 存 储 位 置, 数 据 与 索 引 分 开 存 储, 通 过 索 引 带 有 的 指 针 与 表 中 的 数 据 发 生 联 系 3. 惟 一 索 引 根 据 数 据 库 的 功 能, 可 在 数 据 库 设 计 器 中 创 建 三 种 类 型 的 索 引 惟 一 索 引 主 键 索 引 和 聚 集 索 引 惟 一 索 引 不 允 许 两 行 具 有 相 同 的 索 引 值 例 如, 如 果 在 表 中 的 姓 名 字 段 上 创 建 了 惟 一 索 引, 则 以 后 用 户 输 入 的 姓 名 将 不 能 同 名
第 5 章 索 引 及 其 应 用 109 聚 集 索 引 和 非 聚 集 索 引 都 可 以 是 惟 一 的 因 此, 只 要 列 中 的 数 据 是 惟 一 的, 就 可 以 在 同 一 个 表 上 创 建 一 个 惟 一 的 聚 集 索 引 和 多 个 惟 一 的 非 聚 集 索 引 只 有 当 惟 一 性 是 数 据 本 身 的 特 征 时, 指 定 惟 一 索 引 才 有 意 义 如 果 必 须 实 施 惟 一 性 以 确 保 数 据 的 完 整 性, 则 应 在 列 上 创 建 U NIQ UE 或 PRIM ARY KEY 约 束, 而 不 要 创 建 惟 一 索 引 创 建 PRIM ARY KEY 或 U NIQ UE 约 束 会 在 表 中 指 定 的 列 上 自 动 创 建 惟 一 索 引 创 建 U NIQ UE 约 束 与 手 动 创 建 惟 一 索 引 没 有 明 显 的 区 别 进 行 数 据 验 证 的 方 式 相 同, 而 且 查 询 优 化 器 不 区 分 惟 一 索 引 是 由 约 束 创 建 还 时 手 动 创 建 如 果 存 在 重 复 的 键 值, 则 无 法 创 建 惟 一 索 引 和 U NIQ UE 约 束 在 同 一 个 列 组 合 上 创 建 惟 一 索 引 而 不 是 非 惟 一 索 引 可 为 查 询 优 化 器 提 供 附 加 信 息, 所 以 最 好 创 建 惟 一 索 引 5.2 创 建 索 引 5.2.1 使 用 企 业 管 理 器 创 建 索 引 1. 直 接 创 建 索 引 (1) 在 企 业 管 理 器 中, 选 择 要 创 建 索 引 的 表 ( 如 数 据 库 student 中 的 学 生 成 绩 表 stud_ info), 然 后 在 此 表 的 名 字 上 右 击, 在 弹 出 的 菜 单 中 选 择 所 有 任 务 下 的 管 理 索 引, 如 图 5 唱 1 所 示 图 5 唱 1 创 建 索 引 (2) 在 如 图 5 唱 2 所 示 的 管 理 索 引 对 话 框 中 列 出 了 stud_info 表 上 的 已 有 的 索 引, 包 含 其 名 称 是 不 是 聚 集 索 引 和 索 引 列 的 名 称 可 以 单 击 对 话 框 的 新 建 按 钮, 打 开 新 建
110 SQL Server 数 据 库 应 用 技 术 索 引 对 话 框, 如 图 5 唱 3 所 示 设 定 索 引 的 各 属 性 图 5 唱 2 管 理 索 引 对 话 框 图 5 唱 3 新 建 索 引 对 话 框 (3) 在 新 建 索 引 对 话 框 上 的 索 引 名 称 文 本 框 中 输 入 所 要 创 建 的 索 引 名 称, 并 在 输 入 框 下 面 的 表 中 各 列 的 列 表 中 选 择 需 要 创 建 索 引 的 列 对 于 复 合 索 引, 使 用 更 改 列 顺 序 中 的 向 上 向 下 按 钮 调 整 各 组 合 列 的 组 合 顺 序
第 5 章 索 引 及 其 应 用 111 接 下 来, 可 以 对 索 引 选 项 进 行 设 置, 用 户 只 需 要 选 择 各 复 选 按 钮 即 可 方 便 地 设 置 各 索 引 选 项, 如 是 否 设 置 惟 一 索 引 等, 完 成 所 有 的 设 置 工 作 后, 单 击 确 定 按 钮 完 成 索 引 的 创 建 工 作 如 果 单 击 对 话 框 左 下 角 的 编 辑 SQ L 按 钮, 将 弹 出 如 图 5 唱 4 所 示 的 编 辑 T ransact 唱 SQ L 脚 本 对 话 框, 用 户 在 修 改 完 SQ L 脚 本 后, 单 击 执 行 按 钮,SQ L Server 将 自 动 按 照 SQ L 语 句 完 成 索 引 的 创 建 工 作 图 5 唱 4 编 辑 Transact 唱 SQL 脚 本 2. 利 用 索 引 向 导 创 建 索 引 (1) 在 企 业 管 理 器 中, 从 工 具 菜 单 中 选 择 向 导 命 令, 打 开 选 择 向 导 对 话 框 (2) 单 击 选 择 向 导 对 话 框 中 数 据 库 左 边 的 加 号 图 标, 然 后 选 择 创 建 索 引 向 导, 如 图 5 唱 5 所 示 (3) 单 击 确 定 按 钮, 打 开 欢 迎 使 用 创 建 索 引 向 导 对 话 框 (4) 在 向 导 的 欢 迎 对 话 框 中, 单 击 下 一 步 按 钮, 打 开 选 择 数 据 库 和 表 对 话 框 (5) 在 该 对 话 框 中, 从 数 据 库 名 称 下 拉 列 表 框 中 选 择 student 数 据 库, 从 对 象 名 中 选 择 stud_info 表 如 图 5 唱 6 所 示 (6) 选 择 好 数 据 库 和 数 据 表 之 后, 单 击 下 一 步 按 钮, 打 开 当 前 索 引 信 息 窗 口, 如 图 5 唱 7 在 该 窗 口 中, 显 示 了 目 前 已 存 在 的 索 引 图 5 唱 5 创 建 索 引 向 导
112 SQL Server 数 据 库 应 用 技 术 图 5 唱 6 选 择 数 据 库 和 表 图 5 唱 7 当 前 的 索 引 信 息 (7) 单 击 下 一 步 按 钮, 打 开 选 择 列 对 话 框, 如 图 5 唱 8 所 示 我 们 从 中 选 择 需 要 建 索 引 的 列, 如 学 号 出 生 日 期 (8) 单 击 下 一 步 按 钮, 打 开 指 定 索 引 选 项 对 话 框, 在 这 里 设 置 索 引 的 属 性, 可 以 设 置 聚 集 索 引 或 惟 一 索 引, 还 可 设 置 填 充 因 子, 如 图 5 唱 9 所 示 (9) 指 定 索 引 选 项 后, 单 击 下 一 步 按 钮, 出 现 创 建 完 成 对 话 框, 如 图 5 唱 10 所 示 在 其 名 称 文 本 框 中 为 新 建 索 引 指 定 一 个 名 称, 然 后 单 击 完 成 按 钮 出 现 消 息 提 示 创 建 索 引 成 功 时, 单 击 确 定 按 钮, 完 成 索 引 创 建
第 5 章 索 引 及 其 应 用 113 图 5 唱 8 选 择 列 图 5 唱 9 指 定 索 引 选 项 图 5 唱 10 创 建 完 成
114 SQL Server 数 据 库 应 用 技 术 5.2.2 使 用 Transact 唱 SQL 创 建 索 引 1. 使 用 Transact 唱 SQL 命 令 创 建 索 引 的 语 法 格 式 CREATE [ UNIQUE ] [ CLUSTERED NONCLUSTERED ] INDEX index_name ON { table view } ( column [ ASC DESC ] [,...n ] ) [WITH [PAD_INDEX] [[,]FILLFACTOR = fillfactor] [[,]IGNORE_DUP_KEY] [[,]DROP_EXISTING] [[,]STATISTICS_NORECOMPUTE] [[,]SORT_IN_TEMPDB] ] [ON filegroup] 2. 语 法 注 释 瞯 U NIQ UE : 为 表 或 视 图 创 建 惟 一 索 引 ( 不 允 许 存 在 索 引 值 相 同 的 两 行 ) 视 图 上 的 聚 集 索 引 必 须 是 U NIQ UE 索 引 瞯 CL U S T ERED : 创 建 一 个 对 象, 其 中 行 的 物 理 排 序 与 索 引 排 序 相 同, 并 且 聚 集 索 引 的 最 低 一 级 ( 叶 级 ) 包 含 实 际 的 数 据 行 一 个 表 或 视 图 只 允 许 同 时 有 一 个 聚 集 索 引 具 有 聚 集 索 引 的 视 图 称 为 索 引 视 图 必 须 先 为 视 图 创 建 惟 一 聚 集 索 引, 然 后 才 能 为 该 视 图 定 义 其 他 索 引 在 创 建 任 何 非 聚 集 索 引 之 前 创 建 聚 集 索 引 创 建 聚 集 索 引 时 重 建 表 上 现 有 的 非 聚 集 索 引 如 果 没 有 指 定 CL US T ERED, 则 创 建 非 聚 集 索 引 瞯 NONCL U S T ERED : 创 建 一 个 指 定 表 的 逻 辑 排 序 的 对 象 对 于 非 聚 集 索 引, 行 的 物 理 排 序 独 立 于 索 引 排 序 非 聚 集 索 引 的 叶 级 包 含 索 引 行 每 个 索 引 行 均 包 含 非 聚 集 键 值 和 一 个 或 多 个 行 定 位 器 ( 指 向 包 含 该 值 的 行 ) 如 果 表 没 有 聚 集 索 引, 行 定 位 器 就 是 行 的 磁 盘 地 址 如 果 表 有 聚 集 索 引, 行 定 位 器 就 是 该 行 的 聚 集 索 引 键 瞯 index_name : 是 索 引 名 索 引 名 在 表 或 视 图 中 必 须 惟 一, 但 在 数 据 库 中 不 必 惟 一 索 引 名 必 须 遵 循 标 识 符 规 则 瞯 table : 包 含 要 创 建 索 引 的 列 的 表 可 以 选 择 指 定 数 据 库 和 表 所 有 者 瞯 view : 要 建 立 索 引 的 视 图 的 名 称 瞯 column : 应 用 索 引 的 列 指 定 两 个 或 多 个 列 名, 可 为 指 定 列 的 组 合 值 创 建 组 合 索 引 在 table 后 的 圆 括 号 中 列 出 组 合 索 引 中 要 包 括 的 列 ( 按 排 序 优 先 级 排 列 ) 瞯 ASC DESC : 用 来 指 定 索 引 列 的 排 序 方 式,ASC 是 升 序,DESC 是 降 序 瞯 PAD_INDEX : 用 来 指 定 索 引 中 间 级 中 每 个 页 ( 节 点 ) 上 保 持 开 放 的 空 间 瞯 FIL LFAC T OR( 填 充 因 子 ) : 指 定 在 SQ L Server 创 建 索 引 的 过 程 中, 各 索 引 页 叶 级 的 填 满 程 度 瞯 IGNORE_DU P_KEY : 该 选 项 控 制 当 尝 试 向 属 于 惟 一 聚 集 索 引 的 列 插 入 重 复 的 键 值 时 所 发 生 的 情 况
第 5 章 索 引 及 其 应 用 115 瞯 DROP_EXIS TING : 用 来 指 定 应 除 去 并 重 建 已 命 名 的 先 前 存 在 的 聚 集 索 引 或 非 聚 集 索 引 瞯 S T A TIS TICS_NORECO M P U T E : 用 来 指 定 过 期 的 索 引 统 计 不 会 自 动 重 新 计 算 瞯 SOR T_IN_TEMPDB : 指 定 用 于 生 成 索 引 的 中 间 排 序 结 果 将 存 储 在 tempdb 数 据 库 中 瞯 ON filegroup : 用 来 在 给 定 的 filegroup 上 创 建 指 定 的 索 引 3. 简 单 例 子 例 5.1 在 数 据 库 student 中 的 stud_grade 表 中 stud_id 列 上 创 建 名 为 stud_id_ index 的 聚 集 索 引 USE student GO CREATE CLUSTERED INDEX stud_id_index ON stud_grade (stud_id) GO 当 用 户 向 表 中 添 PRIM A T RY KEY 约 束 或 U NIQ UE 约 束 时,SQ L Server 将 自 动 为 建 有 这 些 约 束 的 列 创 建 聚 集 索 引 当 用 户 从 该 表 中 删 除 PRIM ARY KEY 约 束 或 U NIQ UE 约 束 时, 这 些 列 上 创 建 的 聚 集 索 引 也 将 被 自 动 删 除 每 张 数 据 表 上 只 能 存 在 一 个 聚 集 索 引 例 5.2 在 数 据 库 student 中 的 stud _ grade 表 中 course _ id 列 上 创 建 名 为 CourseIndex 的 非 聚 集 索 引 USE student GO CREATE NONCLUSTERED INDEX CurseIndex ON stud_grade (course_id) GO 如 果 没 有 指 定 索 引 类 型,SQ L Server 将 使 用 非 聚 集 索 引 作 为 默 认 的 索 引 类 型, 当 在 同 一 张 表 中 建 立 聚 集 索 引 和 非 聚 集 索 引 时, 应 先 建 立 聚 集 索 引 后 建 立 非 聚 集 索 引 如 果 先 建 有 非 聚 集 索 引, 当 建 立 聚 集 索 引 时,SQ L Server 会 自 动 将 非 聚 集 索 引 删 除, 然 后 再 重 新 建 立 非 聚 集 索 引 例 5.3 在 数 据 库 student 的 stud_grade 表 stud_id 列 上 创 建 名 为 id_index 的 惟 一 索 引 USE student GO CREATE UNIQUE INDEX id_index ON stud_grade (stud_id) GO 例 5.4 在 数 据 库 student 的 stud_grade 表 中 course_id 列 和 grade 列 上 创 建 名 为 course_grade_index 的 复 合 索 引
116 SQL Server 数 据 库 应 用 技 术 USE student GO CREATE INDEX course_grade_index ON stud_grade (course_id, grade) GO 4. 设 置 索 引 选 项 FILLFACTOR (1) 设 置 FILLFAC T OR 值 时, 应 考 虑 如 下 因 素 : 填 充 因 子 的 值 是 从 0 到 100 之 间 的 百 分 比 数 值, 用 来 指 定 在 创 建 索 引 后 对 数 据 页 的 填 充 比 例 值 为 100 时 表 示 页 将 填 满, 所 留 出 的 存 储 空 间 量 最 小 只 有 当 不 会 对 数 据 进 行 更 改 时 ( 例 如 在 只 读 表 中 ) 才 会 使 用 此 设 置 值 越 小 则 数 据 页 上 的 空 闲 空 间 越 大, 这 样 可 以 减 少 在 索 引 增 长 过 程 中 对 数 据 页 进 行 拆 分 的 需 要, 但 需 要 更 多 的 存 储 空 间 当 表 中 数 据 会 发 生 更 改 时, 这 种 设 置 更 为 适 当 (2) 使 用 sp_configure 系 统 存 储 过 程 可 以 在 服 务 器 级 别 设 置 默 认 的 填 充 因 子 (3) 填 充 因 子 只 在 创 建 索 引 时 执 行 ; 索 引 创 建 后, 当 表 中 进 行 数 据 的 添 加 删 除 或 更 新 时, 不 会 保 持 填 充 因 子 例 5.5 为 student 数 据 库 中 学 生 成 绩 表 (stud_grade) 创 建 基 于 学 号 列 的 非 聚 集 索 引 xh1_index, 其 填 充 因 子 值 为 60 USE student GO CREATE INDEX xh1_index ON stud_grade (stud_id) WIT H FILLFACTOR = 60 GO (4) FILLFAC T OR 选 项 用 来 指 定 各 索 引 页 叶 级 的 填 满 程 度, 对 于 非 叶 级 索 引 页 需 要 使 用 PAD_INDEX 选 项 设 置 其 预 留 空 间 的 大 小 PAD _ INDEX 选 项 只 有 在 指 定 了 FIL LFAC T OR 时 才 有 用, 因 为 PAD_INDEX 使 用 由 FIL LFAC T OR 所 指 定 的 百 分 比 如 果 为 FILLFAC T OR 指 定 的 百 分 比 不 够 大, 无 法 容 纳 一 行,SQ L Server 将 在 内 部 使 用 允 许 的 最 小 值 替 代 该 百 分 比 例 5.6 为 student 数 据 库 中 学 生 成 绩 表 (stud_grade) 创 建 基 于 学 号 列 的 非 聚 集 索 引 xh2_index, 其 FIL LFAC T OR 和 PAD_INDEX 选 项 值 均 为 60 USE student GO CREATE INDEX xh2_index ON stud_grade (stud_id) WIT H PAD_INDEX, FILLFACTOR = 60 GO 5.2.3 索 引 的 分 析 与 维 护 1. 索 引 分 析 SQ L Server 提 供 了 多 种 分 析 索 引 和 查 询 性 能 的 方 法, 常 用 的 有 S H OWPL A N 和 S T A TIS TICS IO 语 句 (1) S H OWPL A N 语 句 用 来 显 示 查 询 语 句 的 执 行 信 息, 包 含 查 询 过 程 中 连 接 表 时 所
第 5 章 索 引 及 其 应 用 117 采 取 的 每 个 步 骤 以 及 选 择 哪 个 索 引 其 语 法 格 式 为 : SET SHOWPLAN_ALL { ON OFF } 厄 SET SHOWPLAN_TEXT { ON OFF } (2) S T A TIS TICS IO S T A TIS TICS IO 语 句 用 来 显 示 执 行 数 据 检 索 语 句 所 花 费 的 磁 盘 活 动 量 信 息, 可 以 利 用 这 些 信 息 来 确 定 是 否 重 新 设 计 索 引 其 语 法 格 式 为 : SET STATISTICS IO {ON OFF} 例 5.7 在 student 库 中 的 stud_info 表 上 查 询 所 有 男 生 的 姓 名 和 年 龄, 并 显 示 查 询 处 理 过 程 中 的 磁 盘 活 动 统 计 信 息 其 程 序 清 单 如 下 : SET SHOWPLAN_ALL OFF GO SET STATISTICS IO ON GO SELECT name AS 姓 名,YEAR(GETDATE()) 唱 YEAR(birthday) AS 年 龄 FROM stud_info WHERE gender = 男 GO 消 息 窗 格 显 示 : 表 stud_info 扫 描 计 数 1, 逻 辑 读 1 次, 物 理 读 0 次, 预 读 0 次 2. 索 引 维 护 SQ L Server 提 供 了 多 种 维 护 索 引 的 方 法, 常 用 的 有 DBCC S H OWCON TIG DBCC INDEXDEFRAG 语 句 (1) DBCC S H OWCON T IG 语 句 DBCC S H OWCON T IG 语 句 用 来 显 示 指 定 表 的 数 据 和 索 引 的 碎 片 信 息 当 对 表 进 行 大 量 的 修 改 或 添 加 数 据 之 后, 应 该 执 行 此 语 句 来 查 看 有 无 碎 片 其 语 法 格 式 如 下 : DBCC SHOWCONTIG ( [{table_name table_id view_name view_id}, index_name index_id ] ) (2) DBCC DBREINDEX 语 句 DBCC DBREINDEX 语 句 的 作 用 是 整 理 表 中 索 引 碎 片, 其 语 法 格 式 为 : DBCC INDEXDEFRAG ( {database_name database_id},{table_name table_id view_name view_id}, { index_name index_id} ) 例 5.8 清 除 student 库 中 stud_grade 表 的 索 引 stud_id_index 上 的 碎 片 USE student GO DBCC INDEXDEFRAG(student, stud_grade, stud_id_index) GO
118 SQL Server 数 据 库 应 用 技 术 5.3 索 引 统 计 5.3.1 创 建 和 修 改 统 计 信 息 SQ L Server 可 以 为 索 引 列 创 建 统 计 信 息 SQ L Server 为 维 护 某 一 个 索 引 关 键 值 的 分 布 统 计 信 息, 并 且 使 用 这 些 统 计 信 息 来 确 定 在 查 询 过 程 中 哪 一 个 索 引 是 有 用 的 查 询 的 优 化 依 赖 于 这 些 统 计 信 息 的 分 布 准 确 度 当 表 中 数 据 发 生 变 化 时,SQ L Server 周 期 性 地 自 动 修 改 统 计 信 息 索 引 统 计 被 自 动 地 修 改, 索 引 中 的 关 键 值 显 著 变 化 统 计 信 息 修 改 的 频 率 由 索 引 中 的 数 据 量 和 数 据 改 变 量 确 定 例 如, 如 果 表 中 有 10 000 行 数 据,1000 行 数 据 修 改 了, 那 么 统 计 信 息 可 能 需 要 修 改 然 而, 如 果 只 有 50 行 记 录 修 改 了, 那 么 仍 然 保 持 当 前 的 统 计 信 息 索 引 统 计 信 息 既 可 以 自 动 创 建, 也 可 以 使 用 CREA T E S T A TIS TICS 语 句 在 数 据 表 的 某 一 列 或 多 列 上 创 建 还 可 以 使 用 U PDA T E S T A TICS 语 句 或 sp_updatestats 系 统 存 储 过 程 来 手 工 修 改 统 计 信 息 1. 使 用 CREATE STATISTICS 创 建 统 计 信 息 (1) 创 建 统 计 信 息 语 法 格 式 CREATE STATISTICS statistics_name ON { table view } ( column [,...n ]) [ WITH [ [ FULLSCAN SAMPLE number { PERCENT ROWS } ] [,]] [ NORECOMPUTE ] ] (2) 语 法 注 释 瞯 statistics_name 表 示 要 创 建 的 统 计 信 息 名 称 瞯 table 是 要 在 其 上 创 建 命 名 统 计 的 表 名 table 是 与 column 关 联 的 表 可 以 选 择 是 否 指 定 表 所 有 者 的 名 称 通 过 指 定 合 法 的 数 据 库 名 称, 可 以 在 其 他 数 据 库 中 的 表 上 创 建 统 计 瞯 view 是 要 在 其 上 创 建 命 名 统 计 的 视 图 名 瞯 column 是 要 在 其 上 创 建 统 计 的 一 列 或 一 组 列 的 名 称 瞯 F U L LSCA N 指 定 应 读 取 table 中 的 所 有 行 以 收 集 统 计 信 息 指 定 F U LLSCA N 具 有 与 SA M PLE 100 PERCEN T 相 同 的 行 为 此 选 项 不 能 与 SA M PLE 选 项 一 起 使 用 瞯 SA M PLE number{percen T ROWS} 指 定 应 使 用 随 机 采 样 来 读 取 一 定 百 分 比 或 指 定 行 数 的 数 据 以 收 集 统 计 信 息 number 只 能 为 整 数, 如 果 是 PERCEN T, number 应 介 于 0 到 100 之 间 ; 如 果 是 ROWS,number 可 以 是 从 0 到 n 的 总 行 数 此 选 项 不 能 与 F U LLSCA N 选 项 一 起 使 用 如 果 没 有 给 出 SA M PLE 或
第 5 章 索 引 及 其 应 用 119 F U L LSCA N 选 项,SQ L Server 会 计 算 出 一 个 自 动 样 本 (3) 简 单 例 子 例 5.9 在 数 据 库 student 的 stud_grade 表 上 创 建 的 名 为 grade_statis 的 统 计, 该 统 计 基 于 stud_grade 表 中 course_id 列 和 grade 列 的 百 分 之 五 的 数 据 计 算 随 机 采 样 统 计 CREATE ST ATISTICS grade_statis ON stud_grade(course_id,grade) WIT H SAMPLE 5 PERCENT GO 2. 使 用 sp_createstats 在 所 有 用 户 表 上 创 建 统 计 使 用 sp_createstats 系 统 存 储 过 程 可 以 为 当 前 数 据 库 中 全 部 用 户 表 的 所 有 列 创 建 单 列 统 计, 并 且 也 可 以 用 它 来 手 工 修 改 统 计 信 息 其 语 法 格 式 : sp_createstats [[ @ indexonly = ] indexonly ] [,[ @ fullscan = ] fullscan ] [,[ @ norecompute = ] norecompute ] 其 中 的 参 数 含 义 如 下 : 瞯 [ @ indexonly = ] indexonly 指 定 只 有 参 与 索 引 的 列 才 考 虑 创 建 统 计 indexonly 的 数 据 类 型 为 char(9), 默 认 值 为 N O 瞯 [ @ fullscan = ] fullscan 指 定 F U L LSCA N 选 项 与 CREA T E S T A TIS TICS 语 句 一 同 使 用 如 果 省 去 fullscan, 则 SQ L Server 执 行 一 个 默 认 的 实 例 扫 描 fullscan 的 数 据 类 型 为 char(9), 默 认 值 为 NO 瞯 [ @ norecompute = ] norecompute 指 定 对 新 创 建 的 统 计 禁 用 自 动 重 新 计 算 统 计 norecompute 的 数 据 类 型 为 char(12), 默 认 值 为 NO 执 行 系 统 存 储 过 程 sp_createstats 之 后, 如 果 返 回 0 则 表 示 创 建 统 计 成 功, 返 回 1 则 表 示 创 建 统 计 失 败 例 5.10 为 student 数 据 库 的 全 部 用 户 表 的 所 有 列 创 建 统 计 SET STATISTICS IO OFF EXEC sp_updatestats 消 息 窗 格 显 示 : 已 更 新 了 所 有 表 的 统 计 3. 手 动 更 新 统 计 信 息 STATISTICS SQ L Server 用 户 可 以 通 过 执 行 U PDA T E S T A TIS TICS 语 句 手 动 更 新 统 计 信 息 前 面 已 经 讲 过, 如 果 数 据 表 中 发 生 数 据 修 改 的 行 很 多, 那 么 其 统 计 信 息 需 要 修 改 例 如, 图 5 唱 11 表 示 在 查 询 分 析 器 中 执 行 U PDA T E S T A TIS TICS 语 句 命 令, 修 改 了 student 数 据 库 stud_grade 表 中 全 部 索 引 的 统 计 信 息 5.3.2 统 计 信 息 的 查 看 与 删 除 1. 查 询 表 的 统 计 信 息 创 建 了 表 的 统 计 之 后, 可 以 使 用 DBCC SH OW_S T A TIS TICS 来 显 示 指 定 表 上 的 指
120 SQL Server 数 据 库 应 用 技 术 图 5 唱 11 手 动 更 新 统 计 信 息 定 目 标 的 当 前 统 计 信 息 其 语 法 如 下 : DBCC SHOW_STATISTICS (table,target) 其 中 参 数 如 下 : 瞯 table 表 名, 表 示 要 显 示 该 表 的 统 计 信 息 瞯 Target 索 引 名 称 或 集 合, 表 示 要 显 示 该 对 象 的 统 计 信 息 注 意 : 所 返 回 的 结 果 指 明 索 引 的 选 择 性 ( 所 返 回 的 密 度 越 低, 选 择 性 越 大 ), 并 提 供 用 于 确 定 索 引 对 查 询 优 化 器 是 否 有 用 的 基 本 信 息 例 如, 显 示 student 数 据 库 表 stud_grad 中 索 引 nameindex 的 统 计 信 息, 其 T ransact 唱 SQ L 语 句 及 运 行 结 果 如 图 5 唱 12 所 示 图 5 唱 12 查 询 表 的 统 计 信 息
第 5 章 索 引 及 其 应 用 121 2. 删 除 列 的 统 计 信 息 SQ L Server 提 供 了 DROP S T A TIS TIC 命 令 来 删 除 指 定 数 据 表 列 的 统 计 信 息 例 5.11 删 除 前 面 所 创 建 的 统 计 信 息 stud_statis DROP ST ATISTICS stud_grade.grade_statis 5.4 查 看 与 删 除 索 引 5.4.1 查 看 表 中 的 索 引 1. 使 用 企 业 管 理 器 查 看 索 引 信 息 (1) 在 企 业 管 理 器 中, 选 择 需 要 的 表, 右 击 该 表 在 弹 出 的 菜 单 中 选 择 所 有 任 务 下 的 管 理 索 引 命 令, 打 开 管 理 索 引 对 话 框 (2) 在 管 理 索 引 对 话 框 的 现 有 索 引 列 表 中 列 出 了 当 前 表 中 有 多 少 索 引 以 及 每 个 索 引 的 名 称 类 型 和 关 键 值 (3) 如 果 需 要 了 解 某 个 索 引 更 加 详 细 的 信 息, 选 择 该 索 引, 单 击 编 辑 按 钮, 在 弹 出 的 编 辑 现 有 索 引 对 话 框 中, 可 以 看 到 当 前 索 引 的 详 细 信 息, 如 图 5 唱 13 所 示 图 5 唱 13 编 辑 现 有 索 引 对 话 框 2. 使 用 系 统 存 储 过 程 查 看 索 引 信 息 (1) 语 法 格 式 [EXEC] sp_helpindex table_name
122 SQL Server 数 据 库 应 用 技 术 (2) 简 单 例 子 例 5.12 用 系 统 存 储 过 程 sp_helpindex 查 看 student 数 据 库 中 stud_info 表 的 索 引 信 息 USE student GO EXEC sp_helpindex stud_info GO 在 查 询 分 析 器 中 输 入 并 运 行 上 述 语 句, 执 行 完 毕 后, 可 以 看 到 如 图 5 唱 14 所 示 的 查 询 结 果 其 结 果 描 述 了 索 引 的 名 称 索 引 类 型 索 引 建 立 在 哪 个 列 上 等 信 息 图 5 唱 14 查 看 表 中 的 索 引 3. 查 看 索 引 使 用 的 空 间 信 息 SQ L Server 提 供 的 系 统 存 储 过 程 sp_spaceused, 可 以 查 看 当 前 数 据 库 中 索 引 所 使 用 的 磁 盘 空 间 如 图 5 唱 15 所 示, 其 中 结 果 窗 口 中 的 index_size 列 值 是 数 据 库 student 中 的 索 引 使 用 的 空 间 信 息 4. 查 看 索 引 属 性 SQ L Server 提 供 的 T ransact 唱 SQ L 命 令 INDEXPROPER T Y 能 够 在 给 定 表 标 识 号 索 引 名 称 及 属 性 名 称 的 前 提 下, 返 回 指 定 查 看 的 索 引 属 性 值 其 语 法 以 及 参 数 说 明 如 下 : INDEXPROPERTY (table_id, index, property) 其 中 : 瞯 table_id 是 包 含 要 为 其 提 供 索 引 属 性 信 息 的 表 ( 或 视 图 ) 标 识 号 的 表 达 式
第 5 章 索 引 及 其 应 用 123 图 5 唱 15 查 看 索 引 使 用 的 空 间 信 息 瞯 index 是 一 个 包 含 索 引 的 名 称 的 表 达 式, 将 为 该 索 引 返 回 属 性 信 息 瞯 property 包 含 将 要 返 回 的 数 据 库 属 性 的 名 称 例 5.13 为 student 数 据 库 stud _ grade 表 的 course _ grade _ index 索 引 返 回 IsPadIndex 属 性 的 设 置 USE student SELECT INDEXPROPERTY(OBJECT_ID( stud_grade ), course_grade_index, IsPadIndex ) 5.4.2 索 引 更 名 与 删 除 1. 使 用 系 统 存 储 过 程 给 索 引 更 名 (1) 语 法 格 式 sp_rename [ @ objname = ] object_name, [ @ newname = ] new_name [,[ @ objtype = ] object_type ] (2) 举 例 说 明 例 5.14 将 student 数 据 库 中 stud_grade 表 的 course_grade_index 索 引 名 称 更 改 为 cg_index USE student GO EXEC sp_rename stud_grade.course_grade_index, cg_index GO
124 SQL Server 数 据 库 应 用 技 术 2. 在 企 业 管 理 器 中 删 除 索 引 如 果 不 再 需 要 表 上 的 某 个 索 引 或 是 表 上 的 某 个 索 引 已 经 对 系 统 性 能 造 成 负 面 影 响 时, 用 户 就 需 要 删 除 该 索 引 同 样 的,SQ L Server 提 供 了 两 种 方 法 途 径 来 删 除 索 引, 一 种 是 企 业 管 理 器, 另 一 种 是 T ransact 唱 SQ L 命 令 语 句 下 面 介 绍 使 用 企 业 管 理 器 删 除 索 引 (1) 在 企 业 管 理 器 中, 选 择 要 删 除 索 引 的 表, 右 击 该 表 在 弹 出 的 菜 单 中 选 择 所 有 任 务 下 的 管 理 索 引 命 令, 打 开 管 理 索 引 对 话 框 (2) 在 管 理 索 引 对 话 框 的 现 有 索 引 列 表 中 选 择 需 要 删 除 的 索 引, 单 击 删 除 按 钮 后, 出 现 一 个 消 息 框, 让 用 户 确 认 是 否 删 除 索 引, 单 击 是 按 钮, 即 可 删 除 索 引, 如 图 5 唱 16 所 示 图 5 唱 16 删 除 索 引 3. 使 用 DROP INDEX 语 句 删 除 索 引 (1) 语 法 格 式 DROP INDEX table_name.index_name [,...n] (2) 简 单 例 子 例 5.15 删 除 student 数 据 库 stud_ grade 表 中 stud_id 列 上 所 创 建 的 聚 集 索 引 stud_id_index USE student GO DROP INDEX stud_grade.stud_id_index GO
第 5 章 索 引 及 其 应 用 125 实 训 1. 实 训 目 的 (1) 了 解 索 引 的 作 用 (2) 学 会 使 用 企 业 管 理 器 或 查 询 分 析 器 创 建 索 引 (3) 学 会 创 建 惟 一 聚 集 复 合 索 引 (4) 学 会 查 看 和 修 改 索 引 选 项, 以 及 给 索 引 改 名 和 删 除 索 引 2. 实 训 的 知 识 准 备 索 引 是 一 种 重 要 的 数 据 库 对 象, 它 保 存 着 数 据 表 中 一 列 或 几 列 组 合 的 排 序 结 构 创 建 索 引 可 以 加 快 查 询 速 度 加 快 表 的 连 接 和 排 序 ; 但 是 创 建 索 引 需 要 占 用 磁 盘 空 间 并 花 费 一 定 的 时 间 ; 维 护 索 引 也 会 花 费 时 间 和 减 慢 数 据 修 改 速 度 这 里, 要 求 充 分 理 解 使 用 索 引 的 意 义 代 价 原 则, 能 使 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 (CREA T E INDEX DROP INDEX EXEC sp_rename) 创 建 删 除 及 重 命 名, 能 使 用 SH OWPLA N_ A LL U PDA T A S T A TIS TICS DBCC SH OWCON TIG 等 语 句 进 行 分 析 和 维 护 3. 实 训 内 容 和 步 骤 (1) 建 立 索 引 对 student 数 据 库 的 stud_info 学 生 信 息 表 中 的 学 号 stud_id 列 建 立 一 个 名 为 xh_ index 索 引 在 查 询 分 析 器 编 辑 窗 口 中 输 入 如 下 语 句 并 执 行 : USE student GO CREATE INDEX xh_index ON 自 行 练 习 : 在 teacher_info 表 上 基 于 teacher_id 创 建 惟 一 索 引 (2) 创 建 一 个 复 合 索 引 为 了 方 便 按 入 学 成 绩 和 学 号 查 找 学 生, 为 stud_info 学 生 信 息 表 创 建 一 个 基 于 入 学 成 绩, 学 号 组 合 列 的 非 聚 集 复 合 索 引 cj_xh_index, 其 语 句 如 下 : USE student GO CREATE INDEX cj_xh_index ON 自 行 练 习 : 在 teacher_info 表 上 基 于 teacher_id,couser_id 组 合 列 创 建 非 聚 集 复 合 索 引 (3) 创 建 一 个 聚 集 复 合 索 引 为 学 生 成 绩 表 (stud_grade) 创 建 一 个 基 于 学 号, 课 程 号 组 合 列 的 聚 集 复 合 索 引 xhkc_index, 其 语 句 如 下 :
126 SQL Server 数 据 库 应 用 技 术 USE student GO CREATE CLUSTERED INDEX xhkc_index ON 自 行 练 习 : 在 teacher_info 表 上 基 于 salary 列 创 建 聚 集 索 引 (4) 创 建 一 个 惟 一 聚 集 复 合 索 引 为 课 程 信 息 表 (lesson_info) 创 建 一 个 基 于 课 程 号, 课 程 类 型 组 合 列 的 惟 一 聚 集 复 合 索 引 kc_lx_index, 其 语 句 如 下 : USE student GO CREATE INDEX kc_lx_index WIT H PAD_INDEX, FILLFACTOR = 80, IGNORE_DUP_KEY 自 行 练 习 : 在 teacher _ info 表 上 基 于 telephone 列 的 非 聚 集 索 引, 其 填 充 因 子 值 为 60 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 引 入 索 引 的 主 要 目 的 是 什 么? (2) 对 已 经 建 立 的 学 生 成 绩 表 (stud_grade) 中 的 课 程 号 (course_id) 列 创 建 一 个 名 为 stud_course_id_idx 的 索 引 (3) 删 除 索 引 时 所 对 应 的 数 据 表 会 删 除 吗? (4) 用 下 列 语 句 建 立 表 addresses 当 表 被 建 立 时, 将 自 动 建 立 多 少 个 索 引? CREATE T ABLE addresses (NAME VARCH AR(40) PRIM ARY KEY STREET VARCH AR(40), CIT Y VARCH AR(40), STATE CHAR(2) REFERENCES STATE(ST 唱 CODE), ZIP DECIMAL(6,0) NOT NULL, PHONE VARCHAR(15) UNIQUE ) (5) 试 说 明 SQ L Server 当 中 聚 集 索 引 和 非 聚 集 索 引 的 区 别 (6) 请 说 明 下 列 命 令 的 功 用 EXEC sp_helpindex teacher_info (7) 如 何 查 询 用 户 所 建 立 的 索 引 信 息?
第 5 章 索 引 及 其 应 用 127 2. 写 出 下 列 SQL 命 令, 并 在 机 器 进 行 测 试 (1) 为 课 程 信 息 表 (lesson_info) 的 课 程 号 (course_id) 创 建 索 引 course_id_idx (2) 重 新 命 名 索 引 course_id_idx course_idx (3) 删 除 已 经 建 立 的 索 引 course_idx (4) 为 学 生 基 本 信 息 表 (stud_info) 的 姓 名 创 建 索 引 name_idx, 并 指 定 索 引 的 物 理 和 存 储 特 征 值, 数 据 库 中 的 行 以 升 序 保 存 (5) 为 student 数 据 库 中 院 系 代 码 表 (dept_code) 创 建 基 于 院 系 代 码 列 的 非 聚 集 索 引 yxdm_index, 其 填 充 因 子 值 为 60 (6) 说 明 下 列 语 句 的 作 用, 以 及 参 数 FILLFAC T OR 和 PAD_INDEX 的 意 义 CREATE CLUSTERED INDEX kz_index ON lesson_info (course_id) WIT H PAD_INDEX,FILLFACTOR = 60 (7) 在 student 库 中 的 stud_info 表 上 查 询 所 有 男 生 的 姓 名 和 年 龄, 并 显 示 查 询 处 理 过 程 中 的 磁 盘 活 动 统 计 信 息 (8) 清 除 student 库 中 stud_info 表 的 索 引 pk_xuehao 上 的 碎 片
第 6 章 SQL Server 的 数 据 查 询 在 前 面 的 章 节 中 已 经 学 习 使 用 了 SELEC T 语 句 进 行 查 询 SELEC T 语 句 是 数 据 库 应 用 技 术 的 核 心, 学 习 SQ L Server 过 程 中 可 能 用 得 最 多 的 就 是 SELEC T 语 句 了 SELEC T 语 句 格 式 除 了 一 些 基 本 参 数 外, 还 有 大 量 的 选 项 可 以 用 于 数 据 查 询 当 构 造 SELEC T 语 句 的 时 候, 熟 悉 所 有 的 可 能 选 项 将 会 更 有 效 地 实 现 数 据 查 询 本 章 将 学 习 这 些 技 能, 即 详 细 对 SELEC T 语 句 的 通 用 形 式 及 使 用 进 行 阐 述 6.1 SELECT 语 句 中 的 数 学 问 题 6.1.1 SQL Server 中 的 变 量 T ransact 唱 SQ L 语 言 中 有 两 种 形 式 的 变 量, 一 种 是 用 户 自 己 定 义 的 局 部 变 量, 另 外 一 种 是 系 统 提 供 的 全 局 变 量 1. 局 部 变 量 局 部 变 量 是 一 个 能 够 拥 有 特 定 数 据 类 型 的 对 象, 它 的 作 用 范 围 仅 限 制 在 程 序 内 部 局 部 变 量 可 以 作 为 计 数 器 来 计 算 循 环 执 行 的 次 数, 或 是 控 制 循 环 执 行 的 次 数 另 外, 利 用 局 部 变 量 还 可 以 保 存 数 据 值, 以 供 控 制 流 语 句 测 试 以 及 保 存 由 存 储 过 程 返 回 的 数 据 值 等 局 部 变 量 被 引 用 时 要 在 其 名 称 前 加 上 标 志 @, 而 且 必 须 先 用 DECL ARE 命 令 定 义 后 才 可 以 使 用 其 说 明 形 式 如 下 : DECLARE @ variable_name datatype [, @ variable_name datatype...] 在 T ransact 唱 SQ L 中, 不 能 像 在 一 般 的 程 序 语 言 中 一 样 使 用 @ variable _ name = value 来 给 变 量 赋 值, 必 须 使 用 SELEC T 或 SE T 命 令 来 设 定 变 量 的 值 其 语 法 如 下 : SELECT @ variable_name = value SET @ variable_name = value 例 6.1 声 明 一 个 长 度 为 8 个 字 符 的 变 量 @ id, 并 赋 值 DECLARE @ id CHAR(8) SELECT @ id = 10010001
第 6 章 SQL Server 的 数 据 查 询 129 2. 全 局 变 量 全 局 变 量 是 SQ L Server 系 统 内 部 使 用 的 变 量, 其 作 用 范 围 并 不 局 限 于 某 一 程 序, 而 是 任 何 程 序 均 可 随 时 调 用 全 局 变 量 通 常 存 储 一 些 SQ L Server 的 配 置 设 定 值 和 效 能 统 计 数 据 用 户 可 在 程 序 中 用 全 局 变 量 来 测 试 系 统 的 设 定 值 或 T ransact 唱 SQ L 命 令 执 行 后 的 状 态 值 使 用 全 局 变 量 时 应 该 注 意 以 下 几 点 : (1) 全 局 变 量 不 是 由 用 户 的 程 序 定 义 的, 它 们 是 在 服 务 器 级 定 义 的 (2) 用 户 只 能 使 用 预 先 定 义 的 全 局 变 量 (3) 引 用 全 局 变 量 时, 必 须 以 标 记 符 @ @ 开 头 (4) 局 部 变 量 的 名 称 不 能 与 全 局 变 量 的 名 称 相 同, 否 则 会 在 应 用 程 序 中 出 现 不 可 预 测 的 结 果 3. 注 释 符 在 T ransact 唱 SQ L 中 可 使 用 两 类 注 释 符 : (1) A NSI 标 准 的 注 释 符 唱 用 于 单 行 注 释 (2) 与 C 语 言 相 同 的 程 序 注 释 符 号, 即 / 倡 倡 /,/ 倡 用 于 注 释 文 字 的 开 始, 倡 / 用 于 注 释 文 字 的 结 尾, 可 在 程 序 中 标 识 多 行 文 字 为 注 释 6.1.2 SQL Server 的 运 算 符 运 算 符 是 一 些 符 号, 它 们 能 够 用 来 执 行 算 术 运 算 字 符 串 连 接 赋 值 以 及 在 字 段 常 量 和 变 量 之 间 进 行 比 较 在 SQ L Server 2000 中, 运 算 符 主 要 有 以 下 六 大 类 : 算 术 运 算 符 赋 值 运 算 符 位 运 算 符 比 较 运 算 符 逻 辑 运 算 符 以 及 字 符 串 连 接 运 算 符 如 表 6 唱 1 所 示 表 6 唱 1 SQL Server 的 运 算 符 种 类 运 算 符 说 明 种 类 运 算 符 说 明 %, 倡 倡 取 模, 指 数 = 等 于 算 术 运 算 符 倡, / 乘 除 < >,!= 不 等 于 +, - 加 减 >, < 大 于 小 于 N O T 逻 辑 运 算 符 A N D 取 相 反 的 逻 辑 值 两 个 值 为 真 则 结 果 为 真 关 系 运 算 符 < =, > = BE T W E E N A N D 小 于 等 于 大 于 等 于 检 索 两 值 之 间 的 内 容 O R 只 要 一 个 值 为 真 结 果 就 为 真 I N 检 索 匹 配 列 表 中 的 值 & 按 位 与 ( 两 个 操 作 数 ) LI K E 检 索 匹 配 字 符 样 式 的 数 据 位 运 算 符 按 位 或 O R( 两 个 操 作 数 ) IS N U L L 检 索 空 数 据 ^ 字 符 串 + 运 算 符 按 位 异 或 ( 两 个 操 作 数 ) 将 两 个 字 符 串 连 接 起 来 赋 值 运 算 符 = 将 数 据 值 指 派 给 特 定 的 对 象 算 术 运 算 符 可 以 在 两 个 表 达 式 上 执 行 数 学 运 算, 这 两 个 表 达 式 可 以 是 数 值 数 据 分 类 的 任 何 数 据 类 型 算 术 运 算 符 包 括 加 ( + ) 减 ( - ) 乘 ( 倡 ) 除 (/) 指 数 ( 倡 倡 ) 和 取 模 ( % ) 赋 值 运 算 符 ( = ) 能 够 将 数 据 值 指 派 给 特 定 的 对 象 位 运 算 符 能 够 在 整 型 数 据 或 者 二 进 制 数 据 (image 数 据 类 型 除 外 ) 之 间 执 行 位 操 作 比 较 运 算 符 用 于 比 较 两 个 表 达 式 的 大 小 或 是 否 相 同, 其 比 较 的 结 果 是 布 尔 值, 即
130 SQL Server 数 据 库 应 用 技 术 T RUE( 表 示 表 达 式 的 结 果 为 真 ) FA LSE( 表 示 表 达 式 的 结 果 为 假 ) 以 及 U N KNOWN 除 了 text ntext 或 image 数 据 类 型 之 外, 比 较 运 算 符 可 以 用 于 其 他 数 据 类 型 的 数 据 比 较 逻 辑 运 算 符 可 以 把 多 个 关 系 表 达 式 连 接 起 来 逻 辑 运 算 符 包 括 A ND OR 和 NO T 逻 辑 运 算 符 和 比 较 运 算 符 一 样, 返 回 带 有 T RUE 或 FA LSE 值 的 布 尔 数 据 类 型 字 符 串 运 算 符 允 许 通 过 加 号 ( + ) 进 行 字 符 串 连 接, 这 个 加 号 即 被 称 为 字 符 串 连 接 运 算 符 例 如, 对 于 语 句 SELEC T made in + china, 其 结 果 为 made in china 用 运 算 符 将 常 量 变 量 函 数 连 接 起 来 的 式 子 为 表 达 式 在 一 个 表 达 式 中, 算 术 运 算 的 优 先 级 由 高 到 低 是 : 指 数 乘 除 求 模 加 减, 在 同 一 级 别 中 则 按 从 左 到 右 的 顺 序 执 行 逻 辑 运 算 的 优 先 级 由 高 到 低 是 : NOT AND OR SQL Server 运 算 符 的 优 先 级 别 如 图 6 唱 1 所 示 图 6 唱 1 SQL Server 运 算 符 的 优 先 级 别 6.1.3 SQL Server 中 的 函 数 1. 数 学 函 数 SQ L Server 的 数 学 函 数 主 要 用 来 对 数 值 表 达 式 进 行 数 学 运 算 并 返 回 运 算 结 果 数 学 函 数 可 以 对 SQ L Server 提 供 的 数 值 数 据 ( decimal integer float real money smallmoney smallint 和 tinyint) 进 行 处 理 常 用 的 数 字 函 数 如 表 6 唱 2 所 示 表 6 唱 2 常 用 数 字 函 数 函 数 描 述 函 数 描 述 A SI N(n) 反 正 弦 函 数 A SI N(n) 为 以 弧 度 表 示 的 角 度 值 A BS(n) 求 n 的 绝 对 值 A C O S(n) 反 余 弦 函 数 A C O S(n) 为 以 弧 度 表 示 的 角 度 值 EX P(n) 求 n 的 指 数 值 A T A N(n) 反 正 切 函 数 A T A N(n) 为 以 弧 度 表 示 的 角 度 值 M O D( m,n) 求 m 除 以 n 的 余 数 SI N(n) 求 正 弦 函 数,n 为 以 弧 度 为 单 位 的 角 度 CEI LI N G(n) 返 回 大 于 等 于 n 的 最 小 整 数 CO S(n) 求 余 弦 函 数,n 为 以 弧 度 为 单 位 的 角 度 F L O OR(n) 返 回 小 于 等 于 n 的 最 大 整 数 T A N(n) 求 正 切 函 数,n 为 以 弧 度 为 单 位 的 角 度 R O U N D(n,m) 对 n 做 四 舍 五 入 处 理, 保 留 m 位 DE G REES(n) 弧 度 单 位 的 角 度 转 换 为 以 度 数 为 单 位 的 角 度 S Q R T(n) 求 n 的 平 方 根 R A DI A N S(n) 度 数 单 位 的 角 度 转 换 为 以 弧 度 为 单 位 的 角 度 L O G10(n) 求 以 10 为 底 的 对 数 PI PI 的 常 量 值 3.14159265358979 L O G(n) 求 自 然 对 数 R A N D 返 回 0 ~ 1 之 间 的 随 机 值 P O W E R(n,m) 求 n 乘 指 定 次 方 m 的 值 SIG N(n) 求 n 的 符 号, 正 ( + 1) 零 (0) 或 负 ( - 1) 号 S Q U A RE(n) 求 n 的 平 方
第 6 章 SQL Server 的 数 据 查 询 131 例 6.2 在 查 询 分 析 器 中 使 用 CEILING() FLOOR() RO U ND() 函 数 SELECT ceiling(13.4), floor(13.4), round(13.4567,3) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 :14 13 13.4570 例 6.3 求 几 个 数 值 ROUND(45.923,2) ROUND(45.923,0) ROUND(45.923, - 1) 的 近 似 值 SELECT round(45.923,2), round(45.923,0), round(45.923,- 1) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 :45.920 46.000 50.000 2. 字 符 串 函 数 字 符 串 函 数 可 以 对 二 进 制 数 据 字 符 串 和 表 达 式 执 行 不 同 的 运 算, 大 多 数 字 符 串 函 数 只 能 用 于 char 和 varchar 数 据 类 型, 以 及 明 确 转 换 成 char 和 varchar 的 数 据 类 型, 少 数 几 个 字 符 串 函 数 也 可 以 用 于 binary 和 varbinary 数 据 类 型 此 外, 某 些 字 符 串 函 数 还 能 够 处 理 text ntext image 数 据 类 型 的 数 据 常 用 的 字 符 串 函 数 如 表 6 唱 3 所 示 表 6 唱 3 常 用 字 符 串 函 数 种 类 函 数 名 参 数 说 明 UPPER char_expr 小 写 字 符 串 转 换 为 大 写 字 符 串 LOWER char_expr 大 写 字 符 串 转 换 为 小 写 字 符 串 SPACE integer_expr 产 生 指 定 个 数 的 空 格 组 成 字 符 串 基 本 字 符 串 函 数 REPLICATE char_expr,integer_expr 指 定 的 次 数 重 复 字 符 串 STUFF char_ expr1,start,length,char_ expr2 在 char_expr1 字 符 串 中 从 start 开 始, 长 度 length 的 字 符 串 用 char_expr2 代 替 REVERSE char_expr 反 向 字 符 串 表 达 式 char_expr LTRIM char_expr 删 除 字 符 串 前 面 的 空 格 字 符 串 查 找 函 数 长 度 和 分 析 函 数 RTRIM char_expr 删 除 字 符 串 后 面 的 空 格 CHARINDEX char_expr1,char_expr2 [,start] 在 串 2 中 搜 索 char_expr1 的 起 始 位 置 PATINDEX % pattern %,char_expr 在 字 串 中 搜 索 pattern 出 现 的 起 始 位 置 SUBSTRING char_expr, start, length 从 start 开 始, 搜 索 length 长 度 的 子 串 LEFT char_expr,integer_expr 从 左 边 开 始 搜 索 指 定 个 数 的 子 串 RIGH T char_expr,integer_expr 从 右 边 开 始 搜 索 指 定 个 数 的 子 串 ASCII char_expr 字 符 串 最 左 端 字 符 的 ASCII 代 码 值 转 换 函 数 CHAR integer_expr ASCII 代 码 值 转 换 为 字 符 STR float_expr[,length[,decimal]] 数 值 数 据 转 换 为 字 符 型 数 据 例 6.4 先 使 用 SUBS T RING 函 数 从 字 符 串 中 获 取 指 定 的 子 字 符 串, 然 后 使 用
132 SQL Server 数 据 库 应 用 技 术 LOWER 函 数 U PPER 函 数 对 子 字 符 串 进 行 转 换, 且 把 U PPER 函 数 嵌 套 在 LOWER 函 数 内, 或 把 LOWER 函 数 嵌 套 在 U PPER 函 数 内 在 查 询 分 析 器 中 输 入 以 下 语 句 : DECLARE @ string_lower_upper varchar(40) SET @ string_lower_upper = Information Model Creation Issues. SELECT LOWER(SUBSTRING( @ string_lower_upper,1,11)) AS Lower, UPPER(SUBSTRING( @ string_lower_upper,13,5)) AS Upper, LOWER(UPPER(SUBSTRING( @ string_lower_upper,19,8))) As LowerUpper, UPPER(LOWER(SUBSTRING( @ string_lower_upper,28,7))) As UpperLower 语 句 运 行 结 果 如 图 6 唱 2 所 示 图 6 唱 2 例 6.4 中 语 句 的 运 行 结 果 例 6.5 使 用 L T RIM 函 数 删 除 字 符 变 量 中 的 起 始 空 格 DECLARE @ string_to_trim varchar(60) SET @ string_to_trim = Five spaces are at the beginning of this string. SELECT Here is the string without the leading spaces : + LTRIM( @ string_to_trim) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 : Here is the string without the leading spaces : Five spaces are at the beginning of this string. 例 6.6 使 用 LEF T 函 数 返 回 字 符 串 abcdefg 最 左 边 的 4 个 字 符 SELECT LEFT( abcdefg,4) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 :abcd 例 6.7 将 指 定 的 字 符 串 的 排 列 顺 序 颠 倒 SELECT REVERSE(123), REVERSE( abc ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 :321 cba 例 6.8 在 第 一 个 字 符 串 (abcdef) 中 删 除 从 第 二 个 位 置 ( 字 符 b) 开 始 的 三 个 字 符, 然 后 在 删 除 的 起 始 位 置 插 入 第 二 个 字 符 串, 创 建 并 返 回 一 个 字 符 串 SELECT ST UFF( abcdef,2,3, ijklmn ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 :aijklmnef 3. 日 期 和 时 间 函 数 日 期 和 时 间 函 数 用 于 对 日 期 和 时 间 数 据 进 行 各 种 不 同 的 处 理 和 运 算, 并 返 回 一 个 字 符 串 数 字 值 或 日 期 和 时 间 值 在 SQ L Server 2000 中, 日 期 和 时 间 函 数 如 表 6 唱 4 所 示 表 中 列 出 了 日 期 和 时 间 函 数 的 名 称 参 数 以 及 相 关 解 释
第 6 章 SQL Server 的 数 据 查 询 133 表 6 唱 4 日 期 和 时 间 函 数 函 数 名 参 数 说 明 DATEADD (datepart, number,date) 以 datepart 指 定 的 方 式, 给 出 date 与 number 之 和 DATEDIFF (datepart,date1,date2) 以 datepart 指 定 的 方 式, 给 出 date2 与 date1 之 差 DATENAME (datepart,date) 给 出 date 中 datepart 指 定 部 分 所 对 应 的 字 符 串 DATEPART (datepart,date) 给 出 date 中 datepart 指 定 部 分 所 对 应 的 整 数 值 GETDATE () 给 出 系 统 当 前 的 日 期 的 时 间 DAY (date) 从 date 日 期 和 时 间 类 型 数 据 中 提 取 天 数 MONT H (date) 从 date 日 期 和 时 间 类 型 数 据 中 提 取 月 份 数 YEAR (date) 从 date 日 期 和 时 间 类 型 数 据 中 提 取 年 份 数 例 6.9 从 GE TDA T E 函 数 返 回 的 日 期 中 提 取 月 份 数 SELECT GETDATE() Current Date,DATEPART(month,GETDATE()) AS Month Number 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 3 所 示 图 6 唱 3 例 6.9 中 语 句 的 运 行 结 果 例 6.10 从 指 定 日 期 03/12/2005 中 返 回 月 份 数 天 数 和 年 份 数 SELECT MONT H( 03/12/2005 ), DAY( 03/12/2005 ),YEAR( 03/12/2005 ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 4 所 示 图 6 唱 4 例 6.10 语 句 中 的 运 行 结 果 4. 转 换 函 数 SQ L Server 能 够 自 动 处 理 某 些 数 据 类 型 的 转 换 例 如,char 和 varchar smallint 和 int,sq L Server 可 以 将 它 们 自 动 转 换, 这 种 转 换 被 称 为 隐 性 转 换 但 是, 无 法 由 SQ L Server 自 动 转 换 的 或 者 是 SQ L Server 自 动 转 换 的 结 果 不 符 合 预 期 结 果 的, 就 需 要 使 用 转 换 函 数 做 显 示 转 换 转 换 函 数 CONVER T 和 CAS T 允 许 用 户 把 某 种 数 据 类 型 的 表 达 式 转 换 为 另 一 种 数 据 类 型 CAS T 和 CONVER T 提 供 相 似 的 功 能, 如 表 6 唱 5 所 示 表 6 唱 5 转 换 函 数 函 数 名 参 数 说 明 CAST CONVERT expression AS data_type data_type[(length)],expression [,style] 将 表 达 式 expression 转 换 为 指 定 的 数 据 类 型 data_type date_type 为 expression 转 换 后 的 数 据 类 型 Length 表 示 转 换 后 的 数 据 长 度 Style( 不 带 纪 元 和 带 纪 元 )
134 SQL Server 数 据 库 应 用 技 术 例 6.11 将 数 值 型 数 据 248.57 转 换 为 字 符 型 后, 又 转 换 成 为 货 币 型 数 据 DECLARE @ myval decimal (5,2) SET @ myval = 248.57 SELECT CAST(CAST( @ myval AS varchar(20)) AS money) 如 果 使 用 CONVER T, 将 提 供 和 CAS T 相 似 的 功 能 SELECT CONVERT(money, CONVERT(varchar(20), @ myval)) 例 6.12 把 PI/2 弧 度 的 角 度 返 回 度 数 的 角 度 SELECT The number of degrees in PI/2 radians is : + CONVERT(varchar, DEGREES((PI()/2))) 此 例 对 以 弧 度 为 单 位 的 角 度 (PI/2), 将 返 回 相 应 的 以 度 数 为 单 位 的 角 度 (90) 例 6.13 写 一 个 SELEC T 语 句, 取 出 所 有 学 生 的 学 号 姓 名 出 生 日 期 和 入 学 成 绩, 出 生 日 期 必 须 是 在 1986 年 10 月 3 日 之 前 USE student SELECT stud_id,name,birthday,mark FROM stud_info WHERE birthday < = CONVERT(datetime, 10/03/1986 ) 此 例 中 W HERE 子 句 的 搜 索 条 件 需 要 使 用 CON VER T 函 数, 将 用 字 符 串 表 达 的 日 期 转 换 成 日 期 时 间 型 的 5. 系 统 函 数 表 6 唱 6 所 示 的 系 统 函 数 用 于 返 回 有 关 SQ L Server 系 统 用 户 数 据 库 和 数 据 库 对 象 的 信 息 它 可 以 让 用 户 在 得 到 信 息 后, 使 用 条 件 语 句, 根 据 返 回 的 信 息 进 行 不 同 的 操 作 与 其 他 函 数 一 样, 可 以 在 SELEC T 语 句 的 SELEC T 和 W H ERE 子 句 以 及 表 达 式 中 使 用 系 统 函 数 表 6 唱 6 系 统 函 数 函 数 名 参 数 说 明 DB_ID, DB_NAME DB_ID(name), DB_NAME(id) 获 得 指 定 数 据 库 的 ID 号 或 名 称 HOST_ID,HOST_NAME HOST_ID(name),HOST_NAME(id) 获 得 指 定 主 机 的 ID 号 或 名 称 OBJECT_ID,OBJECT_NAME SUSER_ID,SUSER_NAME USER_ID, USER_NAME COL_NA ME OBJECT _ ID ( name ), OBJECT _ NAME(id) 获 得 指 定 对 象 的 ID 号 或 名 称 SUSER_ID(name),SUSER_NAME(id) 获 得 指 定 登 录 的 ID 号 或 名 称 USER_ID(name), USER_NAME(id) 获 得 指 定 用 户 的 ID 号 或 名 称 table_id, column_id 获 得 表 标 识 号 table_id 和 列 标 识 号 column_id 所 对 应 的 列 名 COL_LENGT H table,column 获 得 指 定 表 列 的 定 义 长 度 INDEX_COL table, index_id, key_id 获 得 指 定 表 索 引 ID 和 键 ID 的 索 引 列 名 称 DATALENGT H expression 获 得 指 定 表 达 式 占 用 的 字 节 数
第 6 章 SQL Server 的 数 据 查 询 135 例 6.14 查 询 stud_info 表 中 学 号 为 0401010811 的 address 列 的 定 义 长 度 和 数 据 长 度 SELECT COL_LENGT H( stud_info, address ) AS 定 义 长 度, DATALENGT H(address) AS 数 据 长 度 FROM stud_info WHERE stud_id = 0401010811 其 中 : COL_LENG T H 将 获 得 指 定 表 stud_info 的 address 列 定 义 长 度, 而 不 是 列 中 存 储 的 任 何 单 个 字 符 串 的 长 度 用 DA T A LENG T H 函 数 来 确 定 特 定 值 中 的 字 符 总 数 例 6.15 返 回 student 数 据 库 的 stud_info 表 中 的 第 二 列 的 名 称 SELECT COL_NAME(OBJECT_ID( stud_info ),2) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 : name 6. 集 合 函 数 集 合 函 数 可 以 针 对 整 个 或 者 几 个 列 或 者 一 个 列 进 行 数 据 汇 总, 它 常 用 来 计 算 SELEC T 语 句 查 询 结 果 集 的 统 计 值 例 如, 求 一 个 结 果 集 合 的 最 大 值 最 小 值 平 均 值 和 所 有 元 素 和 等 SQ L Server 提 供 的 集 合 函 数 如 表 6 唱 7 所 示 表 6 唱 7 集 合 函 数 函 数 描 述 函 数 描 述 AVG 计 算 一 列 值 的 平 均 值 SU M 计 算 一 列 值 的 总 和 COUNT 统 计 一 列 中 值 的 个 数 MIN 求 一 列 值 中 的 最 小 值 MAX 求 一 列 值 中 的 最 大 值 例 6.16 求 Java 程 序 设 计 课 程 的 平 均 成 绩, 具 体 命 令 如 下 SELECT AVG (grade) FROM stud_grade WHERE course_id = 0401010102 在 查 询 分 析 器 中 运 行 上 述 语 句 将 可 以 在 学 生 成 绩 表 中 查 询 到 Java 程 序 设 计 课 程 ( 课 程 号 course_id 为 0401010102 ) 的 平 均 成 绩 集 合 函 数 是 从 SELEC T 语 句 中 计 算 一 个 返 回 列 的 数 据, 其 结 果 是 所 选 数 据 列 的 计 算 结 果 例 如 : SELEC T A VG(salary) FRO M teacher_info 语 句 将 返 回 单 一 的 结 果, 即 teacher_info 表 中 所 有 salary 列 数 据 的 平 均 值 又 如 : SELEC T A VG(salary) FRO M teacher_info W H ERE tech_title = 讲 师 语 句 将 返 回 teacher_info 表 中 所 有 tech_title 列 为 讲 师 的 平 均 工 资 而 语 句 SELEC T count ( 倡 ) FRO M teacher_info 中 使 用 集 合 函 数 跟 上 面 的 例 子 有 点 不 同, 因 为 没 有 一 个 具 体 的 列 被 指 定 给 CO U N T 函 数, 这 条 语 句 实 际 上 将 返 回 teacher_info 表 的 行 数
136 SQL Server 数 据 库 应 用 技 术 6.2 SELECT 语 句 使 用 SELEC T 语 句 进 行 数 据 查 询 是 数 据 库 的 核 心 操 作 SQ L Server 提 供 了 SELEC T 语 句 较 完 整 的 数 据 查 询 语 句 形 式, 该 语 句 具 有 灵 活 的 使 用 方 式 和 丰 富 的 功 能 6.2.1 简 单 查 询 简 单 查 询 的 语 句 格 式 : SELECT [ALL DISTINCT] select_list FROM table_name 其 中,select_list 中 用 倡 表 示 当 前 表 或 视 图 的 所 有 列 ; 用 table_name. 倡 表 示 指 定 表 或 视 图 的 所 有 列 ; 用 column_name1[[as] column_title1],column_name2[[as] column_ title2] [,...] 或 者 用 [column _ title1 = ] column _ name1 [,column _ title2 = ] column _ name2[,...] 表 示 指 定 列 并 更 改 列 标 题 A L L 和 DIS TINC T 是 SELEC T 语 句 中 的 可 选 项, 用 于 在 查 询 结 果 中 消 除 重 复 行 如 果 想 在 指 定 的 列 中 检 索 单 一 记 录, 可 以 使 用 DIS TINC T 关 键 字, 因 为 DIS T NC T 将 会 丢 弃 SELEC T 指 定 列 的 重 复 记 录 ; 如 果 需 要 显 示 结 果 表 中 的 重 复 行, 可 以 指 定 A L L, 意 为 保 留 结 果 表 中 所 有 的 行 例 6.17 查 询 全 部 课 程 的 详 细 信 息, 其 命 令 为 : SELECT 倡 FROM lesson_info 在 查 询 分 析 器 中 输 入 并 运 行 上 述 语 句 的 结 果 如 图 6 唱 5 所 示 图 6 唱 5 例 6.17 中 语 句 的 运 行 结 果 查 询 全 部 列, 即 将 表 中 的 所 有 列 都 选 出 来, 一 般 有 两 种 方 法 一 是 简 单 地 将 目 标 列 选 项 指 定 为 倡, 此 时 列 的 显 示 顺 序 与 其 在 基 表 中 的 顺 序 相 同 ; 二 是 在 SELEC T 的 后 面 列 出 所 有 列 名, 不 过 目 标 列 所 显 示 顺 序 与 其 在 基 表 中 的 顺 序 可 以 不 同 下 面 的 语 句 就 说 明 这 个 问 题 SELECT course_id,course_name, course_type, course_time, course_mark FROM lesson_info 在 很 多 情 况 下, 用 户 只 对 表 中 的 一 部 分 列 值 感 兴 趣, 这 时 可 以 通 过 在 SELEC T 子 句 中 通 过 选 项 {column_name1,column_name2[,...]} 来 指 定 要 查 询 的 目 标 列 各 个 列 的 先 后 顺 序 可 以 与 表 中 的 顺 序 不 一 致, 用 户 可 以 根 据 应 用 的 需 要 改 变 列 的 现 实 顺 序
第 6 章 SQL Server 的 数 据 查 询 137 例 6.18 在 学 生 基 本 信 息 表 中 查 询 所 有 女 生 的 学 号 姓 名 出 生 日 期, 具 体 命 令 如 下 : SELECT stud_id 学 号, name AS 姓 名, 出 生 日 期 = birthday FROM stud_info WHERE gender = 女 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 6 所 示 图 6 唱 6 例 6.18 中 SELECT 语 句 的 运 行 结 果 如 果 在 SELEC T 语 句 中 有 表 达 式 或 者 对 某 列 进 行 了 运 算, 那 么 由 表 达 式 生 成 的 列 的 列 标 题 就 是 空 白 此 时, 如 果 想 要 为 空 白 列 提 供 一 个 列 标 题, 可 以 通 过 对 某 一 列 指 定 一 个 列 标 题 (column_title) 来 实 现 不 过, 如 果 被 指 定 的 列 标 题 中 包 含 空 格, 则 被 指 定 的 列 标 题 必 须 用 双 引 号 括 起 来 使 用 SELEC T 子 句 在 取 出 某 个 列 值 的 同 时, 是 可 以 用 汉 字 标 题 更 改 结 果 集 中 的 列 名, 这 样 使 得 结 果 集 更 具 可 读 性 这 里, 使 用 了 三 种 形 式 来 将 汉 字 标 题 替 换 列 名 例 6.19 显 示 学 生 基 本 信 息 表 中 的 院 系 编 号, 查 询 结 果 中 消 除 重 复 行, 具 体 命 令 如 下 : SELECT DISTINCT 院 系 编 号 = substring(stud_id,3,2) FROM stud_info 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 7 所 示 图 6 唱 7 查 询 语 句 的 运 行 结 果 中 没 有 重 复 行 而 A LL 就 将 显 示 数 据 表 中 所 有 指 定 的 行, 包 括 列 值 重 复 的 数 据 行 在 没 有 指 定 的 时 候, 这 个 A LL 关 键 字 是 默 认 的 下 面 为 没 有 使 用 DIS TINC T, 默 认 关 键 字 A L L 的 命 令 形 式 SELECT substring(stud_id,3,2) 院 系 编 号 FROM stud_info 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 8 所 示 注 意 : DIS TINC T 关 键 字 的 作 用 范 围 是 整 个 SELEC T 列 表, 而 不 是 针 对 某 一 列 上 述 语 句 显 示 了 对 院 系 编 号 检 索 的 结 果 如 果 在 SELEC T 列 表 中 包 含 了 两 列 或 者 更 多 的 列, 那 么 显 示 的 结 果 将 是 这 两 列 或 者 更 多 列 的 惟 一 组 合 6.2.2 FROM 子 句 与 INTO 子 句 SELEC T 语 句 是 用 于 查 询 指 定 的 数 据 表 并 满 足 指 定 条 件 的 数 据 SELEC T 语 句 主 要 由 五 个 子 句 提 供 选 择, 每 一 个 子 句 有 大 量 的 选 择 项 参 数 等, 这 些 子 句 将 罗 列 在
138 SQL Server 数 据 库 应 用 技 术 图 6 唱 8 查 询 语 句 的 运 行 结 果 中 出 现 重 复 行 SELEC T 后 面, 而 FRO M 是 惟 一 必 需 的 子 句 以 后 的 章 节 针 对 每 一 个 子 句 都 将 进 行 详 细 的 描 述 1.FROM 子 句 SELECT column_name1, column_name2[,...] FROM table_name1[,table_name2,...] FRO M 子 句 指 定 SELEC T 语 句 查 询 的 一 个 或 多 个 表, 最 多 可 以 指 定 16 个 表, 每 一 个 表 名 用 逗 号 分 隔 即 从 指 定 的 数 据 表 table_name1[,table_name2,...] 的 记 录 中, 检 索 (SELEC T) 出 指 定 的 列 column _ name1, column _ name2 [,...n] 形 成 结 果 集 不 过, FRO M 后 面 的 表 名 在 两 个 或 者 两 个 以 上 时,SELEC T 列 表 中 应 该 采 用 table _ name. [column_name] 形 式 限 定 列 所 属 的 表 例 6.20 查 询 学 生 的 学 号 姓 名 考 试 成 绩, 具 体 命 令 如 下 : SELECT stud_info.stud_id, stud_info.name, stud_grade.grade FROM stud_info, stud_grade WHERE stud_info.stud_id = stud_grade.stud_id 2.INTO 子 句 SELECT column_name1, column_name2[,...n] [INTO new_table ] FROM table_name 在 使 用 SELEC T 语 句 检 索 数 据 时, 利 用 IN T O 子 句 在 SELEC T 语 句 的 运 行 过 程 中 创 建 一 个 表, 所 创 建 的 表 中 所 包 含 的 内 容 就 是 检 索 的 结 果 通 常, 可 使 用 这 种 方 法 来 创 建 临 时 表, 以 便 在 随 后 的 开 发 过 程 中 使 用 例 6.21 将 学 生 的 学 号 姓 名 性 别 的 查 询 结 果 作 为 新 建 的 临 时 表, 具 体 命 令 如 下 : SELECT stud_id, name, gender INTO new_stud_info FROM stud_info WHERE gender = 男
第 6 章 SQL Server 的 数 据 查 询 139 使 用 SELEC T 和 IN T O 子 句 创 建 一 个 新 表 new _ stud_info, 该 表 中 包 含 stud_id, name, gender, 且 这 些 列 的 内 容 必 须 满 足 stud_info 表 中 gender 为 男 的 条 件 这 些 结 果 不 会 返 回 给 用 户 6.2.3 使 用 WHERE 子 句 设 置 查 询 条 件 1.WHERE 子 句 的 语 法 格 式 SELECT column_name1, column_name2[,...n] FROM table_name WHERE search_condition 根 据 W HERE 子 句 的 搜 索 条 件 表 达 式 (search_condition), 从 FROM 子 句 指 定 的 表 中 找 出 满 足 条 件 的 记 录, 再 按 SELEC T 子 句 中 的 目 标 列, 选 出 记 录 中 的 列 值 形 成 结 果 集 W HERE 子 句 中 常 用 的 查 询 条 件 包 括 比 较 确 定 范 围 确 定 集 合 字 符 匹 配 空 值 多 重 条 件 等, 具 体 如 下 : 瞯 比 较, 包 括 的 运 算 符 主 要 有 < < = > > = = < > 等 ; 瞯 确 定 范 围, 包 括 BE T WEEN A A ND B 与 N O T BE T WEEN A A ND B ; 瞯 确 定 集 合, 包 括 IN NO T IN 等 ; 瞯 字 符 匹 配, 包 括 LIKE NO T LIKE ; 瞯 空 值, 主 要 有 IS N U L L IS NO T N U L L ; 瞯 多 重 条 件, 主 要 有 A ND OR NO T 等 注 意 : 使 用 W HERE 子 句 来 限 制 查 询 的 范 围, 必 须 紧 跟 FROM 子 句 之 后 2. 查 询 满 足 条 件 的 记 录 查 询 满 足 条 件 的 记 录 可 以 通 过 W HERE 子 句 来 实 现 W H ERE 子 句 对 应 于 关 系 代 数 中 的 选 择, 使 W H ERE 子 句 中 的 逻 辑 表 达 式 返 回 T rue 值 的 记 录, 是 符 合 要 求 的 记 录, 将 被 选 择 出 来 例 6.22 查 询 性 别 为 女 的 学 生 的 姓 名 电 话 地 址 和 邮 编, 具 体 命 令 如 下 SELECT name,address, telcode,zipcode FROM stud_info WHERE gender = 女 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 9 所 示 图 6 唱 9 例 6.22 中 SELECT 语 句 的 运 行 结 果 W HERE 子 句 中 的 search _ condition, 可 以 使 用 BE T WEEN... A ND 运 算 符 和 LIKE 操 作 数 例 如 : 查 询 列 值 (column_name) 或 列 值 表 达 式 (expression) 在 或 不 在 指 定 范 围 内 的 记 录 使 用 下 列 条 件 {column_name expression} BETWEEN value1 AND value2
140 SQL Server 数 据 库 应 用 技 术 {column_name expression} [NOT] BETWEEN value1 AND value2 其 中,value1 为 范 围 的 下 限 ( 低 值 ),value2 为 范 围 的 上 限 ( 高 值 ) 选 出 的 记 录 包 括 边 界 value1 与 value2, 要 求 value1 < = value2 例 6.23 查 询 出 生 日 期 在 07 唱 01 唱 1986 ~ 12 唱 31 唱 1986 学 生 的 学 号 姓 名 和 入 学 成 绩, 具 体 命 令 如 下 : SELECT stud_id, name, birthday, mark FROM stud_info WHERE birthday BETWEEN 07/01/1986 AND 12/31/1986 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 10 所 示 图 6 唱 10 例 6.23 中 SELECT 语 句 的 运 行 结 果 字 符 匹 配 可 以 使 用 LIKE NO T LIKE 来 进 行 字 符 串 的 匹 配 其 一 般 格 式 为 : [NOT] LIKE < 字 符 串 > [ESCAPE < 换 码 字 符 > ] 功 能 是 查 询 指 定 的 列 值 与 < 字 符 串 > 相 匹 配 的 记 录 其 中,< 字 符 串 > 可 以 是 一 个 由 数 字 或 字 母 组 成 的 字 符 串, 也 可 以 含 有 通 配 符 的 字 符 串 通 配 符 包 括 % _ 百 分 号 ( % ) 代 表 任 意 长 ( 包 括 长 度 为 0) 字 符 串 ; 下 划 线 (_) 代 表 任 意 单 个 字 符 < 换 码 字 符 > 可 以 是 任 意 字 符, 如 a,b,c,d, 当 LIKE 后 面 的 匹 配 串 中 不 含 有 通 配 符 时, 则 LIKE 等 价 于 = ( 等 号 ),N O T LIKE 等 价 于!= 或 < > ( 不 等 号 ) 例 6.24 列 出 姓 名 的 第 一 个 字 为 郑 姓 名 为 两 个 字 的 学 生 学 号 姓 名, 性 别, 入 学 成 绩, 具 体 命 令 如 下 SELECT stud_id, name, birthday, gender, mark FROM stud_info WHERE name LIKE 郑 _ 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 11 所 示 图 6 唱 11 例 6.24 中 SELECT 语 句 的 运 行 结 果 如 果 用 户 要 查 询 的 字 符 串 本 身 就 含 有 % 或 _, 这 时 要 使 用 ESCAPE 关 键 字 对 通 配 符 进 行 转 义 在 ESCAPE 关 键 字 之 后 可 以 规 定 希 望 用 作 扩 展 字 符 的 字 符, 表 示 在 字 符 串 表
第 6 章 SQL Server 的 数 据 查 询 141 达 式 之 后 的 字 符 应 该 在 文 字 上 匹 配 例 6.25 首 先 向 学 生 基 本 信 息 表 中 添 加 一 个 学 号 为 0401050127, 姓 名 为 张 军 的 学 生, 其 电 话 为 028_85249567, 然 后 列 出 电 话 中 含 有 下 划 线 的 学 生 的 学 号 姓 名 电 话 地 址, 具 体 命 令 如 下 : INSERT INTO stud_info VALUES ( 0401050127, 张 军, 11/03/1987, 男, 成 都 市 和 平 区, 028_85249567, 610041,570) GO SELECT stud_id, name, telcode,address FROM stud_info WHERE telcode LIKE % e_ % ESCAPE e 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 12 所 示 图 6 唱 12 例 6.25 中 SELECT 语 句 的 运 行 结 果 例 6.26 查 询 教 师 信 息 表 中 职 称 不 为 空 的 教 师 编 号, 姓 名, 性 别, 具 体 命 令 如 下 : SELECT teacher_id, name, gender FROM teacher_info WHERE tech_title IS NOT NULL 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 13 所 示 图 6 唱 13 例 6.26 中 SELECT 语 句 的 运 行 结 果 涉 及 空 值 查 询 时 使 用 IS N U L L 或 IS NO T N U L L, 这 里 的 IS 不 能 用 = 替 代 当 查 询 条 件 涉 及 多 个 时, 可 以 用 逻 辑 运 算 符 A ND 和 OR 来 连 接 多 个 查 询 条 件 A ND 的 优 先 级 高 于 OR, 但 是 可 以 用 括 号 改 变 优 先 级 例 6.27 查 询 院 系 编 号 为 01 ( 计 算 机 工 程 系 ) 女 生 的 学 号 姓 名 及 出 生 日 期, 具 体 命 令 如 下 : SELECT stud_id, name, birthday FROM stud_info WHERE substr(stud_id,3,2) = 01 AND gender = 女 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 14 所 示
142 SQL Server 数 据 库 应 用 技 术 图 6 唱 14 例 6.27 中 SELECT 语 句 的 运 行 结 果 A ND 运 算 符 可 以 在 W HERE 子 句 中 连 接 两 个 或 者 多 个 条 件 A ND 条 件 的 两 旁 必 须 都 为 true( 真 ), 即 两 个 条 件 都 同 时 满 足 的 时 候, 这 些 行 才 被 显 示 例 6.28 从 教 师 信 息 表 中 选 择 工 资 大 于 等 于 418 并 且 职 称 为 讲 师 的 教 师 编 号 姓 名 职 称 和 工 资 SELECT teacher_id, name, tech_title, salary FROM teacher_info WHERE salary > = 418 AND tech_title = 讲 师 这 条 SQ L 语 句 中, 只 有 当 A ND 运 算 符 两 旁 的 条 件 都 为 真,SELEC T 语 句 才 会 将 检 索 结 果 返 回 如 果 其 中 有 一 个 条 件 为 假, 那 么 就 什 么 都 没 有 显 示 可 以 使 用 圆 括 号 将 条 件 括 起 来, 虽 然 它 们 也 不 一 定 是 必 需 的, 但 是 括 起 来 看 起 来 更 清 晰 一 些, 这 是 一 个 习 惯 的 问 题 例 如, 上 例 可 以 写 成 以 下 形 式 : SELECT teacher_id, name, tech_title, salary FROM teacher_info WHERE (salary > = 418) AND (tech_title = 讲 师 ) 下 面 讨 论 运 用 OR 运 算 符 的 例 子,OR 可 以 在 W HERE 子 句 中 连 接 两 个 或 者 两 个 以 上 的 条 件 但 是, 只 要 OR 运 算 符 两 旁 有 一 个 为 true 的 时 候, 条 件 就 满 足, 目 标 列 就 会 被 显 示 例 6.29 从 教 师 信 息 表 中 查 询 工 资 大 于 等 于 418 元 或 者 职 称 为 讲 师 的 教 师 编 号 姓 名 职 称 和 工 资 SELECT teacher_id, name, tech_title, salary FROM teacher_info WHERE (salary > = 418) OR (tech_title = 讲 师 ) 例 6.30 查 询 教 师 职 称 为 助 教, 或 为 讲 师, 或 为 副 教 授 的 教 师 编 号 姓 名 职 称 及 工 资, 具 体 命 令 如 下 : SELECT teacher_id, name, tech_title, salary FROM teacher_info WHERE tech_title IN ( 助 教, 讲 师, 副 教 授 ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 15 所 示 从 这 条 语 句 可 以 看 出, 从 teacher_info 表 中 选 择 tech_title 为 助 教 讲 师 或 者 副 教 授 的 teacher_id,name,tech_title 和 salary 如 果 职 称 在 其 中 就 将 返 回 对 应 的 行 实 际 上,IN 条 件 运 算 符 是 一 个 成 员 测 试 运 算 符, 也 就 是 说, 它 用 于 测 试 是 否 一 个 数 值 处 在 IN 关 键 字 之 后 提 供 的 数 值 之 中
第 6 章 SQL Server 的 数 据 查 询 143 图 6 唱 15 例 6.30 中 SELECT 语 句 的 运 行 结 果 注 意 :IN 与 用 OR 连 接 的 多 个 查 询 条 件 具 有 相 同 的 效 果 或 者 说,IN 条 件 运 算 符 实 际 上 是 多 个 OR 运 算 的 缩 写 它 可 以 使 用 混 合 条 件 来 替 代, 例 如, 可 以 使 用 等 号 运 算 符 和 OR 运 算 符 来 实 现 上 例, 而 且 结 果 是 一 样 的 SELECT teacher_id, name, tech_title, salary FROM teacher_info WHERE tech_title = 助 教 OR tech_title = 讲 师 OR tech_title = 副 教 授 可 以 观 察 到, 利 用 IN 运 算 符 时 语 句 会 更 加 简 短 并 且 容 易 读, 特 别 是 在 测 试 两 个 或 者 三 个 数 值 以 上 的 时 候 尤 为 突 出 当 然, 也 可 以 使 用 N O T IN 条 件 运 算 符 来 排 除 列 表 中 的 一 些 数 据 行 6.2.4 查 询 结 果 排 序 及 ORDER BY 子 句 1.ORDER BY 子 句 SELECT column_name1, column_name2[,...n] FROM table_name WHERE search_condition ORDER BY column_name1[asc DESC][,column_name[ASC DESC][,...]] 如 果 有 ORDER BY 子 句, 将 按 照 排 序 列 名 column_name1[,column_name2[,...]] 进 行 排 序, 其 结 果 表 还 要 按 选 项 的 值 升 序 (ASC) 或 降 序 (DESC) 排 列 ORDER BY 是 一 个 可 选 的 子 句, 可 以 根 据 指 定 列 的 上 升 或 者 下 降 的 顺 序 来 显 示 查 询 的 结 果 例 如 : ASC ( Ascending Order ) 表 示 按 升 序 排 列, 这 个 是 默 认 的 ;DESC (Descending Order) 表 示 按 降 序 排 列 2. 使 用 ORDER BY 子 句 排 序 查 询 结 果 对 指 定 结 果 集 中 记 录 的 排 列 时,ORDER BY 子 句 通 常 出 现 在 查 询 语 句 的 最 后 例 6.31 查 询 所 有 男 生 的 学 号 姓 名 和 年 龄, 并 按 出 生 日 期 进 行 排 列 ( 升 序 ), 命 令 如 下 : SELECT stud_id 学 号, name 姓 名, year(getdate()) 唱 year(birthday) 年 龄, birthday 出 生 日 期 FROM stud_info WHERE gender = 男 ORDER BY birthday ASC 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 16 所 示 例 6.32 查 询 所 有 教 师 的 编 号 姓 名 及 工 资, 并 按 工 资 进 行 降 序 排 列, 具 体 命 令
144 SQL Server 数 据 库 应 用 技 术 图 6 唱 16 例 6.31 中 SELECT 语 句 的 运 行 结 果 如 下 : SELECT teacher_id 教 师 编 号, name 姓 名, salary 工 资 FROM teacher_info ORDER by salary DESC 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 17 所 示 图 6 唱 17 例 6.32 中 SELECT 语 句 的 运 行 结 果 被 排 序 列 也 可 以 为 列 表 column_name1[,column_name2[,...]] 以 外 的 其 他 列 例 如, 下 面 的 使 用 方 式 是 正 确 的 例 6.33 查 询 所 选 课 程 号 为 0401010106 课 程 的 学 生 学 号 姓 名 和 成 绩, 并 将 结 果 按 成 绩 升 序 排 列, 具 体 命 令 如 下 : SELECT stud_id 学 号, name 姓 名 FROM stud_grade WHERE course_id = 0401010106 ORDER BY grade 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 18 所 示 图 6 唱 18 例 6.33 中 SELECT 语 句 的 运 行 结 果 如 果 指 定 了 SELEC T DIS TINC T, 那 么 ORDER BY 子 句 中 的 项 就 必 须 出 现 在 选 择
第 6 章 SQL Server 的 数 据 查 询 145 列 表 中 下 面 的 表 达 方 式 是 错 误 的 SELECT DISTINCT stud_id 学 号, name 姓 名 From stud_grade WHERE course_id = 0401010106 ORDER by grade 6.2.5 GROUP BY 子 句 与 HAVING 子 句 1.GROUP BY 与 HAVING 子 句 SELECT column_name1, column_name2 [,...n] FROM table_name WHERE search_condition GROUP BY group_by_expression HAVING search_condition GRO U P BY 子 句 将 查 询 结 果 按 分 组 选 项 的 值 (group_by_expression) 进 行 分 组, 该 属 性 列 相 等 的 记 录 为 一 个 组 通 常, 在 每 组 中 通 过 集 合 函 数 来 计 算 一 个 或 者 多 个 列 如 果 GRO U P 子 句 带 有 H A VING 短 语, 则 只 有 满 足 指 定 条 件 (search_condition) 的 组 才 能 输 出 H A VING 子 句 为 每 一 个 组 指 定 条 件, 换 句 话 说, 使 用 GRO U P BY 子 句 时, 还 可 以 用 H A VING 子 句 为 分 组 统 计 进 一 步 设 置 统 计 条 件, 限 制 SELEC T 语 句 返 回 的 行 数 H A VING 子 句 与 GRO U P BY 子 句 的 关 系 类 似 于 W HERE 子 句 与 SELEC T 子 句 的 关 系 注 意 : H A VING 子 句 应 该 处 在 GRO U P BY 子 句 之 后, 并 且 在 H A VING 子 句 中 不 能 使 用 text image 和 ntext 数 据 类 型 2.GROUP BY 和 HAVING 子 句 的 使 用 例 6.34 统 计 计 算 机 工 程 系 各 个 专 业 的 学 生 的 平 均 入 学 成 绩, 具 体 命 令 如 下 : SELECT substring(stud_id,5,2) 专 业 编 号,avg(mark) 平 均 入 学 成 绩 FROM stud_info WHERE substring(stud_id,3,2) = 01 GROUP BY substring(stud_id,5,2) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 19 所 示 图 6 唱 19 例 6.34 中 SELECT 语 句 的 运 行 结 果
146 SQL Server 数 据 库 应 用 技 术 例 6.35 在 学 生 成 绩 表 中 统 计 各 门 课 程 的 人 数, 具 体 命 令 如 下 : SELECT course_id 课 程 号,count(course_id) 人 数 FROM stud_grade GROUP BY course_id 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 20 所 示 图 6 唱 20 例 6.35 中 SELECT 语 句 的 运 行 结 果 例 6.36 在 学 生 成 绩 表 中 统 计 参 加 多 媒 体 技 术 考 试 ( 课 程 号 为 0401010106 ) 的 人 数, 具 体 命 令 如 下 : SELECT course_id 课 程 号,count(course_id) 人 数 FROM stud_grade GROUP BY course_id H AVING course_id = 0401010106 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 21 所 示 图 6 唱 21 例 6.36 中 SELECT 语 句 的 运 行 结 果 例 6.37 在 教 师 信 息 表 中, 按 职 称 分 组 统 计 讲 师 的 平 均 年 龄, 具 体 命 令 如 下 : SELECT tech_title, avg(age) FROM teacher_info GROUP BY tech_title HAVING tech_title = 讲 师 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 22 所 示 图 6 唱 22 例 6.37 中 SELECT 语 句 的 运 行 结 果 例 6.38 在 教 师 信 息 表 中, 按 职 称 分 组 统 计 教 授 或 副 教 授 的 工 资 总 额, 具 体 命 令 如 下 :
第 6 章 SQL Server 的 数 据 查 询 147 SELECT tech_title, sum (salary) FROM teacher_info GROUP BY tech_title HAVING tech_title = 教 授 OR tech_title = 副 教 授 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 23 所 示 图 6 唱 23 例 6.38 中 SELECT 语 句 的 运 行 结 果 3. 分 组 查 询 中 注 意 事 项 使 用 GRO U P BY 子 句 时, 应 该 注 意 以 下 三 方 面 的 问 题 : (1) GRO U P BY 子 句 不 能 使 用 集 合 函 数 例 如, 以 下 的 使 用 方 式 是 错 误 的 : SELECT 倡 FROM stud_grade GROUP BY count (course_id) (2) 当 SELEC T 语 句 中 包 含 有 W HERE 子 句 和 ORDER BY 子 句 时,GRO U P BY 子 句 只 能 放 在 这 两 个 子 句 的 后 面 例 如, 以 下 的 使 用 方 式 是 错 误 的 : SELECT gender, count (gender) FROM stud_info GROUP BY gender WHERE year (getdate()) 唱 year (birthday) < > 17 如 果 改 写 为 下 列 形 式 就 可 以 按 性 别 统 计 学 生 信 息 表 中 年 龄 不 等 于 17 岁 的 男 女 人 数 SELECT gender, count (gender) FROM stud_info WHERE year (getdate()) 唱 year (birthday) < > 17 GROUP BY gender (3) 必 须 在 GRO U P BY 子 句 中 列 出 SELEC T 选 择 列 表 中 的 数 据 项 当 使 用 GRO U P BY 子 句 进 行 分 组 时,SELEC T 语 句 的 列 表 中 所 选 择 的 列 一 定 是 GRO U P BY 子 句 后 面 的 分 组 依 据 列 或 集 合 函 数 例 如, 下 面 的 查 询 语 句 是 错 误 的 : SELECT stud_id, name FROM stud_info GROUP BY gender 因 为 stud_id name 不 是 分 组 列, 其 分 组 列 是 gender, 所 以 上 述 查 询 将 出 现 错 误 报 告
148 SQL Server 数 据 库 应 用 技 术 6.2.6 COMPUTE 子 句 1.COMPUTE 和 COMPUTE BY 子 句 COMPUTE row_aggregate(column_name)[,row_aggregate (column_name)...] [BY column_name [,column_name...]] 其 中,row_aggregate 表 示 行 集 合 函 数, 例 如 AVG (),COUNT(),MAX(),MIN(),SUM() 等 CO M P U T E 子 句 生 成 合 计 作 为 附 加 的 汇 总 列 出 现 在 结 果 集 的 最 后 当 与 BY 一 起 使 用 时,CO M PU T E 子 句 在 结 果 集 内 对 指 定 列 进 行 分 类 汇 总 可 在 同 一 查 询 内 指 定 CO M P U T E BY 和 CO M PU T E 2. 使 用 COMPUTE 和 COMPUTE BY 汇 总 例 6.39 对 teacher_info 中 职 称 为 讲 师 的 工 资, 生 成 汇 总 行 和 明 细 行 SELECT tech_title, salary FROM teacher_info WHERE tech_title = 讲 师 ORDER BY tech_title COMPU TE sum(salary) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 24 所 示 图 6 唱 24 例 6.39 中 SELECT 语 句 的 运 行 结 果 例 6.39 中 用 一 条 SELEC T 命 令 查 询 数 据 的 同 时, 并 汇 总 教 师 基 本 信 息 表 中 职 称 为 讲 师 的 工 资 数 据 CO M PU T E 子 句 计 算 整 个 结 果 集 的 汇 总 值 使 用 集 合 函 数 在 查 询 的 结 果 集 中 生 成 汇 总 行 的 同 时, 还 生 成 了 明 细 行 使 用 CO M P U TE BY 对 结 果 集 数 据 进 行 分 组 统 计, 即 计 算 分 组 的 汇 总 值 例 6.40 对 表 teacher_info 中 职 称 为 讲 师 或 助 教 的 教 师 工 资, 按 照 其 职 称 生 成 分 组 汇 总 行 和 明 细 行 SELECT tech_title, salary FROM teacher_info WHERE tech_title = 讲 师 OR tech_title = 助 教 ORDER BY tech_title COMPU TE sum(salary) BY tech_title 使 用 CO M P U T ER BY 子 句 的 查 询 结 果 如 图 6 唱 25 所 示
第 6 章 SQL Server 的 数 据 查 询 149 图 6 唱 25 例 6.40 中 SELECT 语 句 的 运 行 结 果 3. 需 要 注 意 的 几 个 问 题 使 用 CO M P U T ER 和 CO M P U T ER BY 子 句 时, 需 要 注 意 以 下 几 个 问 题 : 瞯 DIS TINC T 关 键 字 不 能 与 集 合 函 数 一 起 使 用 ; 瞯 CO M P U T ER 子 句 中 指 定 的 列 必 须 是 SELEC T 子 句 中 已 有 的 ; 瞯 因 为 CO M PU T ER 子 句 产 生 非 标 准 行, 所 以 CO M P U T ER 子 句 不 能 与 SELEC T IN T O 子 句 一 起 使 用 ; 瞯 CO M PU TER BY 必 须 与 ORDER BY 子 句 一 起 使 用, 且 CO M P U T ER BY 中 指 定 的 列 必 须 与 ORDER BY 子 句 中 指 定 的 列 相 同, 或 者 为 其 子 集, 而 且 两 者 之 间 从 左 到 右 的 顺 序 也 必 须 相 同 ; 瞯 在 CO M P U T E 子 句 中, 不 能 使 用 ntext text 或 image 数 据 类 型 6.3 连 接 查 询 6.3.1 连 接 概 述 在 关 系 数 据 库 管 理 系 统 中, 数 据 表 建 立 时 各 数 据 之 间 的 关 系 不 必 确 定, 常 把 一 个 实 体 的 所 有 信 息 存 放 在 一 个 表 中 当 检 索 数 据 时, 通 过 连 接 操 作, 可 以 查 询 出 存 放 在 多 个 表 中 的 不 同 实 体 的 信 息 连 接 操 作 给 用 户 带 来 很 大 的 灵 活 性, 通 过 连 接 可 以 为 不 同 实 体 创 建 新 的 数 据 表, 然 后 通 过 连 接 可 以 使 用 一 个 表 中 的 数 据 来 查 询 其 他 表 的 数 据 1. 在 WHERE 子 句 中 定 义 连 接 SELECT table_name.column_name, table_name.column_name,... FROM {table_name1, table_name2} WHERE [ table_name1.column_name join_operator table_name2.column_name] 其 中 :join_operator 指 =, >, <, > =, < =, < > 例 6.41 查 询 每 个 学 生 的 学 号 姓 名 邮 政 编 码 等 基 本 信 息 及 其 所 选 课 程 的 成 绩 情 况, 具 体 命 令 如 下 : SELECT stud_info.stud_id, stud_grade.name, stud_info.zipcode, stud_grade.grade FROM stud_info, stud_grade WHERE stud_info.stud_id = stud_grade.stud_id
150 SQL Server 数 据 库 应 用 技 术 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 26 所 示 图 6 唱 26 例 6.41 中 SELECT 语 句 的 运 行 结 果 例 6.42 用 院 系 名 称 代 替 院 系 编 码 查 询 学 生 信 息 数 据 表 中 所 有 学 生 的 学 号 姓 名 院 系 名 称 和 院 系 编 码 SELECT a.stud_id, b.deptname,a.name, b.deptcode FROM stud_info a,dept_code b WHERE substring(a.stud_id,3,2) = b.deptcode 这 里, 涉 及 学 生 信 息 表 和 院 系 编 码 表 两 个 数 据 表, 在 W HERE 子 句 中 定 义 连 接 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 27 所 示 图 6 唱 27 例 6.42 中 SELECT 语 句 的 运 行 结 果 例 6.43 查 询 每 门 课 程 名 称 及 其 该 门 课 的 任 课 老 师 的 姓 名 编 号, 具 体 命 令 如 下 : SELECT teacher_info.teacher_id, teacher_info.name, lesson_info.course_name FROM lesson_info, teacher_info WHERE lesson_info.course_id = teacher_info.course_id 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 28 所 示 图 6 唱 28 例 6.43 中 SELECT 语 句 的 运 行 结 果
第 6 章 SQL Server 的 数 据 查 询 151 2. 在 FROM 子 句 中 定 义 连 接 SELECT table_name1.column_name, table_name2.column_name,... FROM { table_name1 [ join_type ] JOIN table_name2 ON join_conditions} WHERE [search_condition] 其 中 : join _ type 指 定 所 执 行 的 连 接 类 型 : 内 连 接 (IN NER JOIN ) 外 连 接 ( O U TER JOIN) 或 交 叉 连 接 (CROSS JOIN) 例 6.44 将 上 例 修 改 为 在 FROM 子 句 中 定 义 连 接 的 形 式, 具 体 命 令 如 下 : SELECT teacher_info.teacher_id, teacher_info.name, lesson_info.course_name FROM lesson_info INNER JOIN teacher_info ON (lesson_info.course_id = teacher_info.course_id) 由 于 连 接 涉 及 多 个 表 及 其 之 间 的 引 用, 所 以 列 的 引 用 都 必 须 明 确, 对 于 重 复 的 列 名 必 须 用 表 名 限 定 查 询 操 作 对 行 进 行 限 定 筛 选 的 逻 辑 顺 序 为 : 先 FRO M 子 句 连 接 条 件, 然 后 再 W HERE 子 句 搜 索 条 件, 最 后 H A VING 子 句 搜 索 条 件 6.3.2 内 连 接 内 连 接 (IN NER JOIN) 是 用 比 较 运 算 符 比 较 表 中 列 值, 返 回 符 合 连 接 条 件 的 数 据 行, 从 而 将 两 个 表 连 接 成 一 个 新 表 通 常 有 三 种 1. 等 值 连 接 等 值 内 连 接 在 连 接 条 件 中 使 用 等 号 ( = ) 运 算 符 比 较 被 连 接 列 的 列 值, 因 为 连 接 列 值 相 等 的 列, 连 接 的 列 要 显 示 两 次, 所 以 会 产 生 冗 余 行 例 6.45 针 对 stud_info 与 stud_ grade 中 的 stud_id 进 行 等 值 连 接, 具 体 命 令 如 下 : SELECT 倡 FROM stud_info INNER JOIN stud_grade ON stud_info.stud_id = stud_grade.stud_id ORDER BY stud_info.stud_id 例 6.45 是 在 stud_info 与 stud_grade 中 查 询 所 有 参 加 考 试 的 学 生 基 本 信 息 和 成 绩 分 数 运 行 代 码 后, 可 以 发 现 返 回 两 个 表 (stud_info, stud_grade) 中 连 接 列 的 列 值 相 等 的 所 有 列 2. 不 等 值 连 接 在 连 接 条 件 中 使 用 除 等 于 运 算 符 以 外 的 其 他 比 较 运 算 符 ( > > = < = <! >!< < > ), 来 比 较 被 连 接 的 列 的 列 值 例 6.46 不 等 值 连 接 的 具 体 命 令 如 下
152 SQL Server 数 据 库 应 用 技 术 SELECT stud_grade.stud_id, stud_info.name, stud_info.address, stud_grade.grade FROM stud_info INNER JOIN stud_grade ON stud_grade.name > stud_info.name WHERE stud_info.address LIKE 北 京 % ORDER BY stud_grade.name 例 6.46 为 一 个 大 于 ( > ) 连 接, 将 stud_grade.name 与 stud_info.name 按 汉 语 拼 音 字 母 排 列 顺 序 比 较, 以 此 作 为 表 stud_grade 和 表 stud_info 的 连 接 条 件, 把 两 个 表 连 接 所 产 生 的 查 询 结 果, 按 name 列 值 排 序, 在 查 询 结 果 中 只 包 含 地 址 列 值 中 以 北 京 开 头 的 行 3. 自 然 连 接 在 连 接 条 件 中 使 用 等 号 ( = ) 运 算 符 比 较 被 连 接 列 的 列 值, 但 它 使 用 选 择 列 表 指 定 查 询 结 果 集 合 中 所 包 括 的 列, 并 删 除 连 接 表 中 的 重 复 列 例 6.47 自 然 连 接 的 具 体 命 令 如 下 SELECT stud_grade. 倡,stud_info.telcode,stud_info.mark FROM stud_grade INNER JOIN stud_info ON stud_grade.stud_id = stud_info.stud_id ORDER BY stud_grade.stud_id 例 6.47 中 指 定 了 需 要 返 回 的 列, 删 除 了 重 复 列, 为 一 个 自 然 连 接 结 果 集 中 包 括 表 stud_info 中 的 telcode 列 和 mark 列, 以 及 表 stud_grade 中 的 所 有 列 例 6.48 使 用 多 个 连 接 实 现 多 表 连 接 SELECT stud_info.name, stud_grade.grade, lesson_info.course_name FROM stud_info INNER JOIN stud_grade ON stud_info.stud_id = stud_grade.stud_id INNER JOIN lesson_info ON stud_grade.course_id = lesson_info.course_id ORDER BY stud_info.stud_id, stud_grade.name, lesson_info.course_id 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 29 所 示 图 6 唱 29 例 6.48 中 SELECT 语 句 的 运 行 结 果 例 6.48 中 建 立 了 两 个 连 接, 从 而 连 接 了 三 个 表 : 表 stud_info 表 stud_ grade 和 表 lesson_info 在 返 回 的 结 果 集 中 显 示 stud_info 表 中 stud_id 列 stud_grade 表 中 name
第 6 章 SQL Server 的 数 据 查 询 153 列 lesson_info 表 中 course_name 列, 其 中 stud_grade 表 是 一 个 中 间 表, 如 果 没 有 它 连 接 无 法 实 现 6.3.3 外 连 接 在 内 连 接 查 询 中, 返 回 到 查 询 结 果 集 合 中 的 仅 是 符 合 连 接 条 件 (join_conditions) 的 数 据 行 而 外 连 接 (O U TER JOIN) 返 回 的 结 果 集 除 了 包 括 符 合 连 接 条 件 的 行 外, 还 将 满 足 连 接 条 件 的 记 录 与 另 一 个 表 中 的 记 录 进 行 连 接, 不 满 足 连 接 条 件 的 则 将 来 自 另 一 个 表 的 属 性 列 值 置 为 空 (N U L L) 1. 外 连 接 分 类 SELECT table_name1.column_name, table_name2.column_name,... FROM { table_name1 [LEFT RIGHT FULL] OUTER JOIN table_name2 ON join_conditions} WHERE [search_condition] 其 中 : 连 接 条 件 join_conditions 由 ON 子 句 给 出, 搜 索 条 件 search_condition 由 W HERE 子 句 给 出, 连 接 类 型 在 FRO M 子 句 中 给 出, 主 要 有 以 下 三 类 : (1) 左 外 连 接 (LEF T O U T ER JOIN) : 通 过 左 向 外 连 接 引 用 左 表 的 所 有 行 (2) 右 外 连 接 (RIG H T O U T ER JOIN) : 通 过 右 向 外 连 接 引 用 右 表 的 所 有 行 (3) 全 外 连 接 (F U LL O U TER JOIN) : 返 回 两 个 表 的 所 有 行 2. 使 用 左 外 连 接 例 6.49 学 生 成 绩 表 stud_grade 左 外 连 接 学 生 信 息 表 stud_info, 具 体 命 令 如 下 : 为 了 说 明 方 便, 先 在 学 生 信 息 表 中 插 入 一 条 新 记 录 INSERT INTO stud_info VALUES ( 0401010704, 王 一 明, 03/03/1986, 男, 甘 肃 省 兰 州 市, 0621 唱 2221837, 590000,573) SELECT stud_info.stud_id,stud_info.name,stud_grade.course_id FROM stud_info LEFT OU TER JOIN stud_grade ON stud_info.stud_id = stud_grade.stud_id ORDER BY stud_info.stud_id,stud_info.name,stud_grade.course_id 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 30 所 示 图 6 唱 30 例 6.49 中 SELECT 语 句 的 运 行 结 果
154 SQL Server 数 据 库 应 用 技 术 例 6.49 中 左 外 连 接 用 于 两 个 表 (stud_info, stud_grade) 中, 它 限 制 表 stud_grade 中 的 行, 而 不 限 制 表 stud_info 中 的 行 也 就 是 说, 在 左 外 连 接 中, 表 stud_info 中 不 满 足 条 件 的 行 也 显 示 出 来 在 返 回 结 果 中, 所 有 不 符 合 连 接 条 件 的 数 据 行 中 的 列 值 均 为 N U LL 3. 使 用 右 外 连 接 例 6.50 学 生 信 息 表 stud_info 右 外 连 接 学 生 成 绩 表 stud_grade, 具 体 命 令 如 下 : SELECT stud_info.stud_id,stud_info.name,stud_grade.course_id FROM stud_grade RIGH T OU TER JOIN stud_info ON stud_info.stud_id = stud_grade.stud_id ORDER BY stud_info.stud_id,stud_info.name,stud_grade.course_id 例 6.50 中 右 外 连 接 用 于 两 个 表 (stud_info, stud_grade) 中,RIG H T O U TER JOIN 限 制 表 stud_grade 中 的 行, 而 不 限 制 表 stud_info 中 的 行 也 就 是 说, 在 右 外 连 接 中,stud_ info 表 不 满 足 条 件 的 行 也 显 示 出 来 了 运 行 命 令 发 现,SELEC T 语 句 的 输 出 结 果 是 学 生 信 息 表 stud_info 中 的 所 有 记 录, 以 及 学 生 成 绩 表 stud_grade 中 符 合 和 不 符 合 连 接 条 件 的 记 录 对 于 没 有 参 加 课 程 考 试 的 学 生 只 输 出 其 基 本 信 息 (stud_info.stud_id, stud_info.name), 其 课 程 号 (stud_ grade. course_id) 为 空 例 6.51 教 师 信 息 表 teacher_info 右 外 连 接 课 程 信 息 表 lesson_info, 具 体 命 令 如 下 : 为 了 说 明 方 便, 先 在 老 师 信 息 表 中 插 入 新 教 师 张 丛 中 的 数 据 记 录 TEACHER_ID NA ME GENDER AGE TECH_ TITLE TELEPHONE SALARY COURSE_ID 010107 张 丛 中 男 21 020 唱 34602234 310 INSERT INTO teacher_info VALUES( 010107, 张 丛 中, 男,21,, 020 唱 34602234,310, ) 同 样, 为 了 显 示 结 果 突 出, 在 课 程 信 息 表 (lesson_info) 中 插 入 下 面 两 条 新 记 录 Course_ID ( 课 程 号 ) Course_name ( 课 程 名 ) Course_type ( 课 程 类 型 ) Course_mark ( 课 程 学 分 ) Course_time ( 课 程 学 时 ) 0401010107 Java web 程 序 设 计 考 试 3.5 60 0401010108 J2EE 应 用 程 序 设 计 考 试 3.5 60 INSERT INTO lesson_info VALUES( 0401010107, Java web 程 序 设 计, 考 试,3.5,60) INSERT INTO lesson_info VALUES( 0401010108, J2EE 应 用 程 序 设 计, 考 试,3.5,60) SELECT lesson_info.course_name, teacher_info.name, teacher_info.teacher_id FROM lesson_info RIGH T OU TER JOIN teacher_info ON lesson_info.course_id = teacher_info.course_id 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 31 所 示
第 6 章 SQL Server 的 数 据 查 询 155 图 6 唱 31 限 制 表 lesson_info 中 的 行, 不 限 制 表 teacher_info 中 的 行 SELECT lesson_info.course_name, teacher_info.name, teacher_info.teacher_id FROM teacher_info RIGH T OU TER JOIN lesson_info ON lesson_info.course_id = teacher_info.course_id 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 32 所 示 图 6 唱 32 限 制 表 teacher_info 中 的 行, 不 限 制 表 lesson_info 中 的 行 4. 使 用 全 外 连 接 例 6.52 教 师 信 息 表 teacher_info 全 外 连 接 课 程 信 息 表 lesson_info, 具 体 命 令 如 下 : SELECT lesson_info.course_name, teacher_info.name, teacher_info.teacher_id FROM lesson_info FULL OU TER JOIN teacher_info ON lesson_info.course_id = teacher_info.course_id ORDER BY lesson_info.course_name, teacher_info.name, teacher_info.teacher_id 例 6.52 中 使 用 全 外 连 接, 不 管 两 个 表 (teacher_info, lesson_info) 的 行 是 否 满 足 连 接 条 件, 均 返 回 至 查 询 结 果 集 运 行 命 令 发 现,SELEC T 语 句 的 输 出 结 果 包 括 了 教 师 信 息 表 teacher_info 和 课 程 信 息 表 lesson_info 中 的 所 有 记 录 三 种 外 连 接 中 也 可 以 使 用 W HERE 子 句 和 H A VING 子 句 对 搜 索 条 件 进 行 限 定, 删 除 不 符 合 查 询 条 件 的 数 据 然 而, 下 面 介 绍 的 交 叉 连 接 中 则 不 使 用 W H ERE 子 句 6.3.4 交 叉 连 接 交 叉 连 接 (Cross Join) 不 使 用 W H ERE 子 句 它 产 生 一 个 结 果 集, 在 这 个 结 果 集 中 包 含 了 所 连 接 的 两 个 表 中 所 有 行 的 全 部 组 合 其 数 目 为 第 一 表 中 符 合 连 接 条 件 的 行 数 与 第 二 个 表 中 符 合 连 接 条 件 的 行 数 的 乘 积 一 般 说 来, 交 叉 连 接 返 回 的 结 果 集 的 行 数 是 相 当 大 的 例 6.53 教 师 信 息 表 teacher_info 交 叉 连 接 课 程 信 息 表 lesson_info, 具 体 命 令
156 SQL Server 数 据 库 应 用 技 术 如 下 : SELECT lesson_info.course_name, teacher_info.name, teacher_info.teacher_id FROM lesson_info CROSS JOIN teacher_info ORDER BY lesson_info.course_name, teacher_info.name, teacher_info.teacher_id 例 6.53 中 使 用 交 叉 连 接, 返 回 的 结 果 集 包 含 56 行, 由 表 lesson _ info 的 8 行 和 表 teacher_info 的 7 行 组 合 而 成 (7 倡 8 = 56) 运 行 命 令 发 现, 可 以 发 现 每 一 个 课 程 名 称 组 合 7 次 教 师 姓 名 和 教 师 编 号 6.3.5 自 连 接 如 果 所 连 接 的 两 个 表 为 同 一 个 表, 那 么 这 种 连 接 又 称 为 自 连 接 自 连 接 能 把 一 个 表 中 的 行 和 该 表 中 另 外 一 些 行 联 系 起 来 SELECT aliat1.column_name1,aliat1.column_name2,... FROM table_name aliat1, table_name aliat2 WHERE [aliat1.column_name join_operator aliat2.column_name] 在 自 连 接 中, 主 要 用 来 查 询 同 一 个 表 中 的 数 据 信 息, 即 同 一 个 表 应 给 出 不 同 的 别 名 例 6.54 查 询 学 生 成 绩 表 stud_grade 中 与 学 号 为 0401020103 的 学 生 所 学 的 课 程 相 同 的 学 生 的 学 号 姓 名 课 程 号 成 绩 SELECT a.stud_id,a.name,a.course_id,a.grade FROM stud_grade a, stud_grade b WHERE a.course_id = b.course_id AND a.stud_id < > 0401020103 AND b.stud_id = 0401020103 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 33 所 示 图 6 唱 33 例 6.54 中 SELECT 语 句 的 运 行 结 果 这 里 通 过 两 个 别 名 a b 查 看 同 一 个 学 生 成 绩 表, 由 于 是 查 询 与 学 号 为 0401020103 的 学 生 学 习 相 同 课 程 的 其 他 学 生, 故 在 查 询 结 果 中 不 应 该 包 括 学 号 为 0401020103 的 学 生, 因 此 上 面 的 查 询 条 件 描 述 为 a.course _ id = b.course _ id A ND a.stud _ id < > 0401020103 A N D b.stud_id = 0401020103 6.4 嵌 套 查 询 一 个 SELEC T 唱 FRO M 唱 W HERE 语 句 称 为 一 个 查 询 块 有 时 一 个 查 询 块 无 法 完 成 查 询 任 务, 需 要 一 个 子 SELEC T 的 结 果 作 为 主 查 询 语 句 的 条 件 将 一 个 查 询 块 嵌 套 在 另 一
第 6 章 SQL Server 的 数 据 查 询 157 个 查 询 块 的 条 件 子 句 中 的 查 询 被 称 为 嵌 套 查 询 嵌 套 查 询 可 以 用 多 个 简 单 查 询 构 成 复 杂 的 查 询, 从 而 增 强 其 查 询 功 能 SQ L Server 允 许 多 层 嵌 套 查 询, 即 一 个 子 查 询 中 还 可 以 嵌 套 其 他 子 查 询 嵌 套 查 询 一 般 的 求 解 方 法 是 由 里 向 外 进 行 处 理, 即 每 个 子 查 询 在 上 一 级 查 询 处 理 之 前 求 解, 子 查 询 的 结 果 用 于 建 立 其 父 查 询 的 查 找 条 件 子 查 询 中 所 存 取 的 表 可 以 是 父 查 询 没 有 存 取 的 表, 子 查 询 选 出 的 记 录 不 显 示 需 要 特 别 指 出 的 是, 子 查 询 的 SELEC T 语 句 中 不 能 使 用 ORDER BY 子 句,ORDER BY 子 句 只 能 对 最 终 查 询 结 果 排 序 6.4.1 单 值 嵌 套 查 询 子 查 询 的 返 回 结 果 是 一 个 值 的 嵌 套 查 询 称 为 单 值 嵌 套 查 询 例 6.55 查 询 与 学 号 为 0401030101 的 学 生 同 在 计 算 机 应 用 技 术 专 业 学 习 的 所 有 学 生 的 学 号 姓 名 性 别 及 电 话 号 码, 具 体 命 令 如 下 : SELECT stud_id, name, gender, telcode FROM stud_info WHERE substring(stud_id,5,2) = (SELECT substring(stud_id,5,2) FROM stud_info WHERE stud_id = 0401030101 ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 34 所 示 图 6 唱 34 例 6.55 中 SELECT 语 句 的 运 行 结 果 例 6.56 查 询 工 资 高 于 孙 乐 多 所 有 老 师 的 编 号 姓 名 性 别 及 工 资, 具 体 命 令 如 下 : SELECT teacher_id, name, gender, salary FROM teacher_info WHERE salary > (SELECT salary FROM teacher_info WHERE name = 孙 乐 多 ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 35 所 示 6.4.2 多 值 嵌 套 查 询 图 6 唱 35 例 6.56 中 SELECT 语 句 的 运 行 结 果 子 查 询 的 返 回 结 果 是 一 列 值 的 嵌 套 查 询 称 为 多 值 嵌 套 查 询
158 SQL Server 数 据 库 应 用 技 术 1. 使 用 [NOT]IN 操 作 符 IN 运 算 符 可 以 测 试 表 达 式 的 值 是 否 与 子 查 询 返 回 集 中 的 某 一 个 相 等,N O T IN 恰 好 与 其 相 反 例 6.57 在 学 生 成 绩 表 中 查 询 课 程 类 型 为 考 试 的 学 生 学 号 姓 名 成 绩, 具 体 命 令 如 下 : SELECT stud_id,name,grade FROM stud_grade WHERE course_id IN (SELECT course_id FROM lesson_info WHERE course_type = 考 试 ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 36 所 示 图 6 唱 36 例 6.57 中 SELECT 语 句 的 运 行 结 果 例 6.58 查 询 学 生 I T 市 场 营 销 和 计 算 机 导 论 课 程 成 绩 查 询 涉 及 学 号 姓 名 成 绩 和 课 程 名 4 个 列 名 学 号 姓 名 和 成 绩 存 放 在 学 生 成 绩 表 stud_grade 中, 课 程 名 存 放 在 课 程 信 息 表 lesson_info 中, 但 stud_grade 与 lesson_info 两 个 表 之 间 通 过 course_ id 列 建 立 联 系 SELECT stud_id, name,course_id, grade FROM stud_grade WHERE course_id IN ( SELECT course_id FROM lesson_info WHERE course_name = IT 市 场 营 销 OR course_name = 计 算 机 导 论 ) 本 嵌 套 查 询 也 可 以 用 连 接 查 询 实 现 : SELECT stud_id, name, stud_grade.course_id, grade FROM stud_grade, lesson_info WHERE stud_grade.course_id = lesson_info.course_id AND (lesson_info.course_name = IT 市 场 营 销 OR lesson_info.course_name = 计 算 机 导 论 ) 2. 使 用 [NOT]EXISTS 操 作 符 EXIS T S 表 示 一 个 子 查 询 至 少 返 回 一 行 时 产 生 逻 辑 真 值 true, 不 返 回 任 何 行 时 产 生 逻 辑 假 值 false 与 EXIS T S 相 对 应 的 是 N O T EXIS T S 使 用 NO T EXIS T S 后, 若 内 层 查 询 结 果 为 空, 则 外 层 的 W HERE 子 句 返 回 真 值, 否 则 返 回 假 值 由 EXIS T S 引 出 的 子 查 询, 其 目 标 列 表 达 式 通 常 都 用 倡 表 示, 因 为 带 EXIS T S 的 子
第 6 章 SQL Server 的 数 据 查 询 159 查 询 只 返 回 真 值 或 假 值, 给 出 列 名 无 实 际 意 义 例 6.59 查 询 课 程 号 为 0401010106 的 多 媒 体 技 术 这 门 课 的 成 绩 在 80 至 89 分 的 学 生 的 学 号 姓 名, 具 体 命 令 如 下 : SELECT stud_id,name FROM stud_info WHERE EXISTS (SELECT 倡 FROM stud_grade WHERE stud_grade.stud_id = stud_info.stud_id AND (grade BETWEEN 80 AND 89) AND course_id = 0401010106 ) 语 句 的 执 行 过 程 是 : 取 出 stud_grade 的 满 足 条 件 记 录, 然 后 执 行 内 层 查 询, 若 查 询 结 果 为 非 空, 则 取 出 stud_info 中 的 stud_id,name 列 值 形 成 结 果 集 输 出, 直 到 处 理 完 stud_ info 中 所 有 行 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 37 所 示 图 6 唱 37 例 6.59 中 SELECT 语 句 的 运 行 结 果 6.5 联 合 U NION 运 算 符 能 将 多 个 SELEC T 语 句 的 结 果 集 合 并 成 一 个 结 果 集 使 用 U NION 运 算 符 注 意 以 下 问 题 : (1) 使 用 U NION 进 行 联 合 的 结 果 集 必 须 具 有 相 同 的 结 构 列 数 和 兼 容 的 数 据 类 型 (2) U NION 运 算 符 连 接 的 各 语 句 中 对 应 结 果 集 的 列 的 顺 序 也 必 须 一 致 (3) 使 用 联 合 查 询 后 返 回 列 的 列 名 是 第 一 个 查 询 语 句 中 各 列 的 列 名, 必 须 在 第 一 个 查 询 语 句 中 定 义 别 名 (4) 要 对 联 合 查 询 的 结 果 集 进 行 排 序 时 也 必 须 使 用 第 一 个 查 询 语 句 中 的 列 名 例 6.60 查 询 所 学 专 业 同 为 计 算 机 控 制 技 术 或 年 龄 为 17 岁 的 所 有 学 生 的 姓 名, 具 体 命 令 如 下 : SELECT stud_id,name FROM stud_info WHERE substring(stud_id,5,2) = 03 UNION SELECT stud_id,name FROM stud_info WHERE DATEDIFF(year, birthday, getdate()) = 17 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 38 所 示 图 6 唱 38 例 6.60 中 SELECT 语 句 的 运 行 结 果
160 SQL Server 数 据 库 应 用 技 术 U NION 运 算 符 实 际 将 下 面 两 个 语 句 的 结 果 组 合 在 一 起 SELECT stud_id,name FROM stud_info WHERE substring(stud_id,5,2) = 03 SELECT stud_id,name FROM stud_info WHERE DATEDIFF(year, birthday, getdate()) = 17 实 训 1. 实 训 目 的 (1) 掌 握 SELEC T 语 句 基 本 语 法 (2) 学 会 使 用 ORDER BY 子 句 进 行 排 序, 使 用 GRO U P BY 子 句 进 行 分 组 统 计 (3) 学 会 数 据 汇 总 连 接 查 询 子 查 询 的 方 法 2. 实 训 的 知 识 准 备 SELEC T 语 句 说 简 单 也 简 单, 说 复 杂 也 复 杂 因 为 在 SELEC T 语 句 中, 经 常 使 用 的 关 键 字 只 有 三 个, 即 SELEC T 关 键 字 FROM 关 键 字 和 W HERE 关 键 字 SELEC T 指 定 要 检 索 查 询 的 列 名,FROM 指 出 从 哪 些 表 里 面 来 查 找 数 据,W HERE 指 定 按 照 什 么 条 件 来 进 行 数 据 查 询 有 时 SELEC T 语 句 中 可 以 带 有 比 较 复 杂 的 子 句, 以 完 成 非 常 复 杂 的 查 询 对 于 初 学 者 来 说, 开 始 只 能 写 出 一 些 简 单 的 SELEC T 查 询 语 句, 完 成 简 单 的 数 据 查 询 ; 经 过 一 段 时 间 训 练 后, 对 SQ L 语 句 熟 悉 到 一 定 程 度, 才 能 写 出 一 些 复 杂 的 SELEC T 语 句 来 完 成 一 些 涉 及 多 表 数 据 复 杂 条 件 的 查 询 语 句, 才 能 深 刻 地 理 解 SELEC T 语 句 的 语 法 格 式, 包 括 ORDER BY 和 GRO U P BY 子 句, 以 及 子 查 询 连 接 查 询 和 数 据 汇 总 等 3. 实 训 内 容 和 步 骤 (1) SELEC T 语 句 的 基 本 使 用 1 查 询 学 生 基 本 信 息 表 (stud_info) 中 的 每 个 学 生 的 所 有 数 据 SELECT 倡 FROM stud_info 自 行 练 习 : 用 SELEC T 语 句 查 询 教 师 基 本 信 息 表 (teacher_info) 学 生 成 绩 表 (stud_ grade) 课 程 信 息 表 (lesson _ info) 课 程 安 排 表 ( teach _ schedule) 院 系 代 码 表 (dept _ code) 专 业 代 码 表 ( specialty _ code) 教 研 室 信 息 表 ( staffroom _ info) 和 教 室 信 息 表 (classroom_info) 的 所 有 记 录 2 在 学 生 基 本 信 息 表 (stud_info) 中 查 询 每 个 学 生 的 地 址 和 电 话 SELECT stud_id, name, address, telcode FROM stud_info 自 行 练 习 : 用 SELEC T 语 句 查 询 教 师 基 本 信 息 表 (teacher_info) 学 生 成 绩 表 (stud_ grade) 课 程 信 息 表 (lesson _ info) 课 程 安 排 表 ( teach _ schedule) 院 系 代 码 表 (dept _ code) 专 业 代 码 表 ( specialty _ code) 教 研 室 信 息 表 ( staffroom _ info) 和 教 室 信 息 表 (classroom_info) 的 一 列 或 若 干 列 3 查 询 stud_id 为 0401010634 的 学 生 的 地 址 和 电 话
第 6 章 SQL Server 的 数 据 查 询 161 SELECT stud_id, name,address, telcode FROM stud_info WHERE 自 行 练 习 : 用 SELEC T 语 句 查 询 教 师 基 本 信 息 表 (teacher_info) 学 生 成 绩 表 (stud_ grade) 课 程 信 息 表 (lesson _ info) 课 程 安 排 表 ( teach _ schedule) 院 系 代 码 表 (dept _ code) 专 业 代 码 表 ( specialty _ code) 教 研 室 信 息 表 ( staffroom _ info) 和 教 师 信 息 表 (classroom_info) 中 满 足 指 定 条 件 的 一 列 或 若 干 列 4 查 询 stud_info 表 中 性 别 为 女 的 学 生 的 地 址 和 电 话 使 用 AS 子 句 将 结 果 中 指 定 目 标 列 的 标 题 分 别 指 定 为 地 址, 电 话 SELECT stud_id, name,address, telcode FROM stud_info 5 查 询 计 算 机 应 用 教 研 室 的 教 师 工 资 情 况 SELECT teacher_id, name, gender,age, tech_title,salary FROM teacher_info 6 找 出 所 有 姓 王 的 教 师 所 对 应 的 技 术 职 称 SELECT teacher_id, name, tech_title FROM teacher_info 自 行 练 习 : 查 询 所 有 电 话 号 码 中 含 有 3460 的 教 师 所 担 任 课 程 的 编 码 7 在 学 生 成 绩 表 中 查 询 成 绩 在 80 ~ 89 之 间 的 学 生 的 学 号 课 程 号 和 成 绩 SELECT stud_id, course_id, grade FROM stud_grade 自 行 练 习 : 在 学 生 基 本 信 息 表 (stud_info) 中 查 询 出 生 日 期 在 01 唱 01 唱 1987 ~ 12 唱 31 唱 1987 的 学 生 的 学 号 姓 名 家 庭 住 址 和 邮 政 编 码 (2) 子 查 询 的 使 用 1 查 找 在 计 算 机 工 程 系 工 作 的 教 师 的 情 况 SELECT 倡 FROM teacher_info WHERE substring(teacher_id,3,2) = ( ) 自 行 练 习 : 用 子 查 询 的 方 法 查 找 计 算 机 工 程 系 计 算 机 应 用 教 研 室 的 教 师 的 基 本 情 况 2 查 找 计 算 机 工 程 系 中 所 有 担 任 计 算 机 导 论 的 教 师 编 号 和 姓 名
162 SQL Server 数 据 库 应 用 技 术 SELECT teacher_id, name FROM teacher_info WHERE substring(teacher_id,3,2) = ( ) AND right(course_id,2) = ( ) 提 示 练 习 : 在 学 生 成 绩 表 中 查 询 计 算 机 工 程 系, 且 课 程 名 称 为 计 算 机 导 论 的 学 生 考 试 情 况 SELECT 倡 FROM stud_grade WHERE substring(stud_id,3,2) = ( ) AND right(course_id,2) = ( ) 3 查 找 计 算 机 应 用 技 术 专 业 的 学 生 学 号 姓 名 年 龄 电 话 号 码 及 其 家 庭 地 址 SELECT stud_id, name, age, telcode,address FROM stud_info WHERE substring(stud_id,3,2) = ( ) AND substring(stud_id,5,2) = ( ) 提 示 练 习 : 查 询 计 算 机 工 程 系 计 算 机 应 用 教 研 室 的 教 师 编 号 姓 名 及 其 课 程 号 SELECT teacher_id, name,course_id FROM teacher_info WHERE = (SELECT deptcode FROM dept_code WHERE deptname = 计 算 机 工 程 系 ) AND substring(teacher_id,3,2) = ( ) 4 查 找 计 算 机 工 程 系 担 任 多 媒 体 技 术 课 程 教 学 的 教 师 姓 名 电 话 号 码 及 其 课 程 编 码 SELECT name, telephone,course_id FROM teacher_info WHERE left(teacher_id,2) IN ( ) AND right(course_id,2) IN ( ) 自 行 练 习 : 查 询 计 算 机 工 程 系 参 与 了 多 媒 体 技 术 课 程 考 试 的 学 生 的 学 号 姓 名 和 考 试 成 绩
第 6 章 SQL Server 的 数 据 查 询 163 (3) 连 接 查 询 的 使 用 1 下 列 命 令 实 现 stud_info 与 stud_grade 等 值 内 连 接, 请 完 善 其 命 令 SELECT 倡 FROM ON ORDER BY stud_info.stud_id 自 行 练 习 : 写 出 课 程 安 排 表 (teach_schedule) 与 课 程 信 息 表 (lesson_info) 等 值 内 连 接 的 SQ L 命 令 2 下 列 命 令 实 现 teacher_info 与 lesson_info 左 外 连 接, 请 完 善 其 命 令 SELECT lesson_info.course_name, teacher_info.name, teacher_info.teacher_id FROM ON 自 行 练 习 : 写 出 教 师 信 息 表 (teacher_info) 与 课 程 安 排 表 (teach_schedule) 右 外 连 接 的 SQ L 命 令 (4) 数 据 汇 总 1 查 询 计 算 机 工 程 系 全 体 教 师 的 平 均 工 资 SELECT AS 计 算 机 工 程 系 教 师 平 均 工 资 FROM teacher_info WHERE left(teacher_id,2) = (SELECT deptcode FROM dept_code WHERE deptname = 计 算 机 工 程 系 ) 自 行 练 习 : 查 询 计 算 机 工 程 系 教 师 的 最 大 年 龄 和 最 小 年 龄 2 求 计 算 机 工 程 系 教 师 的 平 均 年 龄 SELECT AS 平 均 年 龄 FROM teacher_info WHERE left(teacher_id,2) = (SELECT deptcode FROM dept_code WHERE deptname = 计 算 机 工 程 系 ) 自 行 练 习 : 查 询 计 算 机 工 程 系 学 生 的 入 学 成 绩 的 最 高 分 数 和 最 低 分 数 3 求 计 算 机 工 程 系 教 师 的 总 人 数 SELECT FROM teacher_info WHERE left(teacher_id,2) = (SELECT deptcode FROM dept_code WHERE deptname = 计 算 机 工 程 系 ) 自 行 练 习 : 统 计 计 算 机 工 程 系 担 任 多 媒 体 技 术 课 程 教 学 的 教 师 的 工 资 总 和 (5) GRO U P BY ORDER BY 子 句 的 使 用 1 按 职 称 统 计 各 个 教 研 室 的 教 师 人 数
164 SQL Server 数 据 库 应 用 技 术 SELECT tech_title 职 称, COUNT( FROM teacher_info GROUP BY ) 人 数 自 行 练 习 : 按 性 别 统 计 计 算 机 工 程 系 的 学 生 人 数 2 将 计 算 机 工 程 系 职 称 为 讲 师 的 教 师, 按 年 龄 由 低 到 高 排 列 SELECT teacher_id, name, tech_title, FROM teacher_info WHERE tech_title = 讲 师 ORDER BY 自 行 练 习 : 将 计 算 机 工 程 系 的 学 生 情 况 按 出 生 日 期 的 先 后 排 列 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) SELEC T 语 句 的 哪 一 子 句 可 以 告 诉 SQ L Server 要 从 何 处 查 询 数 据? 怎 样 才 能 限 制 从 SQ L Server 中 返 回 的 行 数? 怎 样 才 能 改 变 由 SELEC T 语 句 返 回 的 行 的 排 序? 在 SELEC T 语 句 中 用 什 么 关 键 字 能 消 除 重 复 行? (2) 什 么 数 据 类 型 可 与 LIKE 关 键 字 一 起 使 用? 什 么 函 数 能 将 字 符 串 末 尾 的 空 格 去 掉? 什 么 函 数 能 将 一 个 表 达 式 从 一 种 数 据 类 型 改 变 为 另 一 种 数 据 类 型? (3) 请 用 BE T WEEN...A ND 形 式 改 写 条 件 子 句 W H ERE mark > 560 A ND mark < 600 (4) 什 么 集 合 函 数 能 对 数 值 类 型 的 列 值 进 行 求 和? 什 么 集 合 函 数 能 用 来 确 定 一 个 表 中 包 含 多 少 行? 在 一 个 包 含 集 合 函 数 的 SELEC T 语 句 中,GRO U P BY 子 句 有 哪 些 用 途? (5) H A VING 与 W H ERE 同 用 于 指 出 查 询 条 件, 请 说 明 各 自 的 应 用 场 合 (6) 如 果 只 想 查 看 两 个 连 接 的 表 中 互 相 匹 配 的 行, 应 使 用 什 么 类 型 的 连 接? (7) 什 么 是 非 等 值 内 连 接? 请 说 明 下 面 语 句 返 回 什 么 结 果? SELECT p.stud_id, p.name, s.course_id, s.grade FROM stud_info p, stud_grade s WHERE p.stud_id > s.stud_id (8) 什 么 是 自 连 接? 请 说 明 下 面 查 询 语 句 返 回 什 么 结 果? SELECT b.stud_id, b.name, b.telcode, b.address FROM stud_info a, stud_info b WHERE b.address like 北 京 市 % AND a.name = 李 伟 2. 选 择 最 适 合 的 答 案 (1) 假 如 需 要 查 找 出 生 日 期 在 1987 年 1 月 1 日 以 前, 并 且 入 学 成 绩 高 于 500 或 入 学 成 绩 低 于 560 的 学 生, 下 列 哪 条 查 询 语 句 最 合 适? ( )
第 6 章 SQL Server 的 数 据 查 询 165 A. SELEC T name FRO M stud_info W HERE birthday > 01/01/1987 A ND (mark < 500 OR mark > 560) B. SELEC T name FRO M stud_info W HERE birthday < 01/01/1987 A ND mark < 500 A ND mark > 560 C. SELEC T name FRO M stud_info W HERE birthday < 01/01/1987 A ND mark < 500 OR mark > 560 D. SELEC T name FRO M stud_info W HERE birthday < 01/01/1987 A ND mark BE T WEEN 500 A ND 560 (2) 针 对 下 列 查 询 语 句, 有 什 么 错 误? ( ) SELECT stud_info.name, stud_id FROM stud_info s WHERE stud_id = 0401040123 A. 当 表 没 有 被 连 接 时, 在 查 询 中 不 能 使 用 表 的 别 名 B. 当 定 义 了 一 张 表 的 别 名 时, 必 须 用 别 名 限 制 所 有 列 名 C. 假 如 一 张 表 定 义 了 别 名, 不 能 使 用 表 名 限 制 一 列 名 D. 在 SELEC T 子 句 中, 不 能 其 中 一 列 有 限 制, 而 其 他 列 没 有 限 制 应 该 是 所 有 列 要 么 都 限 制, 要 么 都 不 限 制 (3) 当 下 列 查 询 成 功 执 行 时, 将 返 回 的 最 大 的 行 数 是 多 少? ( ) SELECT teacher_ id, name FROM teacher_ info WHERE age = ( SELECT MAX(age) FROM teacher_info) A.1 B. 不 确 定 C.0 或 1 D.256 (4) 下 列 函 数 中 哪 个 不 是 集 合 函 数? ( ) A. SU M B. A VG C. GREA T ES T D. CO U N T (5) 下 列 代 码 中 哪 一 行 有 错? ( ) 1 SELEC T g.name,e.name 2 FRO M stud_info e, stud_grade g 3 W H ERE e.stud_id = g.stud_id 4 ORDER BY 89 A. 第 1 行 B. 第 2 行 C. 第 3 行 D. 第 4 行 (6) 在 一 个 查 询 中, 哪 一 个 子 句 将 限 制 返 回 的 行? ( ) A. ORDER BY B. W HERE C. SELEC T D. FRO M (7) 哪 一 个 运 算 符 可 以 替 代 W H ERE 子 句 中 的 OR 运 算 符? ( ) A. IN B. > = C. LIKE D. < = (8) 下 列 代 码 哪 一 行 有 错? ( ) 1 SELEC T gender, CO U N T(gender) 2 FRO M stud_info 3 GRO U P BY gender 4 H A VING CO U N T(gender) = 5 (SELEC T M AX(CO U N T(gender)) 6 FRO M stud_info 7 GRO U P BY gender)
166 SQL Server 数 据 库 应 用 技 术 A. 第 3 行 B. 没 有 错 C. 第 5 行 D. 第 7 行 (9) 下 列 语 句 中 的 哪 一 行 有 错 误? ( ) 1 SELEC T stud_id, name 2 FRO M stud_info 3 ORDER BY mark 4 W HERE mark > ( SELEC T mark FRO M stud _ info W HERE name LIKE % 军 ) A. 第 4 行 B. 第 2 行 C. 第 3 行 D. 没 有 错 误 (10) 下 列 哪 个 函 数 不 能 返 回 一 个 字 符 串 的 部 分 或 全 部 字 符? ( ) A. LEF T B. SUBS T RING C. RIG H T D. LOWER (11) 下 列 哪 个 函 数 不 能 返 回 日 期 时 间 类 型 的 数 据? ( ) A. DA Y B. GE T DA T E C. DA T EADD D. DA T EDIFF (12) 下 列 哪 个 函 数 用 于 从 一 个 字 符 串 中 去 掉 开 头 的 字 符? ( ) A. L T RIM B. SUBS T R C. R T RIM D. U PPER (13) 下 列 查 询 返 回 什 么 结 果? ( ) SELECT ST UFF(REVERSE( Anticcipation ),12,2, shun ) A. noitapiccitshun B. A nshunccipashun C. noshunapiccitna D. A nticcipatishun (14) 下 面 哪 一 个 语 句 能 使 用 通 配 符 % _ [] ^ 查 找 以 区 字 符 串 结 尾 的 地 址? ( ) A. SELEC T address FRO M stud_info W H ERE address LIKE [ 区 ] B. SELEC T address FRO M stud_info W HERE address LIKE % 区 C. SELEC T address FRO M stud_info W HERE address LIKE [^ 区 ] D. SELEC T address FRO M stud_info W HERE address LIKE 区 3. 按 照 下 列 题 目 要 求, 写 出 对 应 的 SQL 命 令 (1) 列 出 stud_info 学 生 信 息 表 中 所 有 记 录 的 name gender 和 address 列 (2) 将 下 列 学 生 成 绩 插 入 到 stud_grade 学 生 成 绩 表 中 stud_id( 学 号 ) name( 姓 名 ) course_id( 课 程 号 ) grade( 成 绩 ) 0401010717 代 燕 0401010104 60 (3) 显 示 stud_grade 学 生 成 绩 表 中 成 绩 为 85,86 或 88 的 记 录 (4) 显 示 stud_grade 学 生 成 绩 表 中 成 绩 在 60 ~ 80 的 所 有 记 录 (5) 显 示 stud_grade 学 生 成 绩 表 中 的 最 高 分 的 学 生 学 号 和 课 程 号 (6) 以 入 学 成 绩 mark 降 序 显 示 stud_info 学 生 信 息 表 中 所 有 记 录 (7) 首 先 显 示 计 算 机 工 程 系 计 算 机 网 络 技 术 专 业 02 班 全 体 学 生 的 基 本 信 息, 然 后 再 统 计 计 算 机 工 程 系 计 算 机 网 络 技 术 专 业 02 班 的 学 生 人 数
第 6 章 SQL Server 的 数 据 查 询 167 (8) 显 示 0401010106 号 课 程 的 平 均 分 (9) 在 学 生 成 绩 表 中, 显 示 最 低 分 大 于 60 最 高 分 小 于 80 的 stud_id 列 (10) 显 示 成 绩 高 于 学 号 为 0401030101 课 程 号 为 0401010105 的 所 有 成 绩 记 录 (11) 显 示 出 与 学 号 为 0401040112 的 学 生 同 年 出 生 的 所 有 学 生 的 学 号 姓 名 和 出 生 日 期 (12) 显 示 课 程 号 为 0401010105 的 同 学 人 数 和 老 师 姓 名 (13) 列 出 所 有 任 课 老 师 的 姓 名 和 所 在 院 系 (14) 在 学 生 成 绩 表 中, 显 示 存 在 有 85 分 以 上 成 绩 的 课 程 号, 并 统 计 各 门 课 程 不 及 格 人 数 在 10 人 以 上 的 课 程 数 量 (15) 显 示 计 算 机 工 程 系 老 师 所 教 课 程 的 成 绩 表 (16) 显 示 计 算 机 工 程 系 和 机 电 工 程 系 职 称 为 助 教 的 教 师 的 姓 名 和 性 别 (17) 显 示 课 程 号 为 0401010103 课 程 成 绩 高 于 0401010104 课 程 的 学 生 的 课 程 名 学 号 和 姓 名, 并 按 成 绩 从 高 到 低 次 序 排 列 (18) 将 stud_grade 学 生 成 绩 表 中 的 分 数 按 班 级 和 学 号 顺 序 显 示 (19) 将 stud_grade 学 生 成 绩 表 中 课 程 号 为 0401010106 的 成 绩 加 5 (20) 删 除 stud_info 学 生 信 息 表 中 姓 名 为 张 源 的 学 生 记 录
第 7 章 数 据 复 制 数 据 复 制 是 一 个 实 现 数 据 发 布 的 方 法, 就 是 把 一 个 数 据 库 服 务 器 上 的 数 据 通 过 网 络 传 输 到 一 个 或 多 个 地 理 位 置 不 同 的 数 据 库 服 务 器 中 的 过 程 使 用 数 据 复 制 技 术 可 以 使 数 据 的 发 布 过 程 自 动 化, 以 适 应 可 伸 缩 组 织 的 需 要 减 轻 主 服 务 器 的 工 作 负 荷 并 提 高 数 据 的 使 用 效 率 本 章 将 对 SQ L Server 2000 的 复 制 技 术 进 行 详 细 的 分 析 和 介 绍 7.1 复 制 模 型 7.1.1 复 制 与 出 版 的 关 系 为 了 更 好 地 理 解 数 据 复 制 的 过 程 和 原 理, 可 以 把 数 据 复 制 比 喻 成 图 书 报 纸 等 出 版 过 程, 即 把 信 息 从 信 息 源 迅 速 传 送 到 信 息 接 收 处, 它 可 以 形 象 地 解 释 数 据 复 制 的 过 程 之 所 以 将 数 据 复 制 过 程 比 喻 成 出 版 过 程, 是 因 为 这 两 种 过 程 从 内 容 到 形 式 都 非 常 类 似 两 种 过 程 都 是 传 送 信 息, 复 制 过 程 主 要 传 送 数 据 信 息 两 种 过 程 中 都 有 信 息 源 和 信 息 接 收 处 出 版 过 程 中, 信 息 源 是 指 信 息 拥 有 者 的 出 版 社, 信 息 接 收 处 是 指 订 阅 了 出 版 物 的 用 户 而 复 制 过 程 中, 信 息 源 是 将 要 复 制 的 数 据 所 在 的 SQ L Server 系 统 服 务 器, 信 息 接 收 处 是 指 接 收 复 制 数 据 的 SQ L Server 系 统 服 务 器 或 其 他 服 务 器 从 信 息 传 送 方 向 来 看, 这 两 种 过 程 基 本 上 都 是 单 向 的 由 于 把 复 制 过 程 比 喻 成 了 出 版 过 程, 因 此, 复 制 过 程 中 的 组 件 也 就 可 以 相 应 地 比 喻 成 为 发 布 服 务 器 分 发 服 务 器 订 阅 服 务 器 发 布 项 目 和 订 阅 等 1. 发 布 服 务 器 发 布 服 务 器 就 像 是 一 家 出 版 社, 它 提 供 可 以 用 于 复 制 到 其 他 服 务 器 的 数 据 库, 并 检 测 这 些 数 据 的 更 新 情 况 发 布 服 务 器 包 含 了 将 要 复 制 的 数 据 所 在 的 数 据 库, 它 负 责 制 作 将 要 出 版 的 数 据, 然 后 将 这 些 数 据 的 所 有 变 化 发 送 到 分 发 服 务 器 中 出 版 是 一 个 数 据 库 中 的 一 个 或 多 个 项 目 的 集 合 这 种 多 个 项 目 的 分 组 使 得 指 定 逻 辑 相 关 的 一 组 数 据 和 数 据 库 对 象 一 起 复 制 变 得 更 容 易 项 目 是 指 定 要 复 制 的 数 据 表 数 据 分 区 或 数 据 库 对 象 项 目 可 以 是 完 整 的 表 某 几 列 ( 使 用 垂 直 筛 选 ) 某 几 行 ( 使 用 水 平 筛 选 ) 存 储 过 程 或 视 图 定 义 存 储 过 程 的 执 行 视 图 索 引 视 图 或 用 户 定 义 函 数
第 7 章 数 据 复 制 169 2. 分 发 服 务 器 分 发 服 务 器 类 似 于 出 版 社 与 读 者 之 间 的 中 介, 例 如 分 发 站 书 店 报 刊 亭 等 分 发 服 务 器 负 责 从 发 布 服 务 器 中 接 收 数 据, 然 后 从 该 服 务 器 上 的 分 布 数 据 库 中 存 储 这 些 变 化, 最 后 按 照 指 定 的 时 间 间 隔 推 向 相 应 的 订 阅 服 务 器 中 分 发 服 务 器 分 为 远 程 分 发 服 务 器 和 本 地 分 发 服 务 器 3. 订 阅 服 务 器 订 阅 是 对 数 据 或 数 据 库 对 象 的 复 本 的 请 求 订 阅 定 义 将 接 收 的 发 布 和 接 收 的 时 间 地 点 订 阅 服 务 器 可 以 认 为 是 出 版 物 的 读 者, 它 是 接 收 数 据 的 服 务 器 订 阅 服 务 器 是 数 据 复 制 的 目 的 地, 负 责 接 收 复 制 的 数 据, 并 且 负 责 接 收 从 发 布 服 务 器 上 传 送 过 来 的 全 部 变 化 7.1.2 复 制 模 型 数 据 复 制 的 实 现 过 程 是 一 种 推 出 订 阅 模 型 使 用 推 出 模 型, 发 布 服 务 器 将 数 据 复 制 到 订 阅 服 务 器, 而 不 必 等 待 订 阅 服 务 器 发 出 请 求 数 据 推 出 订 阅 模 型 可 以 集 中 管 理 订 阅, 这 样 对 于 多 个 订 阅 服 务 器, 可 以 在 发 布 服 务 器 中 迅 速 地 建 立 某 个 发 布 的 全 部 订 阅 使 用 订 阅 模 型 订 阅 服 务 器 必 须 发 出 订 阅 数 据 请 求, 然 后 发 布 服 务 器 才 会 把 数 据 复 制 到 订 阅 服 务 器 SQ L Server 中 订 阅 服 务 器 必 须 注 册 为 订 阅 服 务 器 才 能 允 许 订 阅 图 7 唱 1 所 示 为 一 个 推 出 订 阅 模 型 的 数 据 复 制 示 意 图, 根 据 此 图 可 以 了 解 整 个 数 据 复 制 的 概 念 模 型 图 7 唱 1 数 据 复 制 推 出 订 阅 模 型 示 意 图 7.2 复 制 的 类 型 在 SQ L Server 中 根 据 事 务 一 致 性 各 个 站 点 的 自 主 性 和 分 区 数 据 避 免 冲 突 的 能 力, 可 以 把 复 制 类 型 分 成 快 照 复 制 事 务 复 制 和 合 并 复 制 三 种 复 制 类 型
170 SQL Server 数 据 库 应 用 技 术 7.2.1 快 照 复 制 快 照 复 制 就 是 把 在 发 布 服 务 器 上 的 出 版 物 中 的 当 前 数 据 进 行 快 照, 然 后 周 期 性 地 替 代 订 阅 服 务 器 上 的 出 版 物 此 过 程 类 似 于 快 速 拍 照 的 过 程, 即 首 先 抓 拍 发 布 服 务 器 上 的 数 据 内 容, 然 后 把 这 些 照 片 贴 在 订 阅 服 务 器 上 快 照 复 制 只 对 数 据 库 某 个 设 定 的 时 间 片 刻 时 的 数 据 进 行 复 制, 而 不 对 一 段 时 间 内 的 数 据 更 改 进 行 连 续 监 视 快 照 复 制 将 数 据 以 特 定 时 刻 的 当 时 状 态 分 发, 不 监 视 对 数 据 的 更 新 对 于 复 制 不 经 常 更 改 的 数 据, 或 不 要 求 保 持 数 据 最 新 值 ( 低 滞 后 时 间 ) 的 情 况, 快 照 复 制 是 一 种 最 好 的 数 据 复 制 方 法 发 生 同 步 时, 生 成 完 整 的 快 照 并 发 送 到 订 阅 服 务 器 当 数 据 更 改 量 大 但 不 经 常 发 生 时, 快 照 复 制 要 强 于 事 务 复 制 例 如, 如 果 某 销 售 组 织 要 维 护 一 个 产 品 价 格 表, 并 且 这 些 价 格 每 年 要 在 固 定 时 间 进 行 一 两 次 更 新, 建 议 在 数 据 更 改 后 复 制 完 整 的 数 据 快 照 如 果 发 布 的 是 只 在 发 布 服 务 器 上 更 新 相 对 较 小 的 表, 在 夜 间 创 建 快 照 也 是 一 种 选 择 当 需 要 浏 览 只 读 数 据, 而 不 在 意 该 数 据 是 不 是 最 新 的 情 况 下 ( 例 如 浏 览 价 格 表 在 线 产 品 目 录 或 决 策 支 持 数 据 ), 经 常 使 用 快 照 复 制 此 时 如 果 这 些 订 阅 服 务 器 不 是 正 在 更 新 数 据, 就 允 许 断 开 连 接 满 足 下 述 条 件 时 适 合 采 用 快 照 复 制 : 瞯 数 据 主 要 是 静 态 数 据, 不 经 常 更 改 当 数 据 确 实 发 生 更 改 时, 将 一 个 完 全 新 的 副 本 发 布 到 订 阅 服 务 器 更 有 意 义 瞯 一 个 时 期 内 允 许 有 已 过 时 的 数 据 复 本 瞯 复 制 少 量 数 据 ( 在 整 个 数 据 刷 新 为 合 理 的 情 况 下 ) 由 于 快 照 复 制 是 分 发 某 一 时 间 片 刻 的 数 据 副 本, 因 此 当 只 需 分 发 只 读 数 据 时, 特 别 适 合 使 用 快 照 复 制 另 外 快 照 复 制 是 一 次 复 制 整 个 数 据 集, 如 果 数 据 量 很 大, 那 么 将 数 据 修 改 传 播 到 订 阅 服 务 器 的 时 间 将 会 较 长, 这 时 可 以 考 虑 使 用 事 务 复 制 7.2.2 事 务 复 制 事 务 复 制 是 把 发 布 服 务 器 上 的 事 务 作 为 增 量 的 变 化 发 布 到 订 阅 服 务 器 中 实 际 上, 事 务 复 制 就 是 只 把 改 变 的 内 容 复 制 发 布 出 去, 而 快 照 复 制 则 不 论 数 据 是 否 变 化, 都 要 把 标 记 为 复 制 的 数 据 全 部 复 制 过 去 这 种 复 制 类 型 是 一 种 常 用 的 复 制 类 型, 因 为 它 可 以 最 大 限 度 地 降 低 事 务 一 致 性 的 延 迟 但 是 事 务 复 制 不 是 一 种 可 以 独 立 使 用 的 复 制 类 型, 而 是 建 立 在 快 照 复 制 基 础 上 的 一 种 复 制 也 就 是 说, 采 用 事 务 复 制 类 型 时, 必 须 进 行 一 次 快 照 复 制, 以 便 同 步 发 布 服 务 器 和 订 阅 服 务 器 通 过 事 务 复 制, 在 订 阅 服 务 器 上 应 用 数 据 的 初 始 快 照, 然 后, 当 发 布 服 务 器 上 发 生 数 据 修 改 时, 捕 获 个 别 的 事 务 并 传 播 到 订 阅 服 务 器 满 足 下 述 情 形 时 适 合 采 用 事 务 复 制 : 瞯 希 望 发 生 增 量 更 改 时 将 其 传 播 到 订 阅 服 务 器 上 瞯 需 要 遵 守 ACID 属 性 的 事 务 瞯 订 阅 服 务 器 可 靠 和 / 或 频 繁 地 连 接 到 发 布 服 务 器 上 事 务 复 制 用 事 务 日 志 捕 获 已 发 布 表 中 发 生 的 增 量 更 改 SQ L Server 2000 系 统 监 视 INSER T U PDA T E 和 DELE T E 语 句 或 其 他 数 据 修 改, 并 将 这 些 更 改 存 储 到 分 发 数 据 库
第 7 章 数 据 复 制 171 中, 这 里 分 发 数 据 库 相 当 于 一 个 可 靠 的 队 列 然 后 将 更 改 传 播 到 订 阅 服 务 器 上, 并 按 其 发 生 次 序 加 以 应 用 7.2.3 合 并 复 制 合 并 复 制 是 从 发 布 服 务 器 向 订 阅 服 务 器 分 发 数 据 的 过 程, 该 复 制 类 型 使 发 布 服 务 器 和 订 阅 服 务 器 得 以 在 连 接 或 未 连 接 时 更 新 数 据, 然 后 在 连 接 时 合 并 所 有 站 点 的 更 新 合 并 复 制 使 许 多 不 同 的 站 点 得 以 自 主 工 作, 然 后 在 晚 一 些 时 候 再 将 更 新 合 并 成 一 个 统 一 的 结 果 首 先 在 订 阅 服 务 器 上 应 用 初 始 快 照, 然 后 SQ L Server 2000 在 发 布 服 务 器 上 和 订 阅 服 务 器 上 跟 踪 已 发 布 数 据 的 更 改 数 据 或 是 连 续 的 或 是 按 调 度 时 间 或 是 按 需 在 服 务 器 之 间 同 步 由 于 更 新 是 在 多 个 服 务 器 上 进 行 的, 所 以 同 一 数 据 可 能 由 发 布 服 务 器 或 者 由 多 个 订 阅 服 务 器 进 行 了 更 新, 于 是, 合 并 更 新 时 就 可 能 出 现 冲 突 合 并 复 制 包 含 默 认 或 自 定 义 冲 突 解 决 选 项, 可 在 配 置 合 并 复 制 时 加 以 定 义 当 冲 突 发 生 时, 合 并 代 理 程 序 唤 醒 调 用 一 个 冲 突 解 决 程 序, 并 决 定 接 受 和 向 其 他 站 点 传 播 哪 些 数 据 满 足 下 述 条 件 时 适 合 使 用 合 并 复 制 : 瞯 多 个 订 阅 服 务 器 需 要 在 不 同 时 刻 更 新 数 据, 并 将 这 些 更 改 传 播 到 发 布 服 务 器 和 其 他 订 阅 服 务 器 瞯 订 阅 服 务 器 需 要 接 收 数 据, 脱 机 更 改 数 据, 然 后 将 更 改 同 步 到 发 布 服 务 器 和 其 他 订 阅 服 务 器 瞯 当 数 据 在 多 个 站 点 更 新 时, 用 户 不 希 望 看 到 许 多 冲 突 ( 因 为 数 据 先 筛 选 成 分 区, 然 后 出 版 到 不 同 的 订 阅 服 务 器 ; 或 者 因 为 使 用 了 应 用 程 序 ) 但 是, 如 果 确 实 发 生 了 冲 突, 则 违 反 ACID 属 性 是 可 以 接 受 的 合 并 复 制 是 由 快 照 代 理 程 序 与 合 并 复 制 代 理 程 序 实 现 的, 可 以 分 为 四 个 步 骤 : (1) 由 快 照 代 理 程 序 初 始 化 发 布 服 务 器 和 订 阅 服 务 器 (2) 合 并 代 理 程 序 使 用 那 些 由 快 照 代 理 为 了 建 立 订 阅 数 据 库 而 复 制 的 文 件 (3) 合 并 代 理 程 序 从 发 布 服 务 器 中 取 出 变 化, 然 后 把 这 些 变 化 应 用 到 订 阅 服 务 器 中 (4) 合 并 代 理 程 序 从 所 有 的 订 阅 服 务 器 中 取 出 变 化, 然 后 把 这 些 变 化 应 用 到 发 布 服 务 器 中 7.3 配 置 复 制 配 置 复 制 是 标 识 企 业 内 的 发 布 服 务 器 分 发 服 务 器 和 订 阅 服 务 器 的 过 程, 使 用 SQ L Server 2000 工 具 配 置 发 布 服 务 器 分 发 服 务 器 和 订 阅 服 务 器 以 用 于 复 制, 并 且 将 来 在 必 要 时 修 改 或 禁 用 复 制 分 发 服 务 器 是 拥 有 分 发 数 据 库 的 服 务 器, 它 保 存 变 化 的 事 务 日 志 且 将 这 些 事 务 日 志 传 送 到 订 阅 服 务 器 上 发 布 服 务 器 可 以 指 定 要 发 布 的 数 据 所 在 的 数 据 库 指 定 远 程 分 发 服 务 器 允 许 订 阅 出 版 物 的 订 阅 服 务 器 建 立 订 阅 服 务 器 就 是 在 订 阅 服 务 器 上 选 择 发 布 服 务 器 和 接 收 服 务 器 配 置 复 制 的 步 骤 如 下 : 瞯 标 识 分 发 服 务 器
172 SQL Server 数 据 库 应 用 技 术 瞯 在 此 分 发 服 务 器 上 创 建 分 发 数 据 库 瞯 启 用 将 使 用 此 分 发 服 务 器 的 发 布 服 务 器 瞯 启 用 出 版 数 据 库 瞯 启 用 将 接 收 发 布 数 据 的 订 阅 服 务 器 为 便 于 执 行, 可 使 用 配 置 分 发 和 发 布 向 导 采 用 T ransact 唱 SQ L 系 统 存 储 过 程 的 分 发 和 发 布 脚 本 配 置 或 者 SQ L 唱 DM O 配 置 了 复 制 以 后, 可 以 使 用 发 布 服 务 器 和 分 发 服 务 器 的 属 性 对 话 框 T ransact 唱 SQ L 系 统 存 储 过 程 或 SQ L 唱 DM O 修 改 设 置 下 面 使 用 企 业 管 理 器 中 的 配 置 发 布 和 分 发 向 导 来 建 立 分 发 服 务 器 和 发 布 服 务 器 1. 建 立 分 发 服 务 器 (1) 在 企 业 管 理 器 中 选 择 要 安 装 分 发 数 据 库 的 服 务 器 (2) 单 击 企 业 管 理 器 工 具 栏 上 的 工 具 按 钮, 然 后 选 择 向 导 ; 在 弹 出 的 向 导 对 话 框 图 7 唱 2 配 置 发 布 和 分 发 向 导 中 展 开 复 制 树 形 菜 单, 单 击 其 中 的 配 置 发 布 和 分 发 向 导 选 项, 如 图 7 唱 2 所 示 (3) 在 如 图 7 唱 3 所 示 的 配 置 发 布 和 分 发 向 导 对 话 框 中, 单 击 下 一 步 按 钮 图 7 唱 3 欢 迎 使 用 配 置 发 布 和 分 发 向 导 (4) 弹 出 选 择 分 发 服 务 器 对 话 框, 如 图 7 唱 4 所 示 在 该 对 话 框 中, 可 以 选 择 在 发 布 服 务 器 和 订 阅 服 务 器 之 间 同 步 化 数 据 和 分 发 数 据 库 所 在 的 分 发 服 务 器 并 且 在 这 里 选 择 本 地 服 务 器 作 为 分 发 服 务 器
第 7 章 数 据 复 制 173 图 7 唱 4 选 择 分 发 服 务 器 (5) 单 击 下 一 步 按 钮, 出 现 配 置 SQ L Server 代 理 对 话 框, 在 这 里 可 以 指 定 当 系 统 启 动 时 自 动 启 动 SQ L Server Agent 服 务 或 手 工 启 动 该 服 务 在 数 据 复 制 过 程 中, 需 要 启 动 SQ L Server Agent 服 务, 该 服 务 用 于 支 持 各 种 复 制 代 理 的 运 行 这 里 选 择 自 动 启 动 SQ L Server 代 理 服 务, 如 图 7 唱 5 所 示 图 7 唱 5 配 置 SQL Server 代 理 (6) 然 后 单 击 图 7 唱 5 中 的 下 一 步 按 钮, 出 现 如 图 7 唱 6 所 示 的 指 定 快 照 文 件 夹 对 话 框 此 文 件 夹 的 作 用 是 存 储 系 统 在 复 制 过 程 中 产 生 的 文 件 在 该 对 话 框 中 可 以 输 入 一 个 网 络 共 享 路 径, 用 于 存 储 复 制 过 程 中 生 成 的 文 件 2. 创 建 分 发 数 据 库 指 定 了 分 发 服 务 器 之 后, 就 可 以 创 建 发 布 数 据 库 单 击 图 7 唱 6 中 的 下 一 步 按 钮, 出
174 SQL Server 数 据 库 应 用 技 术 图 7 唱 6 指 定 快 照 文 件 夹 图 7 唱 7 自 定 义 配 置 现 自 定 义 配 置 对 话 框, 如 图 7 唱 7 所 示 在 这 里 可 以 指 定 使 用 该 分 发 服 务 器 和 分 布 服 务 器 和 订 阅 服 务 器, 还 可 以 确 定 存 储 分 发 数 据 库 的 名 称 和 位 置 这 里 选 择 自 定 义 设 置 3. 为 发 布 服 务 器 指 定 分 发 数 据 库 单 击 图 7 唱 7 中 的 下 一 步 按 钮, 就 创 建 了 分 发 数 据 库, 然 后 就 可 以 给 发 布 服 务 器 指 定 分 发 数 据 库 了, 如 图 7 唱 8 所 示 (1) 单 击 下 一 步 按 钮, 出 现 如 图 7 唱 9 所 示 的 发 布 数 据 库 对 话 框, 这 里 选 择 student 数 据 库 作 为 发 布 数 据 库 (2) 单 击 下 一 步, 出 现 如 图 7 唱 10 所 示 的 激 活 订 阅 服 务 器 对 话 框, 在 这 里 启 用 该 订 阅 服 务 器
第 7 章 数 据 复 制 175 图 7 唱 8 启 用 发 布 服 务 器 图 7 唱 9 启 用 发 布 数 据 库 图 7 唱 10 启 用 订 阅 服 务 器
176 SQL Server 数 据 库 应 用 技 术 (3) 单 击 下 一 步, 则 出 现 向 导 的 确 认 对 话 框, 如 图 7 唱 11 所 示 最 后 单 击 完 成 按 钮, 完 成 配 置 发 布 和 分 发 数 据 库 的 操 作 这 时, 系 统 在 企 业 管 理 器 里 面 产 生 复 制 监 视 器 工 具, 如 图 7 唱 12 所 示 复 制 监 视 器 可 以 检 测 系 统 的 复 制 性 能 图 7 唱 11 向 导 的 确 认 7.4 建 立 和 使 用 复 制 7.4.1 创 建 发 布 图 7 唱 12 企 业 管 理 器 中 的 复 制 监 视 器 配 置 好 发 布 服 务 器 之 后, 就 可 以 在 发 布 服 务 器 上 指 定 要 发 布 的 数 据 所 在 的 数 据 库, 然 后 创 建 发 布 可 以 使 用 企 业 管 理 器 中 的 创 建 发 布 向 导 来 完 成 发 布 的 创 建 工 作 其 步 骤
第 7 章 数 据 复 制 177 如 下 1. 指 定 要 发 布 的 数 据 所 在 的 数 据 库 首 先, 在 企 业 管 理 器 中 选 择 数 据 库 服 务 器, 然 后 单 击 工 具 栏 上 的 工 具 按 钮, 单 击 其 中 的 向 导 子 菜 单, 然 后 展 开 选 择 向 导 对 话 框 中 的 复 制 容 器, 双 击 创 建 发 布 向 导 以 启 动 向 导, 出 现 如 图 7 唱 13 所 示 的 欢 迎 使 用 创 建 发 布 向 导 对 话 框 图 7 唱 13 欢 迎 使 用 创 建 发 布 向 导 单 击 下 一 步, 在 选 择 发 布 数 据 库 对 话 框 中, 选 择 包 含 发 布 数 据 库 和 对 象 的 数 据 库 student, 如 图 7 唱 14 所 示 图 7 唱 14 选 择 发 布 数 据 库 如 果 是 sysadmin 服 务 器 角 色 成 员 运 行 创 建 发 布 向 导, 向 导 将 显 示 所 有 用 户 数 据
178 SQL Server 数 据 库 应 用 技 术 库, 并 且 为 复 制 自 动 启 用 所 选 数 据 库 如 果 是 数 据 库 中 的 db_ow ner 固 定 数 据 库 角 色 成 员 运 行 创 建 发 布 向 导, 仅 有 先 前 为 复 制 启 用 的 数 据 库 才 会 出 现, 并 且 这 些 数 据 库 都 属 于 这 个 db_ow ner 单 击 图 7 唱 14 中 的 下 一 步 按 钮, 在 选 择 发 布 类 型 对 话 框 中, 选 择 发 布 类 型, 如 图 7 唱 15 所 示 可 以 选 择 快 照 发 布 事 务 发 布 或 合 并 发 布 图 7 唱 15 选 择 发 布 类 型 2. 创 建 快 照 发 布 在 图 7 唱 15 中 选 择 快 照 发 布, 单 击 下 一 步 按 钮, 系 统 弹 出 指 定 订 阅 服 务 器 的 类 型 对 话 框, 如 图 7 唱 16 所 示 图 7 唱 16 指 定 订 阅 服 务 器 的 类 型
第 7 章 数 据 复 制 179 选 择 运 行 SQ L Server 2000 的 服 务 器 在 这 里 如 果 选 择 运 行 SQ L Server 7.0 版 的 服 务 器 或 异 类 数 据 源, 那 么 这 些 类 型 的 订 阅 服 务 器 由 于 不 兼 容 将 不 会 在 向 导 中 显 示 单 击 图 7 唱 16 中 的 下 一 步 按 钮, 如 图 7 唱 17 所 示, 在 这 里 指 定 作 为 项 目 发 布 的 数 据 库 对 象 可 以 选 择 表 存 储 过 程 和 视 图 等 数 据 库 对 象 来 作 为 发 布 项 目 这 里 选 择 数 据 库 student 中 的 全 部 表 作 为 发 布 对 象 然 后 单 击 下 一 步 按 钮 图 7 唱 17 指 定 项 目 在 如 图 7 唱 18 所 示 的 自 定 义 发 布 的 属 性 对 话 框 中, 可 以 选 择 定 义 数 据 筛 选 启 用 匿 名 订 阅 和 为 快 照 代 理 程 序 配 置 自 定 义 调 度 来 自 定 义 发 布 图 7 唱 18 自 定 义 发 布 的 属 性
180 SQL Server 数 据 库 应 用 技 术 如 果 选 择 自 定 义 发 布, 则 出 现 如 图 7 唱 19 所 示 的 对 话 框, 可 以 选 择 水 平 或 垂 直 地 筛 选 发 布 中 的 项 目 筛 选 发 布 中 的 项 目 就 是 从 发 布 表 中 排 除 指 定 的 列 或 者 行 图 7 唱 19 筛 选 数 据 同 时 选 择 水 平 和 垂 直 筛 选 发 布, 系 统 弹 出 如 图 7 唱 20 所 示 的 对 话 框, 这 里 可 以 选 择 清 除 一 个 发 布 项 目 中 指 定 不 发 布 的 行 和 列 默 认 情 况 下 发 布 所 有 列 图 7 唱 20 筛 选 表 的 列 单 击 下 一 步 按 钮, 在 如 图 7 唱 21 所 示 的 对 话 框 里, 可 以 选 择 允 许 匿 名 订 阅, 匿 名 订 阅 主 要 为 了 Internet 发 布 或 发 布 到 大 量 订 阅 服 务 器 这 里 选 择 否, 只 允 许 署 名 订 阅
第 7 章 数 据 复 制 181 图 7 唱 21 允 许 匿 名 订 阅 单 击 下 一 步 按 钮, 在 如 图 7 唱 22 所 示 的 设 置 快 照 代 理 程 序 调 度 对 话 框 中, 可 以 接 受 默 认 调 度 或 单 击 更 改 按 钮 修 改 调 度 图 7 唱 22 设 置 快 照 代 理 程 序 调 度 最 后, 在 完 成 创 建 发 布 向 导 对 话 框 中, 可 以 查 看 所 有 的 发 布 选 项, 然 后 单 击 完 成 按 钮, 如 图 7 唱 23 所 示 上 面 是 创 建 快 照 发 布, 限 于 篇 幅, 事 务 发 布 和 配 置 合 并 发 布 请 读 者 自 行 练 习 7.4.2 订 阅 在 SQ L Server 2000 中, 可 以 通 过 强 制 订 阅 和 请 求 订 阅 来 订 阅 被 发 布 的 项 目
182 SQL Server 数 据 库 应 用 技 术 图 7 唱 23 向 导 的 确 认 1. 强 制 订 阅 强 制 订 阅 是 发 布 服 务 器 在 创 建 或 编 辑 发 布 的 同 时 建 立 的 订 阅 强 制 订 阅 可 以 在 发 布 服 务 器 里 定 义 强 制 订 阅, 并 且 一 次 可 以 为 一 个 发 布 建 立 多 个 订 阅 服 务 器 强 制 订 阅 通 常 用 在 发 生 数 据 更 改 时 必 须 立 即 发 送 更 改 到 订 阅 服 务 器 的 这 种 类 型 的 应 用 中 强 制 订 阅 主 要 运 用 在 需 要 较 高 的 安 全 性 或 者 是 在 分 发 服 务 器 上 产 生 更 高 的 处 理 器 开 销 时 且 不 会 影 响 系 统 的 整 体 性 能 的 场 合 2. 请 求 订 阅 请 求 订 阅 是 从 订 阅 服 务 器 建 立 的 订 阅 当 有 订 阅 请 求 时, 订 阅 服 务 器 对 订 阅 请 求 进 行 初 始 化 后, 发 布 对 订 阅 请 求 的 允 许 并 且 对 订 阅 进 行 注 册, 如 果 允 许 匿 名 订 阅, 则 无 需 进 行 注 册 订 阅 服 务 器 的 系 统 管 理 员 或 者 数 据 库 拥 有 者 决 定 接 受 哪 个 发 布 以 及 何 时 进 行 接 收 请 求 订 阅 最 适 用 于 需 要 低 安 全 性 的 发 布, 且 能 支 持 多 个 订 阅 服 务 器 ( 例 如 使 用 Internet 的 订 阅 服 务 器 ) 的 发 布 7.4.3 创 建 强 制 订 阅 创 建 了 发 布 以 后, 就 可 以 在 发 布 服 务 器 上 通 过 强 制 订 阅 向 导 配 置 强 制 订 阅 强 制 订 阅 是 在 发 布 服 务 器 中 央 配 置, 并 初 始 化 订 阅 可 以 在 企 业 管 理 器 的 工 具 栏 中 单 击 向 导, 展 开 选 择 向 导 对 话 框 的 复 制 容 器, 然 后 双 击 创 建 强 制 订 阅 向 导 启 动 向 导, 出 现 欢 迎 使 用 强 制 订 阅 向 导 对 话 框, 如 图 7 唱 24 所 示 这 里 将 显 示 本 向 导 中 的 高 级 选 项 的 复 选 框 选 上, 以 便 在 显 示 高 级 选 项 时 允 许 设 置 可 更 新 订 阅 选 项 以 及 配 置 可 用 复 制 代 理 程 序, 使 其 在 订 阅 服 务 器 而 不 是 在 分 发 服 务 器 中 运 行 单 击 下 一 步 按 钮, 在 如 图 7 唱 25 所 示 的 选 择 订 阅 服 务 器 对 话 框 中, 选 择 要 强 制 接 收 发 布 的 订 阅 服 务 器 如 果 是 sysadmin 服 务 器 角 色 成 员 运 行 强 制 订 阅 向 导, 可 以 在 空 闲 时 启 用 一 个 注 册
第 7 章 数 据 复 制 183 图 7 唱 24 向 导 的 欢 迎 界 面 图 7 唱 25 选 择 订 阅 服 务 器 实 例 如 果 数 据 库 的 db_ow ner 角 色 成 员 运 行 强 制 订 阅 向 导, 则 不 能 启 用 其 他 订 阅 服 务 器 单 击 下 一 步 按 钮, 如 图 7 唱 26 所 示 的 选 择 目 的 数 据 库 对 话 框 中, 为 发 布 选 择 目 的 数 据 库 在 初 始 化 之 前, 每 个 订 阅 服 务 器 必 须 有 目 的 数 据 库 单 击 浏 览 或 创 建 按 钮 以 确 认 或 新 建 订 阅 数 据 库 单 击 下 一 步 按 钮, 根 据 发 布 类 型, 在 如 图 7 唱 27 所 示 的 设 置 分 发 代 理 程 序 调 度 对 话 框 中 选 择 使 用 下 列 调 度 单 击 下 一 步 按 钮, 如 图 7 唱 28 所 示 的 初 始 化 订 阅 对 话 框 中 可 以 指 定 是 否 初 始 化 订 阅 和 何 时 初 始 化 订 阅 在 这 里 单 击 是, 初 始 化 架 构 和 数 据 选 项 按 钮, 并 且 选 择 启 动 快 照 代 理 程 序 来 立 即 开 始 初 始 化 处 理 复 选 框, 以 便 快 照 代 理 程 序 立 即 创 建 快 照, 然 后 初 始 化 订 阅, 而 不 是 等 下 一 次 快 照 代 理 程 序 的 快 照 调 度 运 行 时 再 初 始 化 如 果 没 有 创 建 快 照 文 件, 此 复 选 框 将 不 会 出 现
184 SQL Server 数 据 库 应 用 技 术 图 7 唱 26 选 择 目 的 数 据 库 图 7 唱 27 设 置 分 发 代 理 程 序 调 度 图 7 唱 28 初 始 化 订 阅
第 7 章 数 据 复 制 185 单 击 下 一 步 按 钮, 在 如 图 7 唱 29 所 示 的 启 动 要 求 的 服 务 对 话 框 中,SQ L Server 代 理 验 证 所 要 求 的 服 务 正 在 分 发 服 务 器 上 运 行, 如 果 要 求 的 服 务 没 有 运 行, 默 认 情 况 下, 当 向 导 完 成 时,SQ L Server 代 理 将 启 动 服 务 如 果 想 手 动 启 动, 则 清 除 复 选 框 图 7 唱 29 启 动 要 求 的 服 务 最 后, 在 完 成 强 制 订 阅 向 导 对 话 框 中 ( 图 7 唱 30), 查 看 订 阅 选 项, 然 后 单 击 完 成 按 钮, 以 创 建 强 制 订 阅 图 7 唱 30 强 制 订 阅 向 导 确 认 7.5 通 过 Internet 执 行 复 制 互 联 网 Internet 技 术 加 快 了 人 们 之 间 的 思 想 交 流 知 识 传 递 商 业 竞 争 在 数 据 库 技 术 领 域 如 何 充 分 利 用 Internet 技 术, 是 当 前 各 种 关 系 型 数 据 库 的 主 要 特 点 SQ L Server
186 SQL Server 数 据 库 应 用 技 术 2000 也 引 入 了 对 Internet 技 术 的 支 持 例 如, 通 过 复 制, 可 以 把 数 据 发 布 到 Internet 网 络 上, 大 大 提 高 了 数 据 库 中 数 据 的 应 用 效 率 SQ L Server 2000 允 许 在 Internet 上 复 制 数 据 库 中 的 数 据 这 种 复 制 既 可 以 通 过 推 出 订 阅, 也 可 以 使 用 拉 回 订 阅 在 Internet 上 复 制 数 据 时, 要 考 虑 下 面 一 些 因 素 : (1) 要 保 证 发 布 服 务 器 和 分 发 服 务 器 在 网 络 防 火 墙 的 同 一 端, 不 能 把 发 布 服 务 器 和 分 发 服 务 器 分 隔 在 网 络 防 火 墙 的 两 端 (2) 要 保 证 发 布 服 务 器 和 分 发 服 务 器 有 直 接 的 连 接, 并 非 只 是 通 过 Internet 的 连 接 (3) 在 每 一 台 计 算 机 上, 应 该 有 使 用 T CP/IP 协 议, 确 保 复 制 正 常 进 行 7.6 复 制 监 视 器 如 果 已 经 启 用 了 一 个 分 发 服 务 器 的 SQ L Server 实 例, 企 业 管 理 器 中 将 出 现 一 个 复 制 监 视 器, 它 显 示 了 使 用 该 分 发 服 务 器 的 发 布 服 务 器 的 列 表 所 有 发 布 的 状 态 和 所 有 复 制 代 理 程 序 的 状 态 复 制 监 视 器 可 以 用 来 建 立 和 监 视 复 制 警 报, 也 可 以 用 来 停 止 和 启 动 复 制 代 理 程 序 和 重 新 初 始 化 订 阅 打 开 一 个 分 发 服 务 器 的 复 制 监 视 器 之 前, 连 接 该 分 发 服 务 器 ( 即 作 为 分 发 服 务 器 的 SQ L Server 实 例 ), 然 后 展 开 并 单 击 企 业 管 理 器 中 的 复 制 监 视 器 如 果 是 第 一 次 展 开 复 制 监 视 器, 将 出 现 如 图 7 唱 31 所 示 的 SQ L Server 企 业 管 理 器 对 话 框, 通 知 用 户 选 择 复 制 监 视 器 的 刷 新 方 式 实 际 使 用 时, 应 该 选 择 手 动 刷 新 以 节 约 分 发 服 务 器 资 源 图 7 唱 31 选 择 手 工 刷 新 复 制 监 视 器 复 制 监 视 器 可 以 监 视 发 布 服 务 器 发 布 代 理 程 序 和 复 制 警 告 打 开 复 制 监 视 器 树 形 目 录 下 的 发 布 服 务 器, 可 以 查 看 发 布 服 务 器 的 属 性, 如 快 照 项 目 订 阅 以 及 快 照 代 理 程 序 的 状 态 等, 如 图 7 唱 32 所 示 展 开 复 制 监 视 器 中 的 代 理 程 序, 并 选 择 一 种 复 制 代 理 程 序, 可 以 根 据 代 理 程 序 类 型 而 不 是 根 据 出 版 来 查 看 复 制 信 息 例 如, 单 击 快 照 代 理 程 序 容 器, 以 查 看 所 有 快 照 代 理 程 序 的 状 态, 如 图 7 唱 33 所 示 可 以 选 择 复 制 警 报 中 的 警 报 SQ L Server 2000 自 带 8 种 预 配 置 的 复 制 警 报 要 使 用 这 些 警 报, 必 须 先 启 用 警 报, 并 且 配 置 要 通 知 操 作 员 右 击 复 制 警 报 中 的 警 报, 单
第 7 章 数 据 复 制 187 图 7 唱 32 查 看 发 布 服 务 器 的 属 性 图 7 唱 33 快 照 代 理 程 序 的 状 态 击 属 性, 然 后 在 复 制 警 报 属 性 对 话 框 里 启 用 警 报 并 选 择 要 通 知 的 操 作 员, 完 成 配 置, 如 图 7 唱 34 所 示
188 SQL Server 数 据 库 应 用 技 术 图 7 唱 34 复 制 警 报 实 训 1. 实 训 目 的 (1) 了 解 数 据 库 复 制 的 概 念 (2) 学 会 使 用 企 业 管 理 器 配 置 复 制 (3) 学 会 使 用 企 业 管 理 器 实 现 复 制 操 作 (4) 掌 握 发 布 分 发 和 订 阅 服 务 器 的 概 念 作 用 以 及 和 物 理 服 务 器 的 对 应 关 系 2. 实 训 的 知 识 准 备 复 制 是 把 一 个 系 统 中 的 数 据 通 过 网 络 发 布 到 另 外 一 个 或 者 多 个 地 理 位 置 不 同 的 系 统 中 的 过 程 要 求 充 分 理 解 数 据 复 制 的 基 本 概 念 和 特 点, 能 够 使 用 企 业 管 理 器 配 置 发 布 管 理 器 分 发 服 务 器, 以 及 建 立 订 阅 和 使 用 复 制 监 视 器 3. 实 训 内 容 和 步 骤 (1) 使 用 企 业 管 理 器 实 现 复 制 操 作 需 要 网 络 环 境 支 持 (2) 配 置 发 布 管 理 器 和 分 发 服 务 器 1 在 企 业 管 理 器 中, 展 开 服 务 器, 右 击 复 制 项, 选 择 配 置 发 布 和 分 发 向 导 项, 单 击 下 一 步
第 7 章 数 据 复 制 189 2 在 分 发 服 务 器 配 置 窗 口 中, 第 一 个 单 选 框 表 示 发 布 服 务 器 和 分 发 服 务 器 为 同 一 台 主 机 ; 第 二 个 单 选 框 表 示 使 用 另 外 一 台 已 经 在 本 地 SQ L Server 注 册 的 主 机 作 为 分 发 服 务 器 单 击 下 一 步 3 在 窗 口 中, 选 择 第 一 个 单 选 框 表 示 启 动 时 自 动 配 置 SQ L Server Agent ; 选 择 第 二 个 单 选 框 表 示 手 动 启 动 SQ L Server Agent 单 击 下 一 步 4 在 窗 口 中, 设 置 快 照 存 储 路 径 单 击 下 一 步 5 在 窗 口 中, 选 择 第 二 个 单 选 框, 表 示 使 用 下 面 列 表 框 中 的 各 项 默 认 配 置, 直 接 进 入 完 成 配 置 窗 口 如 果 不 使 用 这 些 配 置, 则 选 择 第 一 个 单 选 框, 进 行 一 系 列 的 设 置 (3) 创 建 发 布 在 企 业 管 理 器 中 使 用 创 建 发 布 向 导, 实 现 创 建 发 布 并 向 发 布 中 添 加 条 目 其 步 骤 为 : 1 在 企 业 管 理 器 中, 选 择 工 具 复 制 创 建 发 布 向 导 项, 进 入 对 话 框 中 2 选 择 要 发 布 的 数 据 库 然 后 单 击 创 建 发 布 按 钮, 进 入 选 择 分 发 服 务 器 对 话 框, 需 要 指 定 快 照 文 件 夹 3 单 击 下 一 步, 进 入 选 择 发 布 数 据 库 的 对 话 框, 其 中 选 择 要 发 布 的 数 据 或 对 象 的 来 源 数 据 库 然 后 单 击 下 一 步 进 入 选 择 发 布 类 型 对 话 框 4 在 对 话 框 中, 可 以 发 布 类 型, 三 个 单 选 框 分 别 表 示 : 快 照 发 布 事 务 发 布 和 合 并 发 布, 选 择 需 要 创 建 的 发 布 类 型, 然 后 单 击 下 一 步 按 钮 5 在 选 择 订 阅 服 务 器 的 类 型 的 对 话 框 中, 可 以 选 择 用 于 订 阅 发 布 的 订 阅 服 务 器 使 用 的 数 据 库 系 统 类 型, 三 个 复 选 择 框 分 别 表 示 : 运 行 SQ L Server 7.0 的 服 务 器 ; 使 用 其 他 非 SQ L Server 数 据 库 系 统 的 订 阅 服 务 器 ( 例 如 Oracle Access 等 ) ; 运 行 SQ L Server 早 期 版 本 的 服 务 器 单 击 下 一 步 按 钮, 进 入 指 定 发 布 条 目 窗 口 6 在 指 定 项 目 的 对 话 框 中, 选 中 左 侧 的 显 示 未 发 布 的 对 象 复 选 框, 可 以 在 右 侧 的 列 表 中 显 示 所 有 没 有 加 入 发 布 的 对 象 在 列 表 中 选 中 要 添 加 为 发 布 条 目 的 对 象, 单 击 下 一 步 7 在 选 择 发 布 名 称 和 描 述 对 话 框 中, 可 以 在 发 布 名 称 和 发 布 描 述 栏 中 指 定 发 布 的 名 称 并 输 入 文 本 描 述 然 后 单 击 下 一 步, 进 入 发 布 属 性 设 置 对 话 框 8 在 自 定 义 发 布 的 属 性 对 话 框 中, 如 果 选 择 第 二 个 单 选 框, 表 示 接 受 所 有 的 默 认 发 布 属 性 设 置, 单 击 下 一 步, 直 接 进 入 完 成 所 有 设 置 对 话 框 ; 如 果 要 进 行 修 改, 可 以 选 择 第 一 个 单 选 框, 继 续 设 置 发 布 属 性 (4) 建 立 订 阅 在 SQ L Server 企 业 管 理 器 中 可 以 使 用 建 立 请 求 订 阅 向 导 建 立 新 订 阅 其 步 骤 为 : 1 在 企 业 管 理 器 中 选 择 工 具 复 制 请 求 订 阅 向 导 项, 进 入 建 立 订 阅 的 对 话 框 2 在 建 立 订 阅 对 话 框 中, 选 择 需 要 建 立 的 新 订 阅 的 数 据 库, 单 击 请 求 新 订 阅 进 入 欢 迎 窗 口, 单 击 下 一 步, 进 入 查 找 发 布 的 对 话 框 3 在 查 找 发 布 对 话 框 中, 可 以 选 择 在 哪 里 查 找 想 要 订 阅 的 发 布 如 果 选 择 第 一 个 单 选 框, 表 示 在 注 册 的 服 务 器 中 查 找 发 布 ; 如 果 选 择 第 二 个 单 选 框, 表 示 在 Active
190 SQL Server 数 据 库 应 用 技 术 Directory 中 查 找 发 布 单 击 下 一 步, 进 入 选 择 发 布 的 对 话 框 4 在 选 择 发 布 的 对 话 框 中 选 择 要 订 阅 的 发 布, 如 果 服 务 器 没 有 注 册, 可 以 选 择 单 击 右 侧 的 注 册 服 务 器 选 中 要 订 阅 的 发 布, 单 击 下 一 步, 进 入 指 定 同 步 代 理 账 户 的 对 话 框 5 在 指 定 同 步 代 理 账 户 的 对 话 框 中, 可 以 选 择 同 步 代 理 账 户 的 认 证 方 式, 如 果 选 择 第 一 个 单 选 框 表 示 使 用 SQ L Server 代 理 账 户 ; 如 果 选 择 第 二 个 单 选 框 表 示 使 用 SQ L Server 认 证, 此 时 需 要 在 下 面 的 登 录 和 密 码 栏 中 输 入 用 户 名 和 命 名 单 击 下 一 步, 进 入 选 择 目 标 数 据 库 的 对 话 框 6 在 选 择 目 标 数 据 库 的 对 话 框 中, 选 择 目 标 数 据 库, 单 击 右 侧 的 新 建 按 钮, 可 以 添 加 新 的 目 标 数 据 库 选 中 目 标 数 据 库, 单 击 下 一 步, 进 入 初 始 化 订 阅 的 对 话 框 7 在 初 始 化 订 阅 设 置 的 对 话 框 中, 如 果 选 择 第 一 个 单 选 框, 表 示 要 初 始 化 订 阅, 使 用 快 照 复 制 在 订 阅 服 务 器 上 同 步 发 布 ; 如 果 选 择 第 二 个 单 选 框, 表 示 不 初 始 化 订 阅 单 击 下 一 步, 进 入 设 置 调 用 快 照 路 径 的 对 话 框 8 在 设 置 调 用 快 照 路 径 的 对 话 框 中, 如 果 选 择 第 一 个 单 选 框, 表 示 从 发 布 默 认 的 快 照 路 径 中 调 用 快 照 文 件 ; 如 果 选 择 第 二 个 单 选 框, 表 示 从 指 定 的 目 录 中 调 用 快 照 文 件 单 击 下 一 步, 进 入 设 置 分 布 代 理 程 序 调 度 的 对 话 框 9 在 设 置 分 布 代 理 程 序 调 度 的 对 话 框 中, 如 果 选 择 第 一 个 单 选 框, 表 示 连 续 执 行 复 制 ; 如 果 选 择 第 二 个 单 选 框, 表 示 在 指 定 时 间 指 定 复 制 ; 如 果 选 择 第 三 个 单 选 框, 表 示 只 根 据 命 令 执 行 复 制 单 击 下 一 步, 进 入 设 置 需 要 启 动 的 服 务 对 话 框 10 在 设 置 需 要 启 动 的 服 务 对 话 框 中, 列 表 框 中 列 出 本 次 订 阅 所 要 启 动 的 服 务, 并 显 示 其 状 态 单 击 下 一 步, 进 入 完 成 建 立 订 阅 的 对 话 框 (5) 自 行 练 习 : 配 置 事 务 发 布 和 合 并 发 布 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 简 述 SQ L Server 的 复 制 模 型 (2) 如 何 使 用 配 置 发 布 和 分 发 向 导? (3) 什 么 是 订 阅? 可 选 择 的 订 阅 类 型 有 哪 几 种? 匿 名 订 阅 和 署 名 订 阅 的 区 别 是 什 么? (4) 复 制 的 基 本 类 型 有 几 种? 简 要 说 明 一 下 (5) 如 何 通 过 Internet 来 执 行 复 制? (6) 发 布 服 务 器 的 用 途 是 什 么? 分 发 服 务 器 的 用 途 是 什 么? (7) 什 么 是 行 筛 选 ( 水 平 筛 选 ), 什 么 是 列 筛 选 ( 垂 直 筛 选 )? (8) 什 么 时 候 应 该 使 用 强 制 订 阅, 什 么 时 候 使 用 请 求 订 阅? (9) 在 SQ L Server 2000 中, 复 制 监 视 器 的 用 途 是 什 么? 2. 请 在 空 白 处 填 写 最 适 合 的 内 容 (1) 数 据 库 复 制 中 的 服 务 器 组 件 是
第 7 章 数 据 复 制 191 (2) 复 制 类 型 分 成 和 三 种 复 制 类 型 (3) 在 SQ L Server 2000 中, 可 以 通 过 和 来 订 阅 被 发 布 的 项 目 (4) SQ L Server 2000 复 制 使 用 的 执 行 与 复 制 和 分 发 数 据 相 关 的 任 务 (5) 各 种 复 制 的 实 现 是 通 过 和 的 代 理 复 制 (6) 在 进 行 复 制 以 前, 首 先 必 须, 然 后 才 可 以 进 行 定 义 出 版 物 出 版 条 目 等 工 作 (7) 复 制 监 视 器 可 以 监 视 和 (8) 复 制 监 视 器 可 以 用 来 建 立 和 监 视 复 制 警 报, 也 可 以 用 来 和
第 8 章 视 图 及 其 应 用 视 图 (View) 作 为 一 种 数 据 库 对 象, 为 用 户 提 供 了 一 种 检 索 数 据 表 数 据 的 方 式 用 户 通 过 视 图 来 浏 览 数 据 表 中 感 兴 趣 的 部 分 或 全 部 数 据, 而 数 据 的 物 理 存 放 位 置 仍 然 在 表 中 本 章 将 介 绍 视 图 的 概 念, 以 及 创 建 修 改 和 删 除 视 图 的 方 法 8.1 视 图 的 概 述 8.1.1 视 图 的 概 念 视 图 是 一 个 虚 拟 表, 并 不 表 示 任 何 物 理 数 据, 只 是 用 来 查 看 数 据 的 窗 口 而 已 视 图 与 真 正 的 表 很 类 似, 也 是 由 一 组 命 名 的 列 和 数 据 行 所 组 成, 其 内 容 由 查 询 所 定 义 但 是 视 图 并 不 是 以 一 组 数 据 的 形 式 存 储 在 数 据 库 中, 数 据 库 中 只 存 放 视 图 的 定 义, 而 不 存 放 视 图 对 应 的 数 据, 这 些 数 据 仍 存 放 在 导 出 视 图 的 基 本 表 中 当 基 本 表 中 的 数 据 发 生 变 化 时, 从 视 图 中 查 询 出 来 的 数 据 也 随 之 改 变 视 图 中 的 数 据 行 和 列 都 来 自 于 基 本 表 中, 是 在 视 图 被 引 用 时 动 态 生 成 的 使 用 视 图 可 以 集 中 简 化 和 定 制 用 户 的 数 据 库 显 示, 用 户 可 以 通 过 视 图 来 访 问 数 据, 而 不 必 直 接 去 访 问 该 视 图 的 基 本 表 视 图 由 视 图 名 和 视 图 定 义 两 部 分 组 成 视 图 是 从 一 个 或 几 个 表 导 出 的 表, 它 实 际 上 是 一 个 查 询 结 果, 视 图 的 名 字 和 视 图 对 应 的 查 询 存 放 在 数 据 字 典 中 例 如, 学 生 管 理 数 据 库 中 有 学 生 基 本 信 息 表 stud _ info ( stud _ id,name,birthday,gender,address,telcode, zipcode,mark), 此 表 为 基 本 表, 对 应 一 个 存 储 文 件 可 以 在 其 基 础 上 定 义 一 个 男 生 基 本 情 况 表 stud_ info _ male ( stud _ id, name, birthday,mark), 它 是 从 stud _ info 中 选 择 gender = 男 的 各 个 行, 然 后 在 stud_id,name,birthday,mark 上 投 影 得 到 的 在 数 据 库 中 只 存 有 stud_info_male 的 定 义, 而 stud_info_male 的 记 录 不 重 复 存 储 在 用 户 看 来, 视 图 是 通 过 不 同 路 径 去 看 一 个 实 际 表, 就 像 一 个 窗 口 一 样, 我 们 通 过 窗 户 去 看 外 面 的 高 楼, 可 以 看 到 高 楼 的 不 同 部 分, 而 透 过 视 图 可 以 看 到 数 据 库 中 自 己 感 兴 趣 的 内 容 8.1.2 使 用 视 图 的 优 点 和 缺 点 1. 使 用 视 图 的 优 点 (1) 数 据 保 密 对 不 同 的 用 户 定 义 不 同 的 视 图, 使 用 户 只 能 看 到 与 自 己 有 关 的 数 据
第 8 章 视 图 及 其 应 用 193 例 如, 对 教 师 基 本 信 息 表 (teacher_info) 创 建 了 计 算 机 系 的 视 图, 计 算 机 系 的 教 师 就 只 能 使 用 此 视 图, 而 无 法 访 问 其 他 系 教 师 的 数 据 (2) 简 化 查 询 操 作, 为 复 杂 的 查 询 建 立 一 个 视 图, 用 户 不 必 键 入 复 杂 的 查 询 语 句, 只 需 针 对 此 视 图 做 简 单 的 查 询 即 可 (3) 保 证 数 据 的 逻 辑 独 立 性 对 于 视 图 的 操 作, 例 如 查 询, 只 依 赖 于 视 图 的 定 义 当 构 成 视 图 的 基 本 表 要 修 改 时, 只 需 修 改 视 图 定 义 中 的 子 查 询 部 分, 而 基 于 视 图 的 查 询 不 用 改 变 2. 使 用 视 图 的 缺 点 当 更 新 视 图 中 的 数 据 时, 实 际 上 是 对 基 本 表 的 数 据 进 行 更 新 事 实 上, 当 从 视 图 中 插 入 或 者 删 除 时, 情 况 也 是 这 样 然 而, 某 些 视 图 是 不 能 更 新 数 据 的, 这 些 视 图 有 如 下 的 特 征 : 瞯 有 U NION 等 集 合 操 作 符 的 视 图 瞯 有 GRO U P BY 子 句 的 视 图 瞯 有 诸 如 A VG,SU M 或 者 M AX 等 函 数 的 视 图 瞯 使 用 DIS TINC T 短 语 的 视 图 瞯 连 接 表 的 视 图 ( 其 中 有 一 些 例 外 ) 8.2 视 图 的 创 建 SQ L Server 中 提 供 了 三 种 创 建 视 图 的 方 法 : 使 用 企 业 管 理 器 使 用 T ransact 唱 SQ L 语 句 使 用 视 图 创 建 向 导 程 序, 下 面 分 别 加 以 介 绍 8.2.1 使 用 企 业 管 理 器 创 建 视 图 使 用 企 业 管 理 器 创 建 视 图 的 方 法 如 下 : (1) 单 击 开 始 程 序 Microsoft SQ L Server 企 业 管 理 器, 打 开 SQ L Server Enterprise Manager 窗 口 (2) 双 击 该 窗 口 左 窗 格 目 录 树 中 的 服 务 器, 单 击 数 据 库 项 左 侧 的 加 号 ( + ), 展 开 数 据 库 组, 展 开 要 在 其 中 创 建 视 图 的 数 据 库, 如 图 8 唱 1 所 示 (3) 选 中 视 图 图 标, 此 时 在 右 面 的 窗 格 中 显 示 当 前 数 据 库 的 所 有 视 图 右 击 视 图 项, 在 弹 出 菜 单 中 选 择 新 建 视 图 选 项, 打 开 新 建 视 图 窗 口, 如 图 8 唱 2 所 示 (4) 在 新 建 视 图 对 话 框 中 共 有 四 个 区, 从 上 到 下 依 次 为 关 系 图 窗 格 ( 表 区 ) 网 格 窗 格 ( 列 区 ) SQ L 窗 格 (SQ L Script 区 ) 结 果 窗 格 ( 数 据 结 果 区 ) 在 对 话 框 中, 单 击 添 加 表 按 钮 或 者 右 击 最 上 端 的 表 区, 从 弹 出 菜 单 中 选 择 添 加 表 选 项, 打 开 添 加 表 对 话 框, 如 图 8 唱 3 所 示 (5) 从 添 加 表 对 话 框 提 供 的 列 表 中 选 择 要 使 用 的 表 或 视 图, 单 击 添 加 按 钮, 或 者 双 击 选 中 的 表 或 视 图 (6) 选 择 完 毕, 单 击 关 闭 按 钮, 关 闭 添 加 表 对 话 框 (7) 此 时 在 新 建 视 图 窗 口 中, 可 看 到 相 应 的 表 或 视 图, 然 后 从 中 间 表 格 的 列 中 的 下
194 SQL Server 数 据 库 应 用 技 术 图 8 唱 1 带 快 捷 菜 单 的 Enterprise Manager 图 8 唱 2 新 建 视 图 窗 口 图 8 唱 3 添 加 表 对 话 框
第 8 章 视 图 及 其 应 用 195 拉 列 表 中 选 择 要 使 用 的 列 名 或 者 直 接 从 最 上 面 的 图 表 框 中 选 择 相 应 的 列, 或 把 它 拖 入 中 间 的 表 格 在 列 区 中 选 择 将 包 括 在 视 图 的 数 据 列, 此 时 相 应 的 SQ L Server 脚 本 便 显 示 在 SQ L Script 区 (8) 对 每 一 列 的 输 出 列 进 行 选 中 或 取 消 选 中, 以 便 控 制 该 列 是 否 要 在 视 图 中 出 现 (9) 如 果 需 要 对 某 一 列 进 行 分 组, 可 右 击 该 列, 从 弹 出 菜 单 中 选 择 Group by 选 项 (10) 在 标 准 列 中, 输 入 选 择 的 条 件, 该 条 件 与 W HERE 子 句 中 的 条 件 是 对 应 的 如 果 在 该 列 中 指 定 了 分 组, 则 该 条 件 与 H A VING 子 句 中 的 条 件 相 对 应 (11) 单 击 该 窗 口 工 具 栏 中 的 红 色 惊 叹 号 (!) 按 钮 来 预 览 结 果, 或 者 单 击 保 存, 并 输 入 视 图 的 名 称, 完 成 视 图 的 创 建, 如 图 8 唱 4 所 示 图 8 唱 4 创 建 新 视 图 的 预 览 结 果 8.2.2 使 用 Transact 唱 SQL 创 建 视 图 创 建 视 图 也 可 使 用 T ransact 唱 SQ L 语 句 来 实 现,CREA T E VIEW 语 句 的 语 法 格 式 如 下 : CREATE VIEW view_name [(column_name [,...n])] [WITH ENCRYPTION] AS SELECT_statement [WITH CHECK OPTION] 其 中 组 成 视 图 的 列 名 (column_name) 要 么 全 部 省 略 要 么 全 部 指 定, 没 有 第 三 种 选 择 如 果 省 略 了 视 图 的 列 名, 则 隐 含 该 视 图 由 SELEC T _statement 子 句 中 结 果 集 的 列 名 组 成 但 在 下 列 3 种 情 况 下 必 须 明 确 指 定 组 成 视 图 的 所 有 列 名 : (1) 当 视 图 的 列 名 为 表 达 式 或 内 部 函 数 的 计 算 结 果 时, 而 不 是 单 纯 的 列 名 时, 则 需 指 明 新 的 列 名 在 SELEC T_statement 子 句 中 不 许 使 用 ORDER BY 子 句 和 DIS TINC T 短 语, 如 果 需 要 排 序, 则 可 在 视 图 定 义 后, 对 视 图 查 询 时 再 进 行 排 序
196 SQL Server 数 据 库 应 用 技 术 (2) 视 图 由 多 个 表 连 接 得 到, 在 不 同 的 表 中 存 在 同 名 列, 则 需 要 指 定 列 名 (3) 需 要 在 视 图 中 为 某 个 列 启 用 更 合 适 的 名 字 WI T H ENCRYP TION 表 示 加 密 选 项 ;AS 之 后 的 SELEC T 语 句 表 示 视 图 要 完 成 的 操 作 ;WI T H CHECK OP TION 选 项 强 制 所 有 通 过 视 图 修 改 的 数 据 满 足 代 码 中 的 SELEC T 语 句 中 指 定 的 选 择 条 件 例 8.1 创 建 一 个 简 单 视 图 的 例 子 USE student GO CREATE VIEW stud_view2 AS SELECT stud_id, name,address, telcode,zipcode FROM stud_info 例 8.2 使 用 WIT H ENCRYP TION 加 密 选 项 USE student GO / 倡 查 看 stud_info 表 中 的 所 有 数 据 倡 / SELECT 倡 FROM stud_info GO / 倡 基 于 stud_info, 创 建 视 图 stud_view3 倡 / CREATE VIEW stud_view3 WIT H ENCRYPTION AS SELECT stud_id as 学 号, name as 姓 名,address as 地 址, telcode as 电 话 号 码,zipcode as 邮 政 编 码 FROM stud_info WHERE mark > = 560 GO / 倡 查 看 新 建 视 图 stud_view3 中 的 所 有 数 据 倡 / SELECT 倡 FROM stud_view3 执 行 上 述 代 码 将 创 建 视 图 stud_view3, 其 内 容 包 含 了 stud_info 表 中 入 学 成 绩 大 于 等 于 560 的 学 生 清 单, 且 在 该 视 图 中 的 列 名 已 经 用 汉 字 标 题 取 代 上 述 代 码 的 执 行 结 果 如 图 8 唱 5 所 示 例 8.3 创 建 视 图 时, 使 用 WI T H C HECK OP TION 选 项 USE student GO CREATE VIEW stud_view4 AS SELECT stud_id, name,address, telcode,zipcode, mark + 10 as add_mark FROM stud_info WHERE mark < 560 WIT H CHECK OPTION GO SELECT 倡 FROM stud_view4
第 8 章 视 图 及 其 应 用 197 图 8 唱 5 创 建 和 执 行 带 有 WIT H ENCRYPTION 选 项 的 视 图 例 8.4 创 建 视 图 时, 使 用 内 部 函 数 USE student GO CREATE VIEW stud_view5(sex, avg_mark) AS SELECT gender, avg(mark) FROM stud_info GROUP BY gender GO SELECT 倡 FROM stud_view5 在 CREA T E VIEW 语 句 中 使 用 A VG SU M 等 内 部 函 数 时, 要 注 意 : (1) 必 须 提 供 要 创 建 的 视 图 中 列 的 名 称, 如 sex avg_ mark 因 为 视 图 的 列 名 之 一 avg_mark 为 内 部 函 数 的 计 算 结 果, 所 以 在 定 义 时 需 要 指 明 列 名 (2) 必 须 使 用 GRO U P BY 子 句 例 8.5 建 立 计 算 机 系 ( 学 号 第 3 ~ 4 位 为 01 ) 学 生 的 视 图, 并 要 求 进 行 修 改 和 插 入 操 作 时 仍 需 保 证 视 图 只 有 计 算 机 系 的 学 生 CREATE VIEW stud_computer AS SELECT stud_id, name, gender FROM stud_info WHERE substring(stud_id,3,2) = 01 WIT H CHECK OPTION
198 SQL Server 数 据 库 应 用 技 术 DBM S 执 行 CREA T E VIEW 语 句 的 结 果 只 是 把 视 图 的 定 义 存 入 数 据 字 典, 并 不 执 行 其 中 的 SELEC T 语 句 只 是 在 对 视 图 查 询 时, 才 按 视 图 的 定 义 从 表 中 将 数 据 查 出 若 一 个 视 图 是 从 单 个 表 导 出 的, 并 且 只 是 去 掉 了 表 的 某 些 行 和 某 些 列, 但 保 留 了 主 关 键 字, 我 们 称 这 类 视 图 为 行 列 子 集 视 图 视 图 stud_computer 就 是 一 个 行 列 子 集 视 图 例 8.6 建 立 计 算 机 专 业 英 语 ( 课 程 号 第 9 ~ 10 位 为 01 ) 成 绩 单 的 视 图 CREATE VIEW stud_english_grade(no,name,type,credit,grade) AS SELECT a.stud_id,a.name, b.course_type, b.course_mark,a.grade FROM stud_grade a, lesson_info b WHERE substring(a.stud_id,3,2) = 01 AND substring(b.course_id,9,2) = 01 例 8.7 建 立 计 算 机 专 业 英 语 的 成 绩 在 90 分 以 上 的 学 生 的 视 图 CREATE VIEW stud_english_grade_90 AS SELECT no, name, grade FROM stud_english_grade WHERE grade > = 90 例 8.8 创 建 一 个 计 算 机 系 教 师 情 况 的 视 图 teacher_view CREATE VIEW teacher_view AS SELECT teacher_id, name, tech_title FROM teacher_info WHERE substring(teacher_id,1,2) = 01 其 中 : 视 图 名 字 为 teacher_view, 省 略 了 视 图 列 表 视 图 由 子 查 询 中 的 三 列 teacher_id, name, tech_title 组 成 视 图 创 建 后, 对 视 图 teacher_view 的 数 据 的 访 问 只 限 制 在 计 算 机 系 内, 且 只 能 访 问 teacher _id, name, tech _ title 三 列 的 内 容, 从 而 达 到 了 数 据 保 密 的 目 的 例 8.9 创 建 学 生 情 况 视 图 stud_course_grade( 包 括 学 号 姓 名 课 程 名 及 成 绩 ) CREATE VIEW stud_course_grade (stud_id, name, course_name, score) AS SELECT stud_id, name, course_name, grade FROM stud_info a,lesson_info b, stud_grade c WHERE a.stud_id = c.stud_id AND b.course_id = c.course_id 视 图 stud_course_grade 由 三 个 表 (stud_info a,lesson_info b, stud_grade c) 连 接 得 到, 在 stud_info 表 和 stud_grade 表 中 均 存 在 stud_id 列, 则 需 指 定 视 图 列 名 例 8.10 建 立 教 师 (classroom_info) 教 师 (teacher_info) 课 程 (lesson_info) 课 程 安 排 表 (teach_schedule) 相 互 对 照 的 视 图 (schedule_view)
第 8 章 视 图 及 其 应 用 199 CREATE VIEW schedule_view AS SELECT lesson.course_name, teacher.name, classroom.room_name, schedule.course_ week, schedule.course_time, schedule.course_id FROM classroom_info classroom, teacher_info teacher, lesson_info lesson, teach_schedule schedule WHERE classroom.room_id = schedule.room_id AND teacher.teacher_id = schedule.teacher_id AND lesson.course_id = schedule.course_id ; 这 个 视 图 涉 及 四 个 基 表 (classroom_info teacher_info lesson_info teach_schedule) 用 户 在 这 个 视 图 上 检 索 可 以 直 接 得 到 课 表 中 的 相 关 信 息, 就 好 像 在 一 个 表 中 操 作 一 样 8.2.3 使 用 创 建 视 图 向 导 程 序 具 体 操 作 步 骤 如 下 : (1) 单 击 开 始 程 序 Microsoft SQ L Server 企 业 管 理 器, 打 开 SQ L Server Enterprise Manager 窗 口 (2) 展 开 服 务 器 组, 选 择 要 创 建 视 图 的 服 务 器 (3) 从 图 8 唱 6 所 示 工 具 向 导 选 项, 打 开 选 择 向 导 对 话 框, 如 图 8 唱 7 所 示 图 8 唱 6 从 工 具 下 拉 式 菜 单 中 选 择 向 导 (4) 在 选 择 向 导 对 话 框 中, 展 开 数 据 库 项, 双 击 创 建 视 图 向 导 项, 则 出 现 创 建 视 图 向 导 对 话 框, 如 图 8 唱 8 所 示
200 SQL Server 数 据 库 应 用 技 术 图 8 唱 7 选 择 向 导 对 话 框 图 8 唱 8 创 建 视 图 向 导 窗 口 (5) 按 照 创 建 视 图 向 导 中 的 提 示 进 行 操 作, 完 成 对 视 图 的 创 建 8.3 视 图 定 义 的 查 询 与 修 改 8.3.1 查 看 和 修 改 视 图 定 义 在 创 建 好 视 图 后, 可 以 查 看 和 修 改 其 定 义 或 对 其 进 行 重 命 名 要 查 看 和 修 改 视 图 的 定 义, 既 可 使 用 企 业 管 理 器, 也 可 使 用 T ransact 唱 SQ L 语 句 来 完 成, 下 面 分 别 加 以 介 绍
第 8 章 视 图 及 其 应 用 201 1. 使 用 企 业 管 理 器 查 看 和 修 改 视 图 定 义 在 SQ L Server 中, 通 过 企 业 管 理 器 查 看 和 修 改 视 图 定 义 主 要 执 行 以 下 步 骤 : 方 法 1 : (1) 启 动 企 业 管 理 器, 登 录 到 指 定 的 服 务 器 (2) 打 开 欲 管 理 视 图 的 数 据 库 文 件 夹, 选 中 视 图 图 标, 此 时 在 右 面 的 窗 格 中 显 示 当 前 数 据 库 的 所 有 视 图 (3) 如 图 8 唱 9 所 示, 在 右 窗 格 中 右 键 单 击 要 查 看 的 视 图, 在 弹 出 菜 单 中 选 择 属 性 菜 单 项, 打 开 如 图 8 唱 10 所 示 查 看 属 性 窗 口 图 8 唱 9 右 击 欲 看 视 图, 在 弹 出 菜 单 中 单 击 属 性 菜 单 项 图 8 唱 10 查 看 属 性 对 话 框
202 SQL Server 数 据 库 应 用 技 术 (4) 在 对 话 框 内 可 浏 览 到 视 图 定 义 的 SQ L 文 本, 也 可 以 对 该 视 图 定 义 进 行 修 改, 然 后 单 击 检 查 语 法 按 钮 来 对 语 句 合 法 性 进 行 检 查 若 要 对 视 图 的 访 问 权 限 进 行 设 置, 请 单 击 权 限 按 钮 方 法 2 : (1) 启 动 企 业 管 理 器, 登 录 到 指 定 的 服 务 器 (2) 打 开 欲 管 理 视 图 的 数 据 库 文 件 夹, 选 中 视 图 图 标, 此 时 在 右 面 的 窗 格 中 显 示 当 前 数 据 库 的 所 有 视 图 (3) 如 图 8 唱 11 所 示, 在 右 窗 格 中 右 键 单 击 要 查 看 的 视 图, 在 弹 出 菜 单 中 选 择 设 计 视 图 菜 单 项, 即 可 进 入 到 设 计 视 图 的 窗 口 图 8 唱 11 右 击 欲 看 视 图, 弹 出 菜 单 中 选 设 计 视 图 (4) 如 果 要 添 加 引 用 表 或 视 图, 可 右 击 该 窗 口 最 上 端 的 图 表 框, 从 弹 出 菜 单 中 选 择 添 加 表 选 项, 打 开 添 加 表 对 话 框, 从 列 表 框 中 选 择 相 应 的 表 或 视 图 进 行 添 加 即 可 (5) 如 果 要 从 定 义 中 删 除 引 用 表 或 视 图, 可 在 该 窗 口 最 上 端 的 图 表 框 中, 右 击 要 删 除 的 表 或 视 图, 从 弹 出 菜 单 中 选 择 删 除 选 项 (6) 在 设 计 视 图 窗 口 中, 可 以 按 照 创 建 新 视 图 的 方 法 对 原 有 的 视 图 进 行 各 种 修 改, 最 后 存 盘 即 可 其 他 操 作 与 创 建 视 图 操 作 相 同, 可 参 见 8.2 节 中 创 建 视 图 的 介 绍 2. 通 过 系 统 存 储 过 程 查 看 视 图 的 定 义 信 息 在 SQ L Server 中 有 三 个 系 统 存 储 过 程 有 助 于 了 解 视 图 信 息, 它 们 分 别 为 : (1) sp_depends 系 统 存 储 过 程 sp_depends 返 回 系 统 表 中 存 储 的 任 何 信 息, 该 系 统 表 指 出 数 据 库 对 象 所 依 赖 的 对 象 其 语 法 形 式 : sp_depends [ @ objname = ] object
第 8 章 视 图 及 其 应 用 203 参 数 [ @ objname = ] object 为 被 检 查 的 数 据 库 对 象 对 象 可 以 是 表 视 图 存 储 过 程 或 触 发 器 例 8.11 执 行 系 统 存 储 过 程 sp_depends, 以 获 取 视 图 的 参 照 对 象 和 列 在 查 询 分 析 器 中 运 行 命 令 :EXEC sp_depends stud_view1, 运 行 结 果 如 图 8 唱 12 所 示 图 8 唱 12 执 行 sp_depends 获 取 视 图 的 参 照 对 象 和 列 从 图 8 唱 12 中 可 以 看 到, 视 图 stud_ view1 参 照 了 表 stud_info 中 的 stud_id,name, telcode,address 列 (2) sp_help 系 统 存 储 过 程 sp_help 用 来 返 回 有 关 数 据 库 对 象 的 详 细 信 息, 如 果 不 针 对 某 一 特 定 对 象, 则 返 回 数 据 库 中 所 有 对 象 信 息 其 语 法 形 式 : sp_help [[ @ objname = ]name] 参 数 [ @ objname = ] name 是 sysobjects 中 的 任 意 对 象 的 名 称, 或 者 是 在 systypes 表 中 任 何 用 户 定 义 数 据 类 型 的 名 称 例 8.12 执 行 系 统 存 储 过 程 sp_help, 以 获 取 有 关 数 据 库 对 象 的 详 细 信 息 在 查 询 分 析 器 中 运 行 命 令 :EXEC sp_help stud_computer, 运 行 结 果 如 图 8 唱 13 所 示 图 8 唱 13 执 行 sp_help 获 取 视 图 详 细 信 息
204 SQL Server 数 据 库 应 用 技 术 (3) sp_helptex t 系 统 存 储 过 程 sp_helptext 检 索 出 视 图 触 发 器 存 储 过 程 的 定 义 文 本 其 语 法 为 : sp_helptext [ @ objname = ] name 参 数 [ @ objname = ] name 为 对 象 的 名 称, 将 显 示 对 象 ( 视 图 或 触 发 器 或 存 储 过 程 ) 的 定 义 信 息 对 象 必 须 在 当 前 数 据 库 中 例 8.13 执 行 系 统 存 储 过 程 sp_helptext 查 看 视 图 的 定 义 信 息 在 查 询 分 析 器 中 运 行 命 令 : EXEC sp _ helptext stud _ view2, 运 行 结 果 如 图 8 唱 14 所 示 图 8 唱 14 执 行 sp_helptext 查 看 视 图 的 定 义 信 息 例 8.14 执 行 系 统 存 储 过 程 sp_helptext 查 看 已 加 密 的 视 图 的 定 义 信 息 在 查 询 分 析 器 中 运 行 命 令 : EXEC sp_helptext stud_view3 运 行 结 果 如 图 8 唱 15 所 示 图 8 唱 15 执 行 sp_helptext 查 看 已 加 密 的 视 图 3. 使 用 Transact 唱 SQL 语 句 修 改 视 图 定 义 当 修 改 视 图 的 基 表 时, 有 可 能 因 修 改 不 当 影 响 视 图 的 可 能 性 利 用 视 图 修 改 语 句 可 以 检 查 出 视 图 是 否 可 用 修 改 对 视 图 的 定 义, 通 常 使 用 A L T ER VIEW 语 句 A L TER VIEW 语 句 的 语 法 格 式 如 下 :
第 8 章 视 图 及 其 应 用 205 ALTER VIEW view_name [(column_name [,...n])] [WITH ENCRYPTION] AS SELECT_statement [WITH CHECK OPTION] 例 8.15 一 个 修 改 视 图 定 义 的 例 子 USE student GO / 倡 显 示 修 改 前 视 图 stud_view2 的 内 容 倡 / SELECT 倡 FROM stud_view2 GO ALTER VIEW stud_view2 AS SELECT stud_id, name, gender, mark FROM stud_info WHERE mark < 600 GO / 倡 显 示 修 改 后 视 图 stud_view2 的 内 容 倡 / SELECT 倡 FROM stud_view2 4. 重 命 名 视 图 一 般 情 况 下, 可 使 用 下 面 两 种 方 法 对 视 图 进 行 重 命 名 : 使 用 企 业 管 理 器, 或 者 使 用 sp_rename 系 统 存 储 过 程, 下 面 分 别 加 以 介 绍 : (1) 使 用 企 业 管 理 器 对 视 图 进 行 重 命 名 具 体 操 作 步 骤 如 下 : 1 单 击 开 始 程 序 Microsoft SQ L Server 企 业 管 理 器, 打 开 SQ L Server Enterprise Manager 窗 口 2 展 开 服 务 器 组, 双 击 该 窗 口 左 窗 格 目 录 树 中 的 服 务 器, 单 击 数 据 库 项 左 侧 的 加 号 ( + ), 展 开 数 据 库 组, 展 开 视 图 所 在 的 数 据 库 3 单 击 视 图 项, 从 右 窗 格 中 选 择 要 进 行 重 命 名 的 视 图 名, 右 击 该 视 图, 从 弹 出 菜 单 中 选 择 重 命 名 选 项 4 此 时, 视 图 名 处 于 编 辑 状 态, 输 入 新 的 视 图 名 称, 确 认 无 误 后 按 Enter 键, 或 者 用 鼠 标 单 击 任 意 空 白 区 域, 完 成 对 视 图 重 命 名 的 操 作 (2) 使 用 sp_rename 系 统 存 储 过 程 对 视 图 进 行 重 命 名 sp_rename 系 统 存 储 过 程 主 要 用 来 修 改 当 前 数 据 库 中 用 户 所 创 建 的 诸 如 表 列 或 者 用 户 自 定 义 的 数 据 类 型 之 类 的 对 象 的 名 称 它 的 语 法 格 式 如 下 : sp_rename [ @ objname = ] object_name, [ @ newname = ] new_name [,[ @ objtype = ] object_type ]
206 SQL Server 数 据 库 应 用 技 术 其 中 第 一 个 参 数 [ @ objname = ] object_name, 表 示 现 有 用 户 对 象 或 数 据 类 型 的 名 称, 如 表 视 图 列 存 储 过 程 触 发 器 默 认 值 数 据 库 对 象 或 规 则 等 的 名 称 第 二 个 参 数 [ @ new name = ] new _name, 表 示 对 指 定 对 象 进 行 重 命 名 的 新 名 称 新 命 名 的 视 图 名 称 必 须 符 合 标 识 符 的 命 名 规 则 第 三 个 参 数 [ @ objtype = ] object_type, 表 示 将 要 被 重 命 名 的 对 象 的 类 型, 默 认 类 型 为 N U L L 例 8.16 将 视 图 stud_view3 重 命 名 为 stud_encryption_view3 USE student GO EXEC sp_rename stud_view3, stud_encryption_view3 例 8.17 重 命 名 表 中 的 一 个 列, 例 如, 将 表 stud _ info 中 的 mark 列 重 命 名 为 score USE student GO EXEC sp_rename stud_info.[mark], score, COLU M N 8.3.2 视 图 的 删 除 当 不 再 需 要 一 个 视 图 时, 可 对 其 进 行 删 除 操 作 删 除 一 个 视 图 的 方 法 与 删 除 一 个 表 的 方 法 是 类 似 的, 既 可 以 使 用 企 业 管 理 器, 也 可 以 使 用 T ransact 唱 SQ L 语 句 1. 通 过 企 业 管 理 器 删 除 视 图 在 SQ L Server 中, 通 过 企 业 管 理 器 删 除 视 图 的 主 要 步 骤 为 : (1) 单 击 开 始 程 序 Microsoft SQ L Server 企 业 管 理 器, 启 动 企 业 管 理 器, 登 录 到 指 定 的 服 务 器 (2) 双 击 企 业 管 理 器 左 窗 格 目 录 树 中 的 服 务 器, 单 击 数 据 库 项 左 侧 的 加 号 ( + ), 选 中 欲 删 除 视 图 的 数 据 库 文 件 夹, 选 中 视 图 图 标, 此 时 在 右 面 的 窗 格 中 显 示 当 前 数 据 库 的 所 有 视 图 (3) 在 右 窗 格 中 右 击 欲 删 除 的 视 图, 在 弹 出 菜 单 中 选 择 删 除 菜 单 项, 打 开 删 除 对 象 对 话 框, 单 击 全 部 删 除 按 钮, 即 可 删 除 选 中 的 视 图 2. 使 用 Transact 唱 SQL 语 句 删 除 视 图 要 删 除 一 个 视 图, 可 使 用 DROP VIEW 语 句 DROP VIEW 语 句 的 语 法 格 式 如 下 : DROP VIEW view_name 例 8.18 删 除 数 据 库 student 中 计 算 机 系 教 师 情 况 的 视 图 teacher_view DROP VIEW teacher_view 视 图 删 除 后, 只 会 删 除 视 图 teacher_view 在 数 据 字 典 中 的 定 义, 而 与 视 图 有 关 的 基 本 表 中 的 数 据 不 会 受 到 任 何 影 响, 由 此 视 图 导 出 的 其 他 视 图 的 定 义 不 会 删 除, 但 已 无 任 何 意 义 用 户 应 该 把 这 些 视 图 删 除
第 8 章 视 图 及 其 应 用 207 8.4 通 过 视 图 查 询 与 更 新 数 据 8.4.1 通 过 视 图 查 询 数 据 视 图 定 义 后, 对 视 图 的 查 询 操 作 如 同 对 基 本 表 的 查 询 操 作 一 样 例 8.19 查 找 视 图 teacher_view 中 职 称 为 教 授 的 教 师 编 号 和 姓 名 SELECT teacher_id, name FROM teacher_view WHERE tech_title = 教 授 此 查 询 的 执 行 过 程 是 系 统 首 先 从 数 据 字 典 中 找 到 teacher_view 的 定 义, 然 后 把 此 定 义 和 用 户 的 查 询 结 合 起 来, 转 换 成 等 价 的 对 基 本 表 teacher_info 的 查 询, 这 一 转 换 过 程 称 为 视 图 消 解 (View Resolution), 相 当 于 执 行 以 下 查 询 : SELECT teacher_id, name FROM teacher_info WHERE substring(teacher_id,1,2) = 01 AND tech_title = 教 授 由 例 8.19 可 以 看 出, 当 对 一 个 基 本 表 进 行 复 杂 的 查 询 时, 可 以 先 对 基 本 表 建 立 一 个 视 图, 然 后 只 需 对 此 视 图 进 行 查 询, 这 样 就 不 必 再 键 入 复 杂 的 查 询 语 句, 而 将 一 个 复 杂 的 查 询 转 换 成 一 个 简 单 的 查 询, 从 而 简 化 了 查 询 操 作 例 8.20 在 计 算 机 系 学 生 的 视 图 (stud_computer) 中 找 出 性 别 为 男 的 学 生 SELECT stud_id, name, gender FROM stud_computer WHERE gender = 男 DBM S 执 行 对 视 图 的 查 询 时, 首 先 进 行 有 效 性 检 查, 检 查 查 询 的 表 视 图 等 是 否 存 在 如 果 存 在, 则 从 数 据 字 典 中 取 出 视 图 的 定 义, 把 定 义 中 的 子 查 询 和 用 户 的 查 询 结 合 起 来, 转 换 成 等 价 的 对 表 的 查 询, 然 后 再 执 行 修 正 了 的 查 询 本 例 转 换 后 的 查 询 语 句 为 : SELECT stud_id, name, gender FROM stud_computer WHERE substring(stud_id,3,2) = 01 AND gender = 男 例 8.21 查 询 计 算 机 系 的 学 生 的 英 语 成 绩 SELECT no,name,grade FROM stud_english_grade 转 换 后 的 查 询 语 句 为 : SELECT a.stud_id,a.name,a.grade FROM stud_grade a, lesson_info b WHERE substring(a.stud_id,3,2) = 01 AND substring(b.course_id,9,2) = 01 例 8.22 在 视 图 stud_view5 中 查 询 平 均 成 绩 在 560 分 以 上 的 记 录, 其 语 句 为 : SELECT sex, avg_mark FROM stud_view5 WHERE avg_mark > = 560
208 SQL Server 数 据 库 应 用 技 术 将 上 面 查 询 语 句 与 视 图 定 义 中 的 子 查 询 结 合 后, 形 成 下 列 查 询 语 句 : SELECT gender, avg(mark) FROM stud_info WHERE avg(mark) > = 560 GROUP BY gender 前 面 讲 过 W H ERE 子 句 中 是 不 能 用 集 合 函 数 作 为 条 件 表 达 式 的, 因 此 执 行 此 修 正 后 的 查 询 将 会 出 现 语 法 错 误 正 确 的 查 询 语 句 应 该 是 : SELECT gender, avg(mark) FROM stud_info GROUP BY gender HAVING avg(mark) > = 560 目 前 多 数 关 系 数 据 库 系 统 对 行 列 子 集 视 图 的 查 询 均 能 进 行 正 确 转 换 但 对 非 行 列 子 集 的 查 询 就 不 一 定 能 转 换 了, 因 此 这 类 查 询 应 该 直 接 对 基 表 进 行 8.4.2 通 过 视 图 更 新 数 据 更 新 视 图 是 指 通 过 视 图 插 入 (INSER T ) 删 除 (DELE T E) 和 修 改 ( U PDA T E) 数 据 像 查 询 视 图 那 样, 对 视 图 的 更 新 操 作 也 是 通 过 视 图 消 解 转 换 为 对 表 的 更 新 操 作 如 果 要 防 止 用 户 通 过 视 图 对 数 据 库 进 行 增 删 改 时 有 意 无 意 地 对 不 属 于 视 图 范 围 内 的 基 本 表 数 据 进 行 操 作, 则 在 视 图 定 义 时 要 加 上 WI T H C HECK OP TION 子 句 这 样 在 视 图 上 增 删 改 数 据 时,DBM S 会 检 查 视 图 定 义 中 子 查 询 的 W HERE 子 句 中 的 条 件, 若 操 纵 的 记 录 不 满 足 条 件, 则 拒 绝 执 行 相 应 操 作 (1) 插 入 (INSER T) 例 8.23 向 计 算 机 系 教 师 视 图 teacher _ view 中 插 入 一 条 记 录 ( teacher _ id : 010108 ;name : 李 里 ;tech_title : 副 教 授 ) INSERT INTO teacher_view VALUES ( 010108, 李 里, 副 教 授 ) 系 统 在 执 行 此 语 句 时, 首 先 从 数 据 字 典 中 找 到 teacher_view 的 定 义, 然 后 把 此 定 义 和 插 入 操 作 结 合 起 来, 转 换 成 等 价 的 对 基 本 表 teacher_info 的 插 入 相 当 于 执 行 以 下 操 作 : INSERT INTO teacher_info(teacher_id,name, tech_title) VALUES ( 010108, 李 里, 副 教 授 ) (2) 修 改 (U PDA T E) 例 8.24 将 计 算 机 系 教 师 视 图 teacher_view 中 王 小 悦 的 职 称 改 为 副 教 授 UPDATE teacher_view SET tech_title = 副 教 授 WHERE name = 王 小 悦 将 转 换 成 对 基 本 表 (teacher_info) 的 修 改 操 作 : UPDATE teacher_info SET tech_title = 副 教 授 WHERE name = 王 小 悦 (3) 删 除 (DELE T E) 例 8.25 删 除 计 算 机 系 教 师 视 图 teacher_view 中 李 里 教 师 的 记 录
第 8 章 视 图 及 其 应 用 209 DELETE FROM teacher_view WHERE name = 李 里 将 转 换 成 对 基 本 表 (teacher_info) 的 删 除 操 作 : DELETE FROM teacher_info WHERE name = 李 里 由 于 视 图 中 的 数 据 不 是 存 放 在 视 图 中 的, 即 视 图 没 有 相 应 的 存 储 空 间, 对 视 图 的 一 切 操 作 最 终 都 要 转 换 成 对 基 本 表 的 操 作, 这 样 看 来 使 操 作 更 加 复 杂, 那 么 为 什 么 还 要 使 用 视 图 呢? 请 读 者 思 考 作 为 练 习, 下 面 再 举 几 例 说 明 视 图 (stud_computer) 更 新 是 针 对 基 表 而 言, 请 读 者 自 己 写 出 针 对 基 表 (stud_info) 操 作 的 有 关 语 句 例 8.26 将 计 算 机 系 学 生 王 刚 的 姓 名 改 为 王 刚 果 UPDATE stud_computer SET name = 王 刚 果 WHERE stud_id = 0401030101 请 读 者 自 己 将 上 述 语 句 转 换 为 对 表 数 据 的 更 新 语 句 例 8.27 计 算 机 系 增 加 了 一 个 新 生 ( 学 号 为 0401030125, 姓 名 为 吴 新, 性 别 为 女 ) INSERT INTO stud_computer VALUES( 0401030125, 吴 新, 女 ) 请 读 者 自 己 将 上 述 语 句 转 换 为 对 表 数 据 的 插 入 语 句 例 8.28 删 除 计 算 机 系 学 生 吴 新, 学 号 是 0401030125 DELETE FROM stud_computer WHERE stud_id = 0401030125 请 读 者 自 己 将 上 述 语 句 转 换 为 对 表 数 据 的 删 除 语 句 在 关 系 数 据 库 中, 并 不 是 所 有 视 图 都 是 可 更 新 的, 因 为 有 些 视 图 的 更 新 不 能 惟 一 地 有 意 义 地 转 换 成 对 相 应 表 的 更 新 例 如, 前 面 例 8.4 定 义 的 视 图 stud_view5 是 由 性 别 和 平 均 成 绩 两 个 列 组 成 的, 其 中 平 均 成 绩 一 项 是 由 表 stud_info 中 对 记 录 分 组 后 计 算 平 均 值 得 来 的 如 果 想 把 视 图 stud_view5 中 性 别 为 女 的 学 生 的 平 均 成 绩 改 成 90 分,SQ L 语 句 如 下 : UPDATE stud_view5 SET avg_mark = 95 WHERE gender = 女 这 个 SQ L 语 句 对 视 图 的 更 新 是 无 法 转 换 成 对 表 stud_info 的 更 新 的, 因 为 系 统 无 法 修 改 学 生 的 入 学 成 绩, 以 使 平 均 成 绩 成 为 95 所 以 stud_view5 视 图 是 不 可 更 新 的 实 训 1. 实 训 目 的 (1) 理 解 视 图 的 概 念 (2) 学 会 利 用 企 业 管 理 器 和 查 询 分 析 器 创 建 视 图 的 方 法 (3) 学 会 查 询 更 新 删 除 视 图 的 方 法 2. 实 训 的 知 识 准 备 要 求 掌 握 使 用 企 业 管 理 器 和 查 询 分 析 器 (CREA TE VIEW A L T ER VIEW DROP VIEW) 创 建 修 改 删 除 视 图 的 方 法, 并 能 够 使 用 系 统 存 储 过 程 sp_helptext 查 看 视 图 的
210 SQL Server 数 据 库 应 用 技 术 定 义 信 息 在 掌 握 视 图 使 用 方 法 的 同 时, 希 望 能 够 根 据 实 际 需 要 创 建 视 图 3. 实 训 内 容 和 步 骤 (1) 创 建 视 图 1 将 表 stud_info 中 所 有 女 生 记 录 定 义 为 一 个 视 图 (stud_info_female), 在 查 询 分 析 器 窗 口 中 输 入 和 执 行 语 句, 并 在 企 业 管 理 器 中 显 示 其 结 果 2 对 表 stud_info 定 义 一 个 反 映 学 生 出 生 日 期 的 视 图 (stud_info_birthday), 在 查 询 分 析 器 窗 口 中 输 入 和 执 行 语 句, 并 在 企 业 管 理 器 中 显 示 其 结 果 3 将 表 stud _ grade 中 学 生 的 学 号 及 其 平 均 成 绩 定 义 为 一 个 视 图 ( stud _ grade _ average), 在 查 询 分 析 器 窗 口 中 输 入 和 执 行 语 句, 并 在 企 业 管 理 器 中 显 示 其 结 果 (2) 使 用 视 图 1 通 过 视 图 stud_info_female 查 询 所 有 女 生 记 录 的 信 息 在 查 询 分 析 器 窗 口 中 输 入 如 下 语 句 并 执 行 : SELECT 倡 FROM stud_info_female 2 通 过 查 询 视 图 stud_info_birthday 查 询 学 生 的 年 龄, 在 查 询 分 析 器 输 入 如 下 语 句 执 行 : SELECT stud_id, name, AS age FROM stud_info_birthday 3 向 视 图 stud_info_female 中 插 入 一 条 记 录 在 查 询 分 析 器 窗 口 中 输 入 如 下 语 句 并 执 行 : IN TO stud_info_female VALUES ( 0402010634, 张 艳 燕, 12/06/1986, 女, 北 京 市 海 淀 区, 010 唱 66571908, 100081,565) 4 张 艳 燕 从 管 理 工 程 系 转 到 计 算 机 工 程 系 在 查 询 分 析 器 窗 口 中 输 入 如 下 语 句 并 执 行 : stud_info_female SET stud_id = substring(stud_id,1,2) + 02 + substring(stud_id,5,6) WHERE name = 张 艳 燕 5 把 张 艳 燕 从 表 stud_info 中 删 除 在 查 询 分 析 器 窗 口 中 输 入 如 下 语 句 并 执 行 : stud_info_female WHERE name = 张 艳 燕 自 行 练 习 : 尝 试 在 视 图 stud_grade_average 中 插 入 修 改 删 除 数 据 记 录, 然 后 检 查 数 据 表 stud_grade 中 的 变 化 情 况 课 后 作 业 1. 选 择 最 适 合 的 答 案 (1) 用 哪 个 选 项 建 立 的 视 图, 保 证 通 过 视 图 加 到 表 中 的 行 可 以 通 过 视 图 访 问? ( )
第 8 章 视 图 及 其 应 用 211 A. W HERE B. WIT H ENCRYP TION C. WIT H CHECK OP TION D. CREA T E VIEW (2) 用 下 列 代 码 建 立 一 个 视 图, 对 该 视 图 允 许 做 什 么 操 作? ( ) CREA T E VIEW stud_view AS SELEC T 倡 FRO M stud_info W H ERE sbsstring(stud_id,3,2) = 01 A. SELEC T B. SELEC T,U PDA TE C. SELEC T,DELE T E D. SELEC T,INSER T (3) 建 立 视 图 的 哪 一 个 选 项, 将 加 密 CREA T E VIEW 语 句 文 本? ( ) A. WI T H U PDA T E B. WIT H READ ONLY C. WIT H CHECK OP TION D. WI T H ENCRYP TION (4) 在 CREA T E VIEW 命 令 中 哪 个 选 项 将 强 制 所 有 通 过 视 图 修 改 的 数 据 必 须 满 足 代 码 中 的 SELEC T 语 句 中 指 定 的 选 择 条 件? ( ) A. WI T H CHECK OP TION B. WI T H READ ONLY C. WIT H NO U PDA T E D. 没 有 这 样 的 选 项, 假 如 用 户 对 基 表 有 权 限, 用 户 可 以 更 新 视 图 (5) 执 行 哪 一 个 系 统 存 储 过 程, 可 以 查 看 视 图 的 定 义 信 息? ( ) A. sp_helptext B. sp_depends C. sp_help D. sp_rename (6) 下 列 代 码 中 哪 一 行 语 法 有 错? ( ) 1 CREA T E VIEW stud_view 2 AS SELEC T stud_id stud_id 3 name stud_name 4 FRO M stud_info 5 W H ERE stud_id = 0401020201 6 ORDER BY birthday A. 第 5 行 B. 第 2 行 C. 第 6 行 D. 没 有 错 误 2. 按 照 题 目 要 求 写 出 下 列 SQL 命 令, 并 在 机 器 上 进 行 测 试 (1) 选 择 学 生 基 本 信 息 表 (stud_info) 中 的 学 号 姓 名, 选 择 学 生 成 绩 表 (stud_grade) 中 的 考 试 成 绩 创 建 一 个 名 为 stud_view 的 视 图, 该 视 图 中 的 记 录 还 必 须 满 足 院 系 编 号 为 01( 计 算 机 工 程 系 ) 的 条 件 (2) 选 择 教 师 基 本 信 息 表 (teacher_info) 中 的 编 号 姓 名, 选 择 课 程 信 息 表 (lesson_ info) 中 的 课 程 号 course_id 课 程 名 course_name 创 建 一 个 名 为 teacher_view 的 视 图, 该 视 图 中 的 记 录 还 必 须 满 足 专 业 编 号 为 01( 计 算 机 应 用 ) 的 条 件 (3) 创 建 一 个 名 为 tea_view 计 算 机 工 程 系 学 生 计 算 机 导 论 的 平 均 成 绩 的 视 图 显 示 的 列 要 求 包 括 学 号 姓 名 平 均 成 绩 (4) 说 明 下 列 SQ L 语 句 的 作 用
212 SQL Server 数 据 库 应 用 技 术 CREATE VIEW ser_view AS SELECT 倡 FROM stud_info WHERE substring(stud_id,3,2) = 04 INSERT INTO ser_view VALUES ( 0404010812, 张 虹, 11/02/1986, 男, 北 京 市 丰 台 区, 010 唱 64112565, 100081,570) SELECT 倡 FROM stud_info (5) 说 明 下 列 创 建 视 图 的 SQ L 语 句 中 WI T H ENCRYP TION 子 句 的 功 用 CREATE VIEW tee_view WIT H ENCRYPTION AS SELECT 倡 FROM teacher_info WHERE substring(teacher_id,3,2) = 01 当 执 行 EXEC helptext tee_view 命 令 时 会 出 现 什 么 现 象? (6) 接 上 题 修 改 tee_view 视 图 的 定 义, 去 掉 WI T H ENCRYP TION 子 句, 但 是 增 加 WI T H C H ECK OP TION 选 项, 上 机 运 行 下 列 命 令 时 将 出 现 什 么 状 况? UPDATE tee_view SET teacher_id = 010201 WHERE name = 刘 娜 (7) 写 出 建 立 院 系 代 码 表 (dept_code) 教 研 室 信 息 表 (staffroom_info) 和 教 师 基 本 信 息 表 (teacher_info) 的 视 图 命 令, 视 图 中 的 列 为 教 师 姓 名 所 属 院 系 名 称 所 属 教 研 室 名 称
第 9 章 存 储 过 程 与 触 发 器 SQ L Server 应 用 操 作 中, 存 储 过 程 和 触 发 器 扮 演 相 当 重 要 的 角 色, 基 于 其 预 编 译 并 存 储 在 SQ L Server 数 据 库 中 的 特 性, 不 仅 能 提 高 应 用 效 率, 确 保 一 致 性, 更 能 提 高 系 统 执 行 速 度 同 时, 使 用 触 发 器 来 完 成 业 务 规 则, 达 到 简 化 程 序 设 计 的 目 的 本 章 将 介 绍 存 储 过 程 和 触 发 器 的 作 用, 并 讨 论 使 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 创 建 修 改 删 除 存 储 过 程 和 触 发 器 的 方 法 9.1 存 储 过 程 概 述 9.1.1 什 么 是 存 储 过 程 当 开 发 一 个 应 用 程 序 时, 为 了 易 于 修 改 和 扩 充, 经 常 会 将 负 责 不 同 功 能 的 语 句 集 中 起 来 而 且 按 照 用 途 分 别 独 立 放 置, 以 便 能 够 反 复 调 用, 而 这 些 独 立 放 置 且 拥 有 不 同 功 能 的 语 句, 即 是 过 程 (Procedure) SQ L Server 的 存 储 过 程 包 含 一 些 T ransact 唱 SQ L 语 句 并 以 特 定 的 名 称 存 储 在 数 据 库 中 ( 存 储 过 程 也 是 一 种 数 据 库 对 象 ) 可 以 在 存 储 过 程 中 声 明 变 量 有 条 件 执 行 以 及 其 他 各 项 强 大 的 程 序 设 计 功 能 SQ L Server 的 存 储 过 程 与 其 他 程 序 设 计 语 言 的 过 程 类 似, 同 样 能 按 下 列 方 式 运 行 : (1) 它 能 够 包 含 执 行 各 项 数 据 库 操 作 的 语 句, 并 且 可 以 调 用 其 他 的 存 储 过 程 (2) 能 够 接 受 输 入 参 数, 并 以 输 出 参 数 的 形 式 将 多 个 数 据 值 返 回 给 调 用 程 序 (Ca11ing Procedure) 或 批 处 理 (Batch) (3) 向 调 用 程 序 或 批 处 理 返 回 一 个 状 态 值, 以 表 明 成 功 或 失 败 ( 以 及 失 败 的 原 因 ) 存 储 过 程 (Stored Procedure) 是 一 组 为 了 完 成 特 定 功 能 的 SQ L 语 句 集, 经 编 译 后 存 储 在 数 据 库 中 用 户 通 过 指 定 存 储 过 程 的 名 字 并 给 出 参 数 ( 如 果 该 存 储 过 程 带 有 参 数 ) 来 执 行 它 9.1.2 存 储 过 程 类 型 1. 系 统 存 储 过 程 存 储 过 程 在 运 算 时 生 成 执 行 方 式, 其 后 再 运 行 时 执 行 速 度 很 快 SQ L Server 不 仅 提 供 了 用 户 自 定 义 存 储 过 程 的 功 能, 而 且 也 提 供 了 许 多 可 作 为 工 具 使 用 的 系 统 存 储 过 程 系 统 存 储 过 程 (System Stored Procedures) 主 要 存 储 在 master 数 据 库 中 并 以 sp_ 为
214 SQL Server 数 据 库 应 用 技 术 前 缀, 并 且 系 统 存 储 过 程 主 要 是 从 系 统 表 中 获 取 信 息, 从 而 为 系 统 管 理 员 管 理 SQ L Server 提 供 支 持 通 过 系 统 存 储 过 程,SQ L Server 中 的 许 多 管 理 性 或 信 息 性 的 活 动 ( 如 了 解 数 据 库 对 象 数 据 库 信 息 ) 都 可 以 被 顺 利 有 效 地 完 成 尽 管 这 些 系 统 存 储 过 程 被 放 在 master 数 据 库 中, 但 是 仍 可 以 在 其 他 数 据 库 中 对 其 进 行 调 用, 在 调 用 时 不 必 在 存 储 过 程 名 前 加 上 数 据 库 名 而 且 当 创 建 一 个 新 数 据 库 时, 一 些 系 统 存 储 过 程 会 在 新 数 据 库 中 被 自 动 创 建 系 统 存 储 过 程 所 能 完 成 的 操 作 多 达 千 百 项 例 如, 提 供 帮 助 的 系 统 存 储 过 程 有 : sp_ helpsql 显 示 关 于 SQ L 语 句 存 储 过 程 和 其 他 主 题 的 信 息 ;sp_help 提 供 关 于 存 储 过 程 或 其 他 数 据 库 对 象 的 报 告 ;sp_helptext 显 示 存 储 过 程 和 其 他 对 象 的 文 本 ;sp_depends 列 举 引 用 或 依 赖 指 定 对 象 的 所 有 存 储 过 程 事 实 上 在 前 面 的 学 习 中 就 已 使 用 过 不 少 系 统 存 储 过 程, 例 如,sp_tables 取 得 数 据 库 中 关 于 表 和 视 图 的 相 关 信 息 ;sp_renamedb 更 改 数 据 库 的 名 称 等 SQ L Server 系 统 存 储 过 程 是 为 用 户 提 供 方 便 的, 它 们 使 用 户 可 以 很 容 易 地 从 系 统 表 提 取 信 息 管 理 数 据 库, 并 执 行 涉 及 更 新 系 统 表 的 其 他 任 务 系 统 存 储 过 程 在 安 装 过 程 中 在 master 数 据 库 中 创 建, 由 系 统 管 理 员 拥 有 所 有 系 统 存 储 过 程 的 名 字 均 以 sp_ 开 始 如 果 过 程 以 sp_ 开 始, 又 在 当 前 数 据 库 中 找 不 到,SQ L Server 就 在 master 数 据 库 中 寻 找 以 sp_ 前 缀 命 名 的 存 储 过 程 中 引 用 的 表 如 果 不 能 在 当 前 数 据 库 中 解 析 出 来, 将 在 master 数 据 库 查 找 当 系 统 存 储 过 程 的 参 数 是 保 留 字 或 对 象 名, 且 对 象 名 由 数 据 库 或 拥 有 者 名 字 限 定 时 整 个 名 字 必 须 包 含 在 单 引 号 中 一 个 用 户 可 以 在 所 有 数 据 库 中 执 行 一 个 系 统 存 储 过 程 的 许 可 权, 否 则 在 任 何 数 据 库 中 都 不 能 执 行 该 系 统 存 储 过 程 2. 本 地 存 储 过 程 本 地 存 储 过 程 (Local Stored Procedures) 也 就 是 用 户 自 行 创 建 并 存 储 在 用 户 数 据 库 中 的 存 储 过 程 事 实 上 一 般 所 说 的 存 储 过 程 指 的 就 是 本 地 存 储 过 程 用 户 创 建 的 存 储 过 程 是 由 用 户 创 建 并 能 完 成 某 一 特 定 功 能 ( 如 查 询 用 户 所 需 数 据 信 息 ) 的 存 储 过 程 3. 临 时 存 储 过 程 临 时 存 储 过 程 ( Temporary Stored Procedures) 可 分 为 下 列 两 种 : (1) 本 地 临 时 存 储 过 程 不 论 哪 一 个 数 据 库 是 当 前 数 据 库, 如 果 在 创 建 存 储 过 程 时, 以 井 字 号 ( # ) 作 为 其 名 称 的 第 一 个 字 符, 则 该 存 储 过 程 将 成 为 一 个 存 放 在 tempdb 中 的 本 地 临 时 存 储 过 程 ( 例 如 : CREA T E PROCEDU RE # stud_proc ) 本 地 临 时 存 储 过 程 只 有 创 建 它 并 连 接 的 用 户 能 够 执 行 它, 而 且 一 旦 这 位 用 户 断 开 与 SQ L Server 的 连 接 ( 也 就 是 注 销 SQ L Server), 本 地 临 时 存 储 过 程 会 自 动 删 除, 当 然, 这 位 用 户 也 可 以 在 连 接 期 间 用 DROP PROCEDURE 命 令 删 除 他 所 创 建 的 本 地 临 时 存 储 过 程 由 于 本 地 临 时 存 储 过 程 的 适 用 范 围 仅 限 于 创 建 它 的 连 接, 因 此 不 需 担 心 其 名 称 会 和
第 9 章 存 储 过 程 与 触 发 器 215 其 他 连 接 所 采 用 的 名 称 相 同 (2) 全 局 临 时 存 储 过 程 不 论 哪 一 个 数 据 库 是 当 前 数 据 库, 只 要 所 创 建 的 存 储 过 程 名 称 是 以 两 个 井 字 号 ( # # ) 开 始, 则 该 存 储 过 程 将 成 为 一 个 存 放 在 tempdb 中 的 全 局 临 时 存 储 过 程 ( 例 如 : CREA T E PROCEDU RE # # stud_proc ) 全 局 临 时 存 储 过 程 一 旦 创 建, 以 后 连 接 到 SQ L Server 的 任 何 用 户 都 能 够 执 行 它, 而 且 不 需 要 特 定 的 权 限 当 创 建 全 局 临 时 存 储 过 程 的 用 户 断 开 与 SQ L Sewer 的 连 接,SQ L Server 将 检 查 是 否 有 其 他 用 户 正 在 执 行 该 全 局 临 时 存 储 过 程, 如 果 没 有, 便 立 即 将 全 局 临 时 存 储 过 程 删 除 ; 如 果 有,SQ L Server 会 让 这 些 正 在 执 行 中 的 操 作 继 续 进 行, 但 是 不 允 许 任 何 用 户 再 执 行 全 局 临 时 存 储 过 程, 等 到 所 有 未 完 成 的 操 作 执 行 完 毕 后, 全 局 临 时 存 储 过 程 会 自 动 删 除 由 于 全 局 临 时 存 储 过 程 能 够 被 所 有 的 连 接 使 用, 因 此 必 须 注 意 其 名 称 不 能 和 其 他 连 接 所 采 用 的 名 称 相 同 不 论 创 建 的 是 本 地 临 时 存 储 过 程 还 是 全 局 临 时 存 储 过 程, 只 要 SQ L Server 一 停 止 运 行, 它 们 将 不 复 存 在 4. 远 程 存 储 过 程 在 SQ L Server 中, 远 程 存 储 过 程 (Remote Stored Procedures) 位 于 远 程 服 务 器 上 的 存 储 过 程, 通 常 可 以 使 用 分 布 式 查 询 和 EXECU T E 命 令 执 行 一 个 远 程 存 储 过 程 5. 扩 展 存 储 过 程 扩 展 存 储 过 程 (Extended Stored Procedures) 是 用 户 可 以 使 用 外 部 程 序 语 言 编 写 的 存 储 过 程 显 而 易 见, 通 过 扩 展 存 储 过 程 可 以 弥 补 SQ L Server 的 不 足 之 处, 并 按 需 要 自 行 大 幅 扩 展 其 功 能 扩 展 存 储 过 程 在 使 用 和 执 行 上 与 一 般 的 存 储 过 程 完 全 相 同 可 以 将 参 数 传 递 给 扩 展 存 储 过 程, 扩 展 存 储 过 程 也 能 够 返 回 结 果 和 状 态 值 为 了 区 别, 扩 展 存 储 过 程 的 名 称 通 常 以 xp_ 开 头 扩 展 存 储 过 程 是 以 动 态 链 接 库 (DLLs) 的 形 式 存 在, 能 让 SQ L Server 动 态 装 载 和 执 行 扩 展 存 储 过 程 一 定 要 存 放 在 系 统 数 据 库 master 中 9.1.3 存 储 过 程 的 好 处 1. 允 许 模 块 化 的 程 序 设 计 存 储 过 程 一 旦 创 建 完 成 并 存 储 于 数 据 库 中, 即 可 在 应 用 程 序 中 反 复 调 用, 因 此 利 用 存 储 过 程 完 成 某 些 例 行 操 作 是 最 恰 当 不 过 了 一 般 来 说, 要 将 存 储 过 程 的 创 建 和 维 护 操 作 交 由 专 人 负 责, 由 于 各 个 用 于 完 成 特 定 操 作 的 存 储 过 程 均 独 立 放 置, 因 此 根 本 不 需 担 心 当 修 改 存 储 过 程 时 会 影 响 到 应 用 程 序 的 程 序 代 码 此 外, 通 过 在 存 储 过 程 中 编 写 业 务 逻 辑 和 策 略, 不 仅 可 以 让 不 同 的 应 用 程 序 共 享, 同 时 可 要 求 所 有 的 客 户 端 使 用 相 同 的 存 储 过 程 从 而 达 到 数 据 访 问 和 更 新 的 一 致 性 2. 更 快 的 执 行 速 度 当 执 行 批 处 理 和 T ransact 唱 SQ L 程 序 代 码 时,SQ L Server 必 须 先 检 查 语 法 是 否 正 确
216 SQL Server 数 据 库 应 用 技 术 接 着 进 行 编 译 优 化 然 后 再 执 行 它, 因 此 如 果 所 要 执 行 的 T ransact 唱 SQ L 程 序 代 码 非 常 庞 大, 执 行 前 的 处 理 过 程 将 会 耗 费 一 些 时 间 对 存 储 过 程 而 言, 当 它 们 创 建 时 就 已 经 检 查 过 语 法 的 正 确 性 编 译 并 加 以 优 化, 因 此 当 执 行 存 储 过 程 时, 可 以 立 即 直 接 执 行, 自 然 速 度 会 比 较 快 顾 名 思 义, 存 储 过 程 就 是 预 先 编 译 和 优 化 并 存 储 于 数 据 库 中 的 过 程 更 重 要 的 是, 存 储 过 程 在 它 第 一 次 执 行 后 会 在 内 存 中 保 留, 因 此 以 后 的 调 用 并 不 需 再 将 存 储 过 程 从 磁 盘 中 装 载 然 而 如 果 从 客 户 端 传 送 T ransact 唱 SQ L 语 句 到 后 端 的 SQ L Server 执 行, 则 每 次 执 行 时 都 必 须 重 新 编 译 和 优 化, 速 度 当 然 比 较 慢 3. 有 效 降 低 网 络 流 量 假 设 某 一 项 操 作 需 要 数 百 行 的 T ransact 唱 SQ L 程 序 代 码 完 成, 如 果 从 客 户 端 将 这 数 百 行 的 T ransact 唱 SQ L 程 序 代 码 传 送 到 后 端 的 SQ L Server 执 行, 则 在 网 络 上 传 输 的 将 是 程 序 代 码 的 数 千 或 数 万 个 字 符 ; 但 是 如 果 事 先 将 这 数 百 行 的 T ransact 唱 SQ L 程 序 代 码 编 写 成 一 个 存 储 在 SQ L Server 数 据 库 中 的 存 储 过 程, 则 只 需 从 客 户 端 调 用 该 存 储 过 程 的 名 称 即 可 执 行 它, 此 时 在 网 络 上 传 输 的 仅 仅 是 存 储 过 程 名 称 的 几 个 字 符 显 而 易 见, 使 用 存 储 过 程 所 造 成 的 网 络 流 量 比 较 小, 因 此 使 用 存 储 过 程 较 好 4. 较 好 的 安 全 机 制 对 于 存 储 过 程 可 以 设 置 哪 些 用 户 有 权 执 行 它, 这 样, 就 可 达 到 较 完 善 的 安 全 控 制 和 管 理 例 如 : 不 希 望 某 一 位 用 户 有 权 直 接 访 问 某 个 表, 但 是 又 必 须 要 求 他 针 对 该 表 执 行 特 定 的 操 作 这 时 可 以 将 该 位 用 户 所 能 针 对 表 执 行 的 操 作 编 写 成 一 个 存 储 过 程, 并 赋 予 他 执 行 该 存 储 过 程 的 权 限, 如 此 一 来, 虽 然 这 位 用 户 没 有 权 直 接 访 问 表, 仍 然 能 通 过 执 行 存 储 过 程 来 完 成 所 需 的 操 作 9.2 创 建 和 执 行 存 储 过 程 在 SQ L Server 中 创 建 一 个 存 储 过 程 有 两 种 方 法 : 一 种 是 使 用 T ransact 唱 SQ L 命 令 CREA T E PROCEDU RE, 另 一 种 是 使 用 企 业 管 理 器 用 T ransact 唱 SQ L 创 建 存 储 过 程 是 一 种 较 为 快 速 的 方 法, 但 对 于 初 学 者, 使 用 企 业 管 理 器 更 易 理 解, 更 为 简 单 9.2.1 创 建 和 执 行 不 带 参 数 的 存 储 过 程 1. 使 用 企 业 管 理 器 创 建 存 储 过 程 (1) 启 动 企 业 管 理 器, 登 录 到 要 使 用 的 服 务 器 (2) 在 企 业 管 理 器 的 左 窗 格 中, 展 开 要 创 建 存 储 过 程 的 数 据 库 文 件 夹, 单 击 存 储 过 程 文 件 夹, 此 时 在 右 窗 格 中 显 示 该 数 据 库 的 所 有 存 储 过 程 (3) 右 击 存 储 过 程 文 件 夹, 在 弹 出 的 快 捷 菜 单 中 选 择 新 建 存 储 过 程, 此 时 打 开 新 建 存 储 过 程 对 话 框 (4) 在 文 本 编 辑 框 中 输 入 存 储 过 程 的 正 文 内 容 (5) 单 击 检 查 语 法 按 钮, 检 查 语 法 是 否 正 确 (6) 单 击 确 定 按 钮 保 存
第 9 章 存 储 过 程 与 触 发 器 217 (7) 在 右 窗 格 中, 右 击 该 存 储 过 程, 在 弹 出 菜 单 中 选 择 所 有 任 务, 选 择 管 理 权 限 设 置 权 限 2. 使 用 SQL 命 令 创 建 存 储 过 程 创 建 不 带 参 数 的 存 储 过 程 的 命 令 格 式 : CREATE PROC[EDURE]procedure_name AS sql_statements 其 中 : procedure_name 指 明 所 创 建 的 存 储 过 程 的 名 字,sql_statements 为 在 存 储 过 程 中 需 要 执 行 的 数 据 库 操 作 例 9.1 针 对 教 师 基 本 信 息 表 teacher_info, 创 建 一 个 名 称 为 teacher_proc1 的 存 储 过 程, 该 存 储 过 程 的 功 能 是 从 数 据 表 teacher_info 中 查 询 所 有 男 教 师 的 信 息 USE student GO CREATE PROCEDURE teacher_proc1 AS SELECT 倡 FROM teacher_info WHERE gender = 男 GO 用 户 可 以 通 过 企 业 管 理 器, 查 看 所 创 建 的 存 储 过 程 在 企 业 管 理 器 中, 展 开 库 student, 双 击 存 储 过 程, 在 窗 口 右 侧 区 域 显 示 的 存 储 过 程 列 表 中, 用 户 可 到 teacher_ proc1 存 储 过 程 欲 要 执 行 已 创 建 的 存 储 过 程, 可 以 使 用 EXECU T E 命 令 执 行 存 储 过 程 的 命 令 格 式 : [EXEC[UTE]] [ @ return_status = ]{procedure_name @ procedure_name_var} [[ @ parameter = ]{value @ variable [OUTPUT] [DEFAULT]} [,...n]][with RECOMPILE] 其 中, 各 个 参 数 意 义 如 下 : 1 @ return_status 是 一 个 可 选 的 整 型 变 量, 保 存 存 储 过 程 的 返 回 状 态 2 procedure_name 是 拟 调 用 的 存 储 过 程 名 称,@ procedure_name_var 是 局 部 定 义 变 量 名, 代 表 存 储 过 程 名 称 3 @ parameter 是 过 程 参 数, 在 CREA T E PROCEDURE 语 句 中 定 义 4 value 是 过 程 中 参 数 的 值,@ variable 是 用 来 保 存 参 数 或 者 返 回 参 数 的 变 量 5 O U T P U T 指 定 存 储 过 程 必 须 返 回 一 个 参 数,DEFA U L T 根 据 过 程 的 定 义, 提 供 参 数 的 默 认 值 6 n 表 示 可 以 指 定 一 个 或 者 多 个 @ parameter value 或 @ variable 7 WIT H RECO M PILE 强 制 编 译 存 储 过 程 例 9.2 在 查 询 分 析 器 中 编 写 SQ L 命 令, 执 行 数 据 库 student 中 的 存 储 过 程 teacher_proc1
218 SQL Server 数 据 库 应 用 技 术 USE student GO EXECU TE teacher_proc1 GO 在 查 询 分 析 器 的 查 询 窗 口 中 运 行 上 面 的 命 令, 在 结 果 窗 口 中 将 返 回 教 师 信 息 表 teacher_info 中 的 所 有 男 教 师 的 信 息 可 以 看 出 其 结 果 符 合 存 储 过 程 中 定 义 的 SQ L 语 句 3. 创 建 存 储 过 程 的 步 骤 及 注 意 事 项 在 创 建 存 储 过 程 中, 用 户 需 要 考 虑 一 些 列 准 则 (1) 不 能 将 CREA T E PROCEDU RE 语 句 与 其 他 SQ L 语 句 组 合 到 单 个 批 处 理 中, 每 一 个 批 处 理 就 是 一 个 GO 语 句 段 因 为 CREA TE PROCEDU RE 命 令 和 U SE 命 令 位 于 同 一 个 批 处 理 之 中, 下 列 程 序 必 须 如 下 写 才 能 顺 利 执 行 USE student GO CREATE PROCEDURE stud_proc1 AS SELECT 倡 FROM stud_info 在 AS 子 句 之 后 且 在 下 一 个 批 处 理 之 前 的 语 句 将 被 视 为 是 存 储 过 程 所 要 包 含 的 程 序 代 码 例 如, 假 设 要 一 次 创 建 两 个 存 储 过 程, 下 面 的 写 法 将 是 错 误 的 : CREATE PROCEDURE stud_proc1 AS SELECT stud_id,name,birthday,gender FROM stud_info GO CREATE PROCEDURE stud_proc2 AS SELECT stud_id,name, address, telcode FROM stud_info (2) 创 建 存 储 过 程 是 有 权 限 的, 其 默 认 权 限 属 于 数 据 库 所 有 者, 其 他 用 户 如 果 希 望 获 得 创 建 存 储 过 程 的 权 限, 必 须 通 过 数 据 库 所 有 者 授 权, 值 得 注 意 的 是, 应 尽 量 避 免 存 储 过 程 的 使 用 者 和 所 涉 及 表 的 所 有 者 不 是 同 一 个 人 的 情 况 (3) 由 于 存 储 过 程 是 一 个 数 据 库 对 象, 其 名 称 必 须 遵 守 标 识 符 规 则, 在 命 名 用 户 自 定 义 的 存 储 过 程 时 应 避 免 使 用 sp_ 前 缀, 以 免 和 系 统 存 储 过 程 混 淆 (4) 尽 量 不 要 使 用 临 时 存 储 过 程, 以 避 免 tempdb 上 造 成 的 对 系 统 表 资 源 的 争 夺, 从 而 导 致 影 响 系 统 的 执 行 性 能 (5) 只 能 在 当 前 数 据 库 中 创 建 属 于 当 前 数 据 库 的 存 储 过 程 根 据 可 使 用 的 内 存, 存 储 过 程 的 最 大 尺 寸 被 限 制 为 128MB, 存 储 过 程 还 可 以 嵌 套, 最 多 嵌 套 至 32 级
第 9 章 存 储 过 程 与 触 发 器 219 9.2.2 创 建 和 执 行 带 参 数 的 存 储 过 程 由 于 不 带 参 数 的 存 储 过 程 的 创 建 非 常 简 单, 所 以 采 用 直 接 创 建 的 办 法 但 是, 对 于 创 建 比 较 复 杂 的 存 储 过 程, 当 存 储 过 程 时, 需 要 确 定 存 储 过 程 的 三 个 组 成 部 分 : (1) 所 有 的 输 入 参 数 以 及 传 给 调 用 者 的 输 出 参 数 ; (2) 被 执 行 的 针 对 数 据 库 的 操 作 语 句 包 括 调 用 其 他 存 储 过 程 的 语 句 ; (3) 返 回 给 调 用 者 的 状 态 值 以 指 明 调 用 是 成 功 还 是 失 败 建 议 按 照 如 下 四 个 步 骤 创 建 存 储 过 程 (1) 编 写 T ransact 唱 SQ L 语 句 例 如 例 9.2 中 的 SQL 语 句 SELECT 倡 FROM teacher_info WHERE gender = 男 (2) 测 试 T ransact 唱 SQ L 语 句 执 行 编 写 的 SQ L 语 句, 确 认 结 果 符 合 要 求 (3) 如 果 返 回 结 果 符 合 要 求, 则 按 照 存 储 过 程 的 语 法 创 建 其 存 储 过 程 (4) 在 服 务 器 上 执 行 存 储 过 程, 以 验 证 该 存 储 过 程 的 正 确 性 可 以 将 数 据 值 传 递 给 存 储 过 程, 而 存 储 过 程 用 来 接 收 传 递 进 来 数 据 值 的 参 数 就 是 所 谓 的 输 入 参 数 (Input Parameters) 创 建 带 参 数 的 存 储 过 程 的 命 令 格 式 : CREATE PROC[EDURE] procedure_name [{ @ parameter data_type} [ = DEFAULT][OUTPUT]][,...n] [WITH{RECOMPILE ENCRYPTION RECOMPILE,ENCRYPTION}] AS sql_ statements 其 中 : 1 procedure_name 为 所 创 建 的 存 储 过 程 的 名 字 2 @ parameter 用 来 指 定 输 入 和 输 出 参 数 的 名 称, 参 数 的 名 称 是 以 字 符 @ 开 始, 而 且 其 名 称 必 须 符 合 SQ L Server 的 命 名 规 则 data_type 用 来 指 定 输 入 参 数 的 数 据 类 型 输 入 参 数 可 以 是 任 何 的 数 据 类 型 ( 包 括 text ntext image 和 用 户 定 义 数 据 类 型 ) 当 然, 输 入 参 数 的 数 据 类 型 也 就 决 定 了 这 一 输 入 参 数 所 能 接 收 数 据 值 的 类 型 和 范 围 例 如, 输 入 参 数 的 数 据 类 型 是 smallint, 则 它 只 能 接 收 - 32768 ~ 32767 之 间 的 整 数 值, 将 不 符 合 此 条 件 的 数 据 值 传 递 给 它 都 会 发 生 错 误 DEFA U L T 用 来 指 定 输 入 参 数 的 默 认 值, 它 是 一 个 常 量 或 N U L L 在 创 建 存 储 过 程 时 如 果 给 出 了 默 认 值, 那 么 在 执 行 该 存 储 过 程 时, 如 果 没 有 向 具 有 默 认 值 的 参 数 传 递 参 数 值, 则 具 有 默 认 值 的 参 数 就 可 以 使 用 它 们 的 默 认 值 O U T P U T 表 明 参 数 是 返 回 参 数 3 WIT H RECO M PILE 决 定 执 行 计 划 不 保 存 在 过 程 高 速 缓 存 中, 每 次 执 行 时 都 重 新 编 译 它 WIT H ENCRYPTION 对 含 有 CREATE PROCEDURE 正 文 的 syscomments 项 进 行 加 密 4 sql_statements : 在 存 储 过 程 中 需 要 执 行 的 数 据 库 操 作 1. 具 有 输 入 参 数 的 存 储 过 程 例 9.3 针 对 教 师 基 本 信 息 表 teacher_info, 创 建 一 个 名 称 为 teacher_proc2 的 存 储 过 程, 执 行 存 储 过 程 将 完 成 向 数 据 表 teacher_info 中 插 入 一 条 记 录, 新 记 录 的 值 由 参 数 提 供
220 SQL Server 数 据 库 应 用 技 术 USE student GO CREATE PROCEDURE teacher_proc2 ( @ no char(6), @ nam varchar(8), @ sex char(2), @ age int, @ title char(10), @ tel varchar(12), @ sala decimal(7), @ num char(10)) AS INSERT INTO teacher _ info VALUES ( @ no, @ nam, @ sex, @ age, @ title, @ tel, @ sala, @ num) GO 执 行 带 有 输 入 参 数 的 存 储 过 程 有 两 种 方 法 : 一 是 使 用 参 数 名 传 送 参 数 值, 二 是 按 位 置 传 送 参 数 值 (1) 使 用 参 数 名 传 送 参 数 值 在 执 行 存 储 过 程 的 语 句 中, 通 过 语 句 @ parameter_name = value 给 出 参 数 的 传 递 值 当 存 储 过 程 含 有 多 个 输 入 参 数 时, 参 数 值 可 以 以 任 意 顺 序 指 定, 对 于 允 许 空 值 和 具 有 默 认 值 的 输 入 参 数 可 以 不 给 出 参 数 的 传 递 值 语 法 命 令 如 下 : [EXEC[UTE]] procedure_name [ @ parameter_name = value][,...n] 其 中 各 参 数 的 意 义 为 : procedure_name 为 存 储 过 程 名 ;@ parameter_name 为 输 入 参 数 名 ;value 为 传 递 给 输 入 参 数 的 值 例 9.4 使 用 参 数 名 传 送 参 数 值 的 方 法 来 执 行 存 储 过 程 teacher_proc2, 完 成 向 数 据 表 teacher_info 中 插 入 一 条 记 录 USE student GO EXECU TE teacher_proc2 @ no = 010108, @ nam = 李 铁 烙, @ sex = 男, @ age = 49,@ title = 高 讲, @ tel = 02034301299, @ sala = 250.0, @ num = 0401010207 为 了 说 明 使 用 参 数 名 传 递 参 数 值 时 可 以 以 任 意 顺 序 指 定 参 数 值, 将 两 个 参 数 的 次 序 进 行 了 颠 倒, 此 外 由 于 目 的 地 的 查 询 值 与 该 参 数 的 默 认 值 一 致, 所 以 也 没 有 对 该 输 入 参 数 的 参 数 值 进 行 指 定 (2) 按 位 置 传 送 参 数 值 在 执 行 存 储 过 程 的 语 句 中, 不 参 照 被 传 递 的 参 数 而 直 接 给 出 参 数 的 传 递 值 当 存 储 过 程 含 有 多 个 输 入 参 数 时, 传 递 值 的 顺 序 必 须 与 存 储 过 程 中 定 义 的 输 入 参 数 的 顺 序 相 一 致 语 法 命 令 如 下 : [EXEC[UTE]] proc_name [value1,value2,...] 其 中 各 参 数 的 意 义 为 : proc_name 为 存 储 过 程 名 ;value1,value2,... 为 传 递 给 各 输
第 9 章 存 储 过 程 与 触 发 器 221 入 参 数 的 值 按 位 置 传 送 参 数 值 时, 也 可 以 忽 略 允 许 空 值 和 具 有 默 认 值 的 参 数, 但 是 不 能 因 此 破 坏 输 入 参 数 的 指 定 次 序 因 此, 在 一 个 含 有 四 个 输 入 参 数 的 存 储 过 程 中, 用 户 可 以 忽 略 第 三 和 第 四 个 参 数, 但 无 法 在 忽 略 第 三 个 参 数 的 情 况 下 而 指 定 第 四 个 参 数 的 输 入 值 例 9.5 使 用 按 位 置 传 送 参 数 值 的 方 法 来 执 行 teacher_proc2 存 储 过 程, 实 现 向 数 据 表 teacher_info 中 插 入 一 条 记 录 具 体 命 令 如 下 : USE student GO EXEC teacher_proc2 010109, 李 烙 铁, 女,48, 讲 师, 02034367719,250.0, 0401010108 这 里 由 于 使 用 的 是 按 位 置 传 送 参 数 值 的 方 法, 所 以 不 可 以 将 参 数 的 次 序 进 行 颠 倒 此 外 由 于 目 的 地 的 查 询 值 与 该 参 数 的 默 认 值 一 致, 也 可 以 不 对 该 输 入 参 数 的 参 数 值 进 行 指 定 2. 具 有 默 认 值 的 存 储 过 程 例 9.6 针 对 教 师 基 本 信 息 表 teacher_info, 创 建 一 个 名 称 为 teacher_proc3 的 存 储 过 程, 执 行 存 储 过 程 时 将 向 数 据 表 teacher_info 中 插 入 一 条 记 录, 新 记 录 的 值 由 参 数 提 供, 如 果 未 提 供 职 称 tech_title 的 值 时, 由 参 数 的 默 认 值 代 替 USE student GO CREATE PROCEDURE teacher_proc3 ( @ no char(6), @ nam varchar(8), @ sex char(2), @ age int, @ title char(10) = 无, @ tel varchar (12), @ sala decimal(7),@ num char(10)) AS INSERT INTO teacher_info VALUES( @ no,@ nam,@ sex,@ age,@ title,@ tel,@ sala,@ num) GO EXECU TE teacher_proc3 @ no = 010110, @ nam = 张 小 波, @ sex = 女, @ age = 18, @ tel = 02034361954, @ sala = 250.0, @ num = 0401010108 例 9.7 在 student 数 据 库 上 新 建 一 个 名 为 stud_proc1 的 存 储 过 程, 该 存 储 过 程 定 义 了 两 个 日 期 时 间 类 型 的 输 入 参 数 和 一 个 字 符 型 输 入 参 数, 返 回 所 有 出 生 日 期 在 两 个 输 入 日 期 之 间, 性 别 与 输 入 的 字 符 型 参 数 相 同 的 学 生 信 息, 其 中 字 符 型 输 入 参 数 指 定 的 默 认 值 为 女 具 体 命 令 如 下 : USE student GO CREATE PROC stud_proc1 @ startdate datetime,@ enddate datetime,@ sex char(2) = 女 AS IF ( @ startdate IS NULL or @ enddate IS NULL or @ sex IS NULL) BEGIN RAISERROR ( NULL value are invalid,5,5)
222 SQL Server 数 据 库 应 用 技 术 RET URN END SELECT 倡 FROM stud_info WHERE (birthday BETWEEN @ startdate AND @ enddate) AND gender = @ sex GO 上 述 代 码 中 用 到 了 RAISERROR 函 数, 该 函 数 返 回 用 户 定 义 的 错 误 信 息 并 设 系 统 标 志, 以 记 录 发 生 错 误 RAISERROR 函 数 语 法 结 构 如 下 : RAISERROR({msg_id msg_str}{,severity,state}[,argument[,...n]]) 其 中 : (1) msg_id 是 存 储 于 sysmessages 表 中 的 用 户 定 义 的 错 误 信 息 号 (2) msg_str 是 一 条 可 包 含 400 个 字 符 的 错 误 消 息, 其 格 式 与 C 语 言 中 使 用 的 PRIN T F 格 式 样 式 相 似 (3) severity 为 用 户 定 义 的 与 消 息 关 联 的 严 重 级 别 用 户 可 以 使 用 0 ~ 18 之 间 严 重 级 别 19 ~ 25 之 间 的 严 重 级 别 只 能 由 sysadmin 固 定 服 务 器 角 色 成 员 使 用 (4) state 是 从 1 ~ 127 的 任 意 整 数, 表 示 有 关 错 误 调 用 状 态 的 信 息 state 的 默 认 值 为 1 (5) argument 是 用 于 取 代 在 msg_ str 中 定 义 的 变 量 或 取 代 对 应 于 msg_id 的 消 息 参 数 3. 具 有 返 回 值 的 存 储 过 程 (1) 创 建 具 有 返 回 值 的 存 储 过 程 从 存 储 过 程 中 返 回 一 个 或 多 个 值, 可 以 通 过 在 创 建 存 储 过 程 的 语 句 中 定 义 输 出 参 数 来 实 现 为 了 使 用 输 出 参 数, 需 要 在 CREA TE PROCEDURE 语 句 中 指 定 O U T PU T 关 键 字 通 过 使 用 输 出 参 数, 任 何 由 于 执 行 了 存 储 过 程 的 参 数 变 化 都 可 以 保 留, 即 使 在 存 储 过 程 完 全 完 成 之 后 具 体 语 法 如 下 : @ parameter_name datatype[ = default] OUTPUT [,...n] 其 中 各 参 数 的 意 义 如 下 : 1 @ parameter_name 存 储 过 程 的 输 出 参 数 名, 必 须 以 符 号 @ 为 前 缀 存 储 过 程 通 过 该 参 数 返 回 结 果 2 datatype 指 明 输 出 参 数 的 数 据 类 型, 它 既 可 以 是 系 统 提 供 的 数 据 类 型, 也 可 以 是 用 户 自 定 义 的 数 据 类 型, 但 必 须 是 除 了 text 和 image 以 外 的 数 据 类 型 3 default 指 定 输 出 参 数 的 默 认 值, 如 果 执 行 存 储 过 程 时 未 对 输 出 参 数 进 行 赋 值, 则 存 储 过 程 在 返 回 输 出 参 数 的 变 量 值 时, 使 用 default 值 4 O U T P U T 关 键 字 指 明 参 数 为 输 出 参 数 输 出 参 数 必 须 位 于 所 有 输 入 参 数 说 明 之 后 例 9.8 在 student 数 据 库 上 新 建 一 名 为 stud_proc2 的 存 储 过 程, 其 功 能 是 输 入 两 个 日 期 型 数 据, 并 使 用 输 出 参 数 返 回 这 两 个 出 生 日 期 之 间 的 所 有 学 生 人 数
第 9 章 存 储 过 程 与 触 发 器 223 USE student GO CREATE PROCEDURE stud_proc2 @ startdate datetime,@ enddate datetime,@ recordcount int OU TPU T AS IF @ startdate IS NULL or @ enddate IS NULL BEGIN RAISERROR( NULL value are invalid,5,5) RET URN END SELECT 倡 FROM stud_info WHERE birthday BETWEEN @ startdate AND @ enddate SELECT @ recordcount = GO @ @ ROWCOUNT 其 中,@ @ ROWCO U N T 是 SQ L Server 用 来 返 回 受 上 一 语 句 影 响 的 行 数 的 系 统 变 量, 在 这 里 用 它 来 返 回 符 合 条 件 记 录 数 (2) 执 行 具 有 返 回 值 的 存 储 过 程 在 调 用 含 有 输 出 参 数 的 存 储 过 程 的 程 序 中, 为 了 接 收 存 储 过 程 的 返 回 值, 必 须 声 明 作 为 输 出 的 传 递 参 数, 即 在 EXECU T E 语 句 中 指 定 O U T PU T 关 键 字 在 执 行 存 储 过 程 时, 如 果 O U T PU T 关 键 字 被 忽 略, 存 储 过 程 仍 能 被 执 行, 只 是 不 返 回 值 命 令 语 法 格 式 为 : [EXECUTE] {[ @ return_status = ]{procedure_name @ procedure_name_var} } [[ @ parameter_name = ]{value @ variable[output]}][,...n] [WITH RECOMPILE] 其 中 各 参 数 的 意 义 如 下 : 1 procedure_name : 需 执 行 的 存 储 过 程 的 名 字 ; 2 [ @ parameter_name = ]{value @ variable} 为 输 入 参 数 传 递 值 ; 3 [ @ parameter _ name = ] @ variable O U T PU T 为 传 递 给 输 出 参 数 的 变 量, @ variable 用 来 存 放 返 回 参 数 的 值 O U T P U T 指 明 这 是 一 个 输 出 传 递 参 数, 与 响 应 的 存 储 过 程 中 的 输 出 参 数 相 匹 配 例 9.9 执 行 stud_proc2 存 储 过 程, 返 回 出 生 日 期 在 1986 年 1 月 1 日 与 1986 年 12 月 31 日 的 学 生 记 录 的 条 数 具 体 命 令 如 下 : USE student GO DECLARE @ recordnumber int / 倡 声 明 为 局 部 变 量, 用 来 存 放 输 出 参 数 的 值 倡 / EXEC stud_proc2 01/01/1986, 12/31/1986,@ recordnumber OU TPU T PRINT The order count is : + str( @ recordnumber)
224 SQL Server 数 据 库 应 用 技 术 在 上 述 命 令 中, 变 量 @ recordnumber 被 说 明 为 存 储 过 程 stud_proc2 中 的 输 出 参 数 @ recordcount 的 返 回 值 此 外, 为 了 接 收 存 储 过 程 的 返 回 值, 在 调 用 存 储 过 程 的 命 令 中, 必 须 声 明 作 为 输 出 的 传 递 参 数, 这 个 输 出 传 递 参 数 需 要 声 明 为 局 部 变 量, 用 来 存 放 参 数 的 值 4. 存 储 过 程 的 重 编 译 处 理 (1) 存 储 过 程 的 处 理 在 创 建 存 储 过 程 时,SQ L Server 需 要 对 存 储 过 程 中 的 语 句 进 行 语 法 检 查 如 果 存 储 过 程 定 义 中 存 在 语 法 错 误, 将 返 回 错 误, 并 且 将 不 能 创 建 该 存 储 过 程 如 果 语 法 正 确, 则 存 储 过 程 的 文 本 将 存 储 在 syscomments 系 统 表 中 首 次 执 行 存 储 过 程 时, 查 询 处 理 器 从 syscomments 系 统 表 中 读 取 该 存 储 过 程 的 文 本, 并 检 查 过 程 所 使 用 的 对 象 名 称 是 否 存 在, 这 一 过 程 称 为 延 迟 名 称 解 析 因 此 存 储 过 程 引 用 的 对 象 只 需 在 执 行 该 存 储 过 程 时 存 在, 而 不 需 要 在 创 建 该 存 储 过 程 时 就 存 在 在 解 析 阶 段,SQ L Server 还 将 执 行 数 据 类 型 检 查 和 变 量 兼 容 性 等 其 他 验 证 活 动 如 果 执 行 存 储 过 程 时 出 现 存 储 过 程 所 引 用 的 对 象 丢 失, 则 存 储 过 程 在 到 达 引 用 丢 失 对 象 的 语 句 时 将 停 止 执 行 并 将 返 回 错 误 信 息 如 果 存 储 过 程 顺 利 通 过 解 析 阶 段,SQ L Server 将 分 析 存 储 过 程 的 语 句, 并 创 建 一 个 执 行 计 划 在 分 析 完 存 储 过 程 中 的 这 些 因 素 表 中 的 数 据 量 ( 表 中 是 否 存 在 索 引 和 索 引 的 性 质, 以 及 数 据 在 索 引 列 中 的 分 布 ;W HERE 条 件 子 句 所 用 的 比 较 运 算 符 和 比 较 值 ; 是 否 存 在 连 接 以 及 U NION GRO U P BY 或 ORDER BY 关 键 字 ) 后, 将 执 行 计 划 置 于 内 存 中 优 化 内 存 的 执 行 计 划 将 用 来 执 行 该 查 询 执 行 计 划 将 驻 留 在 内 存 中, 直 到 重 新 启 动 SQ L Server 或 空 间 以 存 储 另 一 个 对 象 时 为 止 以 上 介 绍 的 分 析 存 储 过 程 和 创 建 执 行 计 划 的 过 程 统 称 为 编 译, 编 译 工 作 完 成 之 后, 系 统 就 可 以 开 始 执 行 这 个 存 储 过 程 了 在 执 行 存 储 过 程 时, 如 果 现 有 的 执 行 计 划 仍 在 内 存 中,SQ L Server 将 再 次 使 用 它 如 果 执 行 计 划 不 再 位 于 内 存 中, 则 创 建 新 的 执 行 计 划 (2) 存 储 过 程 的 重 编 译 处 理 SQ L Server 为 用 户 提 供 了 三 种 设 定 重 编 译 选 项 的 方 法, 分 别 介 绍 如 下 : 1 在 建 立 存 储 过 程 时 设 定 重 编 译 选 项 具 体 语 法 如 下 : CREATE PROCEDURE [WITH RECOMPILE] 通 过 在 创 建 时 设 定 重 编 译 选 项, 可 以 使 SQ L Server 在 每 次 执 行 时 对 存 储 过 程 进 行 重 编 译 处 理 例 9.10 创 建 一 个 按 照 性 别 统 计 人 数 的 存 储 过 程 stud_proc3, 输 入 性 别 的 值 后, 返 回 对 应 性 别 的 学 生 人 数, 但 需 保 证 其 在 每 次 被 执 行 时 都 被 重 编 译 处 理 具 体 命 令 如 下 :
第 9 章 存 储 过 程 与 触 发 器 225 USE student GO CREATE PROCEDURE stud_proc3 ( @ in_sex CHAR(2), @ out_num INT OU TPU T) WIT H RECOMPILE AS BEGIN IF @ in_sex = 男 SELECT @ out_num = count(gender) FROM stud_info WHERE gender = 男 ; ELSE SELECT @ out_num = count(gender) FROM stud_info WHERE gender = 女 END 执 行 所 定 义 的 存 储 过 程 为 : DECLARE @ man_num int EXEC stud_proc3 女, @ man_num OU TPUT SELECT @ man_num 2 在 执 行 存 储 过 程 时 设 定 重 编 译 选 项 EXECUTE procedure_name [ @ parameter_name = ] @ variable OUTPUT [WITH RECOMPILE] 通 过 在 执 行 存 储 过 程 的 EXECU T E 语 句 中 设 定 WI T H RECO M PILE 选 项, 可 以 让 SQ L Server 在 执 行 存 储 过 程 时 重 新 编 译 该 存 储 过 程 例 9.11 执 行 存 储 过 程 stud_proc3 时, 对 其 进 行 重 编 译 处 理 DECLARE @ man_num int EXEC stud_proc3 男, @ man_num OU TPUT WIT H RECOMPILE PRINT @ man_num 3 通 过 系 统 存 储 过 程 设 定 重 编 译 选 项 EXEC sp_recompile OBJECT 其 中,sp_recompile 为 用 于 重 编 译 存 储 过 程 的 系 统 存 储 过 程,OBJEC T 为 当 前 数 据 库 中 的 存 储 过 程 触 发 器 表 或 视 图 的 名 称 例 9.12 对 student 数 据 库 中 stud_info 表 上 的 所 有 存 储 过 程 或 触 发 器 进 行 重 编 译 处 理 EXEC sp_recompile stud_info
226 SQL Server 数 据 库 应 用 技 术 9.3 修 改 和 删 除 存 储 过 程 9.3.1 查 看 存 储 过 程 存 储 过 程 被 创 建 以 后, 它 的 名 字 存 储 在 系 统 表 sysobjects 中 ; 它 的 源 代 码 存 放 在 系 统 表 syscomments 中 我 们 既 可 以 通 过 企 业 管 理 器 查 看 存 储 过 程 的 源 代 码, 也 可 以 通 过 SQ L Server 提 供 的 系 统 存 储 过 程 来 查 看 用 户 创 建 的 存 储 过 程 信 息 1. 通 过 企 业 管 理 器 通 过 企 业 管 理 器 查 看 存 储 过 程 的 源 代 码 的 步 骤 是 : 启 动 企 业 管 理 器, 登 录 到 要 使 用 的 服 务 器 ; 在 企 业 管 理 器 的 左 窗 格 中, 展 开 存 储 过 程 所 对 应 的 数 据 库 文 件 夹, 单 击 存 储 过 程, 此 时 在 右 窗 格 中 显 示 该 数 据 库 的 所 有 存 储 过 程 ; 在 右 窗 格 中, 右 击 要 查 看 源 代 码 的 存 储 过 程, 在 弹 出 的 菜 单 中 选 择 属 性 选 项, 此 时 便 可 看 到 存 储 过 程 的 源 代 码 2. 使 用 系 统 存 储 过 程 使 用 系 统 存 储 过 程 的 查 看 存 储 过 程 源 代 码 的 命 令 是 : sp_helptext procedure_name 例 9.13 查 看 数 据 库 student 中 存 储 过 程 teacher_proc1 的 源 代 码 EXEC sp_helptext teacher_proc1 如 果 在 创 建 存 储 过 程 时 使 用 了 WIT H ENCRYP TION 选 项, 那 么 无 论 是 使 用 企 业 管 理 器, 还 是 系 统 存 储 过 程 sp_helptext 都 无 法 查 看 到 存 储 过 程 的 源 代 码 9.3.2 修 改 存 储 过 程 修 改 存 储 过 程 通 常 是 指 编 辑 它 的 参 数 和 T ransact 唱 SQ L 语 句 以 下 分 别 说 明 如 何 使 用 SQ L Server 企 业 管 理 器 和 A L T ER PROCEDURE 命 令 完 成 这 项 工 作 1. 使 用 企 业 管 理 器 使 用 企 业 管 理 器 请 按 下 列 步 骤 进 行 : (1) 右 击 需 要 修 改 的 存 储 过 程, 并 从 快 捷 菜 单 中 选 取 属 性 命 令 (2) 存 储 过 程 属 性 对 话 框 打 开 后, 就 可 以 在 文 本 编 辑 框 中 编 辑 存 储 过 程 的 参 数 和 Transact 唱 SQL 语 句 然 而, 不 能 改 变 CREATE PROCEDURE 语 句 中 的 存 储 过 程 名 称 如 果 觉 得 存 储 过 程 的 重 命 名 及 参 数 和 T ransact 唱 SQ L 语 句 的 编 辑 要 分 开 完 成 很 麻 烦, 可 以 直 接 删 除 存 储 过 程 后 再 重 新 创 建 符 合 要 求 的 存 储 过 程, 不 过 先 删 除 再 重 新 创 建 存 储 过 程 的 最 大 缺 点, 就 是 所 有 与 存 储 过 程 相 关 的 权 限 设 置 必 须 重 新 设 置 一 次 (3) 编 辑 了 存 储 过 程 的 参 数 和 T ransact 唱 SQ L 语 句 之 后, 请 单 击 检 查 语 法 按 钮 确 保 所 编 写 的 程 序 代 码 语 法 无 误 (4) 如 果 需 要 设 置 存 储 过 程 的 权 限, 请 单 击 权 限 按 钮 打 开 对 象 属 性 对 话 框, 就 可 以 进 行 权 限 的 设 置 (5) 单 击 确 定 按 钮, 完 成 存 储 过 程 的 参 数 和 T ransact 唱 SQ L 语 句 修 改 2. 使 用 ALTER PROCEDURE 命 令 具 体 语 法 如 下 :
第 9 章 存 储 过 程 与 触 发 器 227 ALTER PROC[EDURE] procedure_name [{ @ parameter data_type}[ = DEFAULT][OUTPUT]][,...n] [WITH{RECOMPILE ENCRYPTION RECOMPILE,ENCRYTION}] AS Sql_statement[,...n] 其 中, 各 参 数 的 意 义 如 下 : procedure_name 为 要 修 改 的 存 储 过 程 的 名 称 ;@ parameter 为 存 储 过 程 中 包 含 的 输 入 和 输 出 参 数 ;data_type 指 定 输 入 和 输 出 参 数 的 数 据 类 型 ;default 为 输 入 输 出 参 数 指 定 的 默 认 值, 必 须 为 一 个 常 量 ;WI T H RECO M PILE 为 存 储 过 程 指 定 重 编 译 选 项 ;WIT H ENCRYP TION 是 对 包 含 A L TER PROCEDURE 文 本 的 syscomments 表 中 的 项 进 行 加 密 例 9.14 修 改 存 储 过 程 teacher_proc1, 返 回 所 有 性 别 为 女 的 学 生 学 号 姓 名 地 址 电 话 等 基 本 信 息, 并 对 存 储 过 程 指 定 重 编 译 处 理 和 加 密 选 项 USE student GO ALTER PROCEDURE teacher_proc1 WIT H RECOMPILE, ENCRYPTION AS SELECT teacher_id,name,tech_title,telephone FROM teacher_info WHERE gender = 女 GO 注 意 : 修 改 具 有 任 何 选 项 ( 例 如 WI T H RECO M PILE ) 的 存 储 过 程 时, 必 须 在 A L T ER PROCEDU RE 语 句 中 包 括 该 选 项, 以 保 留 该 选 项 提 供 的 功 能 ;A L TER PROCEDURE 语 句 只 能 修 改 一 个 单 一 的 过 程 如 果 存 储 过 程 中 调 用 了 其 他 存 储 过 程, 嵌 套 的 存 储 过 程 将 不 受 影 响 值 得 说 明 的 是, 与 其 自 己 从 头 编 写 A L TER PROCEDU RE 命 令, 倒 不 如 使 用 SQ L 查 询 分 析 器 中 对 象 浏 览 器 的 编 辑 数 据 库 对 象 功 能 某 些 数 据 库 对 象 可 以 直 接 在 对 象 浏 览 器 中 编 辑, 不 过, 其 编 辑 方 法 是 产 生 相 对 应 的 A L T ER 语 句, 并 指 定 要 修 改 的 部 分, 然 后 再 执 行 A L T ER 语 句 完 成 所 需 的 修 改 例 如, 假 设 要 利 用 对 象 浏 览 器 产 生 A L TER PROCEDURE 命 令 以 便 修 改 数 据 库 student 中 的 存 储 过 程 stud_proc1, 则 请 按 下 列 步 骤 进 行 : 打 开 SQ L 查 询 分 析 器 ; 展 开 数 据 库 student, 展 开 存 储 过 程 项 目, 右 击 存 储 过 程 teacher_proc1, 并 从 快 捷 菜 单 中 选 取 编 辑 命 令, 此 时 立 即 在 编 辑 器 窗 格 中 出 现 修 改 存 储 过 程 的 A L T ER PROCEDU RE 命 令, 用 户 可 以 在 A L T ER PROCEDURE 命 令 中 对 其 指 定 部 分 进 行 修 改, 然 后 单 击 执 行 查 询 按 钮 完 成 所 需 的 修 改 3. 重 新 命 名 存 储 过 程 修 改 存 储 过 程 的 名 字 使 用 系 统 存 储 过 程 sp_rename, 其 命 令 格 式 为 : sp_rename old_procedure_name, new_procedure_name
228 SQL Server 数 据 库 应 用 技 术 例 9.15 将 存 储 过 程 teacher_proc1 修 改 为 teacher_info_proc1 sp_rename teacher_proc1, teacher_info_proc1 另 外, 通 过 企 业 管 理 器 也 可 修 改 存 储 过 程 的 名 字, 其 操 作 过 程 与 Window s 下 修 改 文 件 名 字 的 操 作 类 似 即 首 先 选 中 需 修 改 名 字 的 存 储 过 程, 然 后 右 击, 在 弹 出 菜 单 中 选 取 重 命 名 选 项, 最 后 输 入 新 存 储 过 程 的 名 字 9.3.3 删 除 存 储 过 程 1. 使 用 企 业 管 理 器 使 用 企 业 管 理 器 删 除 一 个 或 多 个 存 储 过 程, 请 先 将 它 们 选 取, 然 后 右 击 其 中 一 个 被 选 取 的 存 储 过 程, 并 从 快 捷 菜 单 中 选 取 删 除 命 令, 接 着 再 单 击 除 去 对 象 对 话 中 的 全 部 除 去 按 钮 2. 使 用 DROP PROCEDURE 语 句 删 除 存 储 过 程 使 用 DROP 命 令,DROP 命 令 可 将 一 个 或 多 个 存 储 过 程 或 者 存 储 过 程 组 从 当 前 数 据 库 中 删 除 具 体 语 法 如 下 : DROP PROC[EDURE] procedure_name[,...n] 其 中 各 参 数 的 意 义 与 修 改 存 储 过 程 命 令 中 参 数 的 意 义 相 同 例 9.16 将 存 储 过 程 teacher_info_proc1 从 数 据 库 中 删 除 DROP PROCEDURE teacher_info_proc1 9.4 触 发 器 的 创 建 和 管 理 9.4.1 触 发 器 概 述 1. 触 发 器 的 基 本 概 念 在 SQ L Server 数 据 库 系 统 中, 存 储 过 程 和 触 发 器 都 是 SQ L 语 句 和 流 程 控 制 语 句 的 集 合 就 本 质 而 言, 触 发 器 也 是 一 种 存 储 过 程, 一 种 在 基 表 被 修 改 时 自 动 执 行 的 内 嵌 过 程, 主 要 通 过 事 件 进 行 触 发 而 被 执 行 的, 而 存 储 过 程 可 以 通 过 存 储 过 程 名 字 而 被 直 接 调 用 当 对 某 一 表 进 行 诸 如 U PDA T E INSER T DELE T E 这 些 操 作 时,SQ L Server 就 会 自 动 执 行 触 发 器 所 定 义 的 SQ L 语 句 从 而 确 保 对 数 据 的 处 理 必 须 符 合 由 这 些 SQ L 语 句 所 定 义 的 规 则 触 发 器 的 主 要 作 用 就 是 其 能 够 实 现 由 主 键 和 外 键 所 不 能 保 证 的 复 杂 的 参 照 完 整 性 和 数 据 的 一 致 性 除 此 之 外, 触 发 器 还 有 其 他 许 多 不 同 的 功 能 2. 使 用 触 发 器 的 优 点 由 于 在 触 发 器 中 可 以 包 含 复 杂 的 处 理 逻 辑, 因 此 应 该 将 触 发 器 用 来 保 持 低 级 的 数 据 完 整 性, 而 不 是 返 回 大 量 的 查 询 结 果 使 用 触 发 器 主 要 可 以 实 现 以 下 操 作 : (1) 强 制 比 C HECK 约 束 更 复 杂 的 数 据 完 整 性 在 数 据 库 中 要 实 现 数 据 完 整 性 的 约 束, 可 以 使 用 C HECK 约 束 或 触 发 器 来 实 现 但
第 9 章 存 储 过 程 与 触 发 器 229 是 在 CHECK 约 束 中 不 允 许 引 用 其 他 表 中 的 列 来 完 成 检 查 工 作, 而 触 发 器 则 可 以 引 用 其 他 表 中 的 列 来 完 成 数 据 完 整 性 的 约 束 (2) 使 用 自 定 义 的 错 误 信 息 用 户 有 时 需 要 在 数 据 完 整 性 遭 到 破 坏 或 其 他 情 况 下, 发 出 预 先 自 定 义 好 的 错 误 信 息 或 动 态 自 定 义 的 错 误 信 息 通 过 使 用 触 发 器, 用 户 可 以 捕 获 破 坏 数 据 完 整 性 的 操 作, 并 返 回 自 定 义 的 错 误 信 息 (3) 实 现 数 据 库 中 多 张 表 的 级 联 修 改 用 户 可 以 通 过 触 发 器 对 数 据 库 中 的 相 关 表 进 行 级 联 修 改 例 如, 可 以 在 lesson_info 表 course_id 列 上 写 入 一 个 删 除 触 发 器, 以 使 其 他 表 中 的 各 匹 配 行 采 取 删 除 操 作 该 触 发 都 将 course_id 列 作 为 惟 一 键, 在 teacher_info stud_grade 及 teach_schedule 表 中 对 各 匹 配 行 进 行 定 位 删 除 (4) 比 较 数 据 库 修 改 前 后 数 据 的 状 态 触 发 器 提 供 了 访 问 由 INSER T U PDA T E 或 DELE T E 语 句 引 起 的 数 据 变 化 前 后 状 态 的 能 力 因 此 用 户 就 可 以 在 触 发 器 中 引 用 由 于 修 改 所 影 响 的 记 录 行 (5) 维 护 非 规 范 化 数 据 用 户 可 以 使 用 触 发 器 来 保 证 非 规 范 数 据 库 中 的 低 级 数 据 的 完 整 性 维 护 非 规 范 化 数 据 与 表 的 级 联 是 不 同 的 表 的 级 联 指 的 是 不 同 表 之 间 的 主 外 键 关 系, 维 护 表 的 级 联 可 以 通 过 设 置 表 的 主 键 与 外 键 的 关 系 来 实 现 而 非 规 范 数 据 通 常 是 指 在 表 中 的 派 生 的 冗 余 的 数 据 值, 维 护 非 规 范 化 数 据 应 该 通 过 使 用 触 发 器 来 实 现 9.4.2 触 发 器 的 创 建 1. 用 企 业 管 理 器 创 建 触 发 器 (1) 启 动 企 业 管 理 器, 登 录 到 要 使 用 的 服 务 器 (2) 在 企 业 管 理 器 的 左 窗 格 中, 展 开 要 创 建 触 发 器 的 数 据 库 文 件 夹, 单 击 表 文 件 夹, 此 时 在 右 窗 格 中 显 示 该 数 据 库 的 所 有 表 (3) 在 右 窗 格 中, 右 击 要 创 建 触 发 器 的 数 据 表, 在 弹 出 的 快 捷 菜 单 中, 将 鼠 标 指 向 所 有 任 务, 在 出 现 的 下 一 级 子 菜 单 中 选 择 管 理 触 发 器 菜 单 项, 此 时 会 出 现 触 发 器 属 性 对 话 框 (4) 在 名 称 下 拉 框 中 选 择 新 建, 在 文 本 编 辑 框 中 输 入 触 发 器 的 文 本 命 令 (5) 单 击 检 查 语 法 按 钮, 检 查 语 句 是 否 正 确 (6) 单 击 应 用 按 钮, 在 名 称 下 拉 列 框 中 会 有 新 创 建 的 触 发 器 名 字 (7) 单 击 确 定 按 钮, 关 闭 窗 口 创 建 成 功 2. 使 用 命 令 创 建 触 发 器 基 本 语 法 如 下 : CREATE TRIGGER trigge_name ON {table view} {FOR AFTER INSTEAD OF}{[INSERT],[UPDATE],[DELETE]} [WITH ENCRYPTION]
230 SQL Server 数 据 库 应 用 技 术 其 中 : 名 称 AS IF UPDATE(column_name) [{and or} UPDATE(column_name)...] sql_statesments 1 trigge_name 是 触 发 器 的 名 称, 用 户 可 以 选 择 是 否 指 定 触 发 器 所 有 者 名 称 2 table view 为 执 行 触 发 器 的 表 或 视 图, 可 以 选 择 是 否 指 定 表 或 视 图 的 所 有 者 3 AF T ER 在 对 表 的 相 关 操 作 正 常 操 作 后, 触 发 器 被 触 发 如 果 仅 指 定 FOR 关 键 字, 则 AF T ER 是 默 认 设 置 4 INS T EAD OF 指 定 执 行 触 发 器 而 不 是 执 行 触 发 语 句, 从 而 替 代 触 发 语 句 的 操 作 可 以 为 表 或 视 图 中 的 每 个 INSER T U PDA T E 或 DELE T E 语 句 定 义 一 个 INSTEAD OF 触 发 器 如 果 一 个 可 更 新 的 视 图 定 义 时, 使 用 了 WI T H CHECK OP TION 选 项 则 IN T EAD OF 触 发 器 不 允 许 在 这 个 视 图 上 定 义 用 户 必 须 用 A L T ER VIEW 删 除 选 项 后 才 能 定 义 INS T EAD OF 触 发 器 5 {[INSER T],[U PDA T E],[DELE TE]} 是 指 定 在 表 或 视 图 上 执 行 哪 些 数 据 修 改 语 句 时 激 活 触 发 器 的 关 键 字 这 其 中 必 须 至 少 指 定 一 个 选 项 在 触 发 器 定 义 中 允 许 使 用 以 任 意 顺 序 组 合 的 这 些 关 键 字 如 果 指 定 的 选 项 多 于 一 个, 需 用 逗 号 分 隔 这 些 选 项 对 于 INS T EAD OF 触 发 器, 不 允 许 在 具 有 ON DELE T E 级 联 操 作 引 用 关 系 的 表 上 使 用 DELE T E 选 项 同 样, 也 不 允 许 在 具 有 ON U PDA T E 级 联 操 作 引 用 关 系 的 表 上 使 用 U PDA T E 选 项 6 ENCRYP TION 是 加 密 含 有 CREA T E T RIGGER 语 句 正 文 文 本 的 syscommnents 项, 这 是 为 了 满 足 数 据 安 全 的 需 要 7 sql_statesments 定 义 触 发 器 被 触 发 后, 将 执 行 数 据 库 操 作 它 指 定 触 发 器 执 行 的 条 件 和 动 作 触 发 器 条 件 是 除 了 引 起 触 发 器 执 行 的 操 作 外 的 附 加 条 件 ; 触 发 器 动 作 是 指 当 用 户 执 行 激 发 触 发 器 的 某 种 操 作 并 满 足 触 发 器 的 附 加 条 件 时, 触 发 器 所 执 行 的 动 作 8 IF U PDA T E 指 定 对 表 内 某 列 做 增 加 或 修 改 内 容 时 触 发 才 起 作 用, 它 可 以 指 定 两 个 以 上 列, 列 名 前 可 以 不 要 加 上 表 名 IF 子 句 中 多 个 触 发 器 动 作 可 以 放 在 BEGIN 和 END 之 间 (1) INSER T 触 发 器 例 9.17 在 student 数 据 库 的 表 teacher_info 上 创 建 一 个 teacher_ trigger1 触 发 器, 当 执 行 INSER T 操 作, 该 触 发 器 被 触 发 ( 即 向 所 定 义 触 发 器 的 表 中 插 入 数 据 时 将 触 发 其 触 发 器 ) 具 体 命 令 如 下 : USE student GO CREATE TRIGGER teacher_trigger1 ON teacher_info FOR INSERT AS RAISERROR( unauthorized,10,1)
第 9 章 存 储 过 程 与 触 发 器 231 当 用 户 向 表 teacher_info 中 插 入 数 据 时 将 触 发 触 发 器, 但 是 数 据 仍 能 被 插 入 表 中, 如 向 表 中 加 入 如 下 记 录 内 容 : INSERT INTO teacher_info VALUES( 010111, 目 火 柴, 男, 55, 政 工 师, 02061230901,9999, 0401010100 ) 用 户 可 以 用 SELEC T 倡 FRO M teacher_info 语 句 查 看 一 下 表 的 内 容, 可 以 发 现 上 述 记 录 已 经 插 入 到 teacher_info 表 中 这 是 由 于 在 定 义 触 发 器 时, 指 定 的 是 FOR 选 项, 因 此 AF T ER 成 了 默 认 设 置 此 时 触 发 器 只 有 在 触 发 SQ L 语 句 INSER T 中 指 定 的 所 有 操 作 都 已 成 功 执 行 后 才 激 发 因 此 用 户 仍 能 将 数 据 插 入 teacher_info 表 中 有 没 有 什 么 办 法 能 实 现 触 发 器 被 执 行 的 同 时, 取 消 触 发 触 发 器 的 SQ L 语 句 的 操 作 呢? 这 就 需 要 使 用 INS T EAD OF 关 键 字 来 实 现 例 9.18 在 student 数 据 库 的 表 teacher_info 上 创 建 一 个 my_trigger2 触 发 器, 当 执 行 DELE T E 操 作 时 触 发 器 触 发, 且 要 求 触 发 触 发 器 的 DELE T E 语 句 在 执 行 后 被 取 消 具 体 命 令 如 下 : USE student GO CREATE TRIGGER teacher_trigger2 ON teacher_info INSTEAD OF DELETE AS RAISERROR( You Have No Right To Delete The Record,10,1) 在 表 teacher_info 中 删 除 上 例 中 新 增 的 记 录 运 行 如 下 命 令 : DELETE 倡 FROM teacher_info WHERE teacher_id = 010111 在 查 询 分 析 器 的 消 息 返 回 窗 口 中 将 出 现 报 错 信 息 用 户 此 时 再 用 SELEC T 语 句 查 看 一 下 表 的 内 容, 可 以 发 现 上 例 新 添 加 的 记 录 仍 然 保 留 在 teacher _info 表 中, 可 见 在 定 义 触 发 器 时 定 义 的 INS T EAD OF 选 项 取 消 了 触 发 teacher_trigger2 的 DELE T E 操 作, 所 以 该 记 录 未 被 删 除 (2) U PDA T E 触 发 器 在 带 有 U PDA TE 触 发 器 的 表 上 执 行 U PDA TE 语 句 时, 将 触 发 U PDA T E 触 发 器 使 用 U PDA T E 触 发 器 时, 用 户 可 以 通 过 定 义 IF U PDA T E (column name) 来 实 现 当 特 定 列 被 更 新 时 触 发 触 发 器, 而 不 管 更 新 影 响 的 是 表 中 的 一 行 或 是 多 行 如 果 用 户 需 要 实 现 多 个 特 定 列 中 的 任 意 一 列 被 更 新 时 触 发 触 发 器, 可 以 通 过 在 触 发 器 定 义 中 使 用 多 个 IF U PDA T E(column name) 语 句 来 实 现 例 9.19 在 数 据 库 student 的 表 teacher_info 上 建 立 一 个 名 为 teacher_trigger3 的 触 发 器, 该 触 发 器 将 被 操 作 U PDA TE 所 激 活, 该 触 发 器 将 不 允 许 用 户 修 改 表 的 name 列 ( 本 例 将 不 使 用 INS T EAD OF, 而 是 通 过 ROLLBACK T RA NSAC TION 子 句 恢 复 原 来 数 据 的 方 法, 来 实 现 字 段 不 被 修 改 ) 命 令 如 下 :
232 SQL Server 数 据 库 应 用 技 术 USE student GO CREATE TRIGGER teacher_trigger3 ON teacher_info FOR UPDATE AS IF UPDATE (name) BEGIN RAISERROR( Unauthorized!,10,1) ROLLBACK TRANSACTION END 建 好 触 发 器 后 试 着 执 行 U PDA T E 操 作 : USE student GO UPDATE teacher_info SET name = 目 活 才 WHERE teacher_id = 010111 运 行 结 果 显 示 : Unauthorized!, 说 明 操 作 无 法 进 行, 触 发 器 起 到 了 保 护 作 用 在 查 询 分 析 器 中 运 行 命 令 : USE student GO SELECT teacher_id, name FROM teacher_info WHERE name LIKE 目 % 查 询 结 果 中 可 以 发 现 上 述 更 新 操 作 并 不 能 实 现 对 表 中 name 列 的 更 新 但 是 U PDA T E 操 作 可 以 对 没 有 建 立 保 护 性 触 发 的 其 他 列 进 行 更 新, 而 不 会 激 发 触 发 器, 例 如 在 查 询 分 析 器 中 运 行 如 下 命 令 : USE student GO UPDATE teacher_info SET tech_title = 无 职 称 WHERE teacher_id = 010111 执 行 后 返 回 的 消 息 : 所 影 响 的 行 数 为 1 行, 检 索 表 teacher_info 可 以 看 到 职 称 列 的 内 容 确 实 被 更 新 了 通 过 如 下 的 命 令 对 teacher_info 建 立 如 下 查 询 : SELECT teacher_id, name, tech_title FROM teacher_info WHERE teacher_id = 010111
第 9 章 存 储 过 程 与 触 发 器 233 从 查 询 结 果 可 以 看 出,tech_title 的 内 容 确 实 被 更 新 了 (3) DELE T E 触 发 器 例 9.20 在 数 据 库 student 的 表 teacher_info 上 建 立 一 个 名 为 teacher_trigger4 的 DELE T E 触 发 器, 该 触 发 器 将 对 表 teacher_info 中 删 除 记 录 的 操 作 给 出 报 警, 并 取 消 当 前 的 删 除 操 作 USE student GO CREATE TRIGGER teacher_trigger4 ON teacher_info FOR DELETE AS BEGIN RAISERROR( Unauthorized!,10,1) ROLLBACK TRANSACTION END 9.4.3 管 理 触 发 器 1. 查 看 触 发 器 信 息 像 存 储 过 程 一 样, 触 发 器 在 创 建 后, 其 名 称 保 存 在 系 统 表 sysobjects 中, 并 把 创 建 的 源 代 码 保 存 在 系 统 表 syscomments 中 SQ L Server 为 用 户 提 供 多 种 查 看 触 发 器 信 息 的 方 法 (1) 使 用 系 统 存 储 过 程 系 统 存 储 过 程 sp_help sp_helptext 和 sp_depends 分 别 提 供 有 关 触 发 器 的 不 同 信 息 瞯 通 过 sp_help 系 统 存 储 过 程, 可 以 了 解 触 发 器 的 一 般 信 息 ( 名 字 属 性 类 型 创 建 时 间 ) 例 如, 输 入 sp_help stud_trigger 命 令 查 看 已 经 建 立 的 stud_trigger 触 发 器 信 息 瞯 通 过 sp_helptext 能 够 查 看 触 发 器 的 定 义 信 息 例 如 : 输 入 sp_helptext stud_ trigger 命 令 查 看 已 经 建 立 的 stud_trigger 触 发 器 的 定 义 文 本 瞯 通 过 sp_depends 能 够 查 看 指 定 触 发 器 所 引 用 的 表 或 指 定 的 表 涉 及 的 所 有 触 发 器 例 如 : 输 入 sp_depends stud_trigger 命 令 查 看 已 经 建 立 的 stud_trigger 触 发 器 所 涉 及 的 表, 输 入 sp_depends stud_info 命 令 查 看 指 定 的 表 stud_info 所 涉 及 的 触 发 器 注 意 : 用 户 必 须 在 当 前 数 据 库 中 查 看 触 发 器 的 信 息, 而 且 被 查 看 的 触 发 器 必 须 已 经 被 创 建 和 存 储 过 程 的 加 密 类 似, 用 户 也 可 以 在 创 建 触 发 器 时, 通 过 指 定 WIT H ENCRYP TION 来 对 触 发 器 的 定 义 文 本 信 息 进 行 加 密, 加 密 后 的 触 发 器 无 法 用 sp _ helptext 来 查 看 相 关 信 息 用 户 还 可 以 通 过 使 用 系 统 存 储 过 程 sp_helptrigger 来 查 看 某 张 特 定 表 上 存 在 的 触 发 器 的 某 些 相 关 信 息 具 体 命 令 的 语 法 如 下 :
234 SQL Server 数 据 库 应 用 技 术 EXEC sp_helptrigger table_name 例 9.21 使 用 系 统 存 储 过 程 sp_helptrigger 查 看 表 teacher_info 上 存 在 的 所 有 触 发 器 的 相 关 信 息 具 体 命 令 如 下 : USE student GO EXEC sp_helptrigger teacher_info GO 在 查 询 分 析 器 的 查 询 窗 口 中 运 行 上 面 的 命 令, 在 结 果 窗 口 中 将 返 回 在 表 teacher_ info 上 定 义 的 所 有 触 发 器 的 相 关 信 息 从 返 回 的 信 息 中, 用 户 可 以 了 解 到 触 发 器 的 名 称 所 有 者 以 及 触 发 条 件 的 相 关 信 息 (2) 使 用 系 统 表 用 户 还 可 以 通 过 查 询 系 统 表 sysobjects 得 到 触 发 器 的 相 关 信 息 例 9.22 使 用 系 统 表 sysobjects 查 看 数 据 库 student 上 存 在 的 所 有 触 发 器 的 相 关 信 息 具 体 命 令 如 下 : USE student GO SELECT name FROM sysobjects WHERE type = TR GO 在 查 询 分 析 器 的 查 询 窗 口 中 运 行 上 面 的 命 令, 在 结 果 窗 口 中 将 返 回 在 数 据 库 student 上 定 义 的 所 有 触 发 器 的 名 称 (3) 使 用 企 业 管 理 器 查 看 触 发 器 使 用 企 业 管 理 器 可 以 方 便 地 查 看 数 据 库 中 某 张 表 上 定 义 的 触 发 器 的 相 关 信 息 具 体 步 骤 为 : 打 开 企 业 管 理 器, 展 开 数 据 库, 如 student 中 的 表 选 项, 选 中 需 要 查 看 的 表, 如 选 中 stud_info 表 右 击, 在 弹 出 的 菜 单 中 选 择 所 有 任 务 管 理 触 发 器,SQ L Server 将 弹 出 触 发 器 属 性 对 话 框, 在 触 发 器 属 性 对 话 框 中, 通 过 选 择 名 称 下 拉 框, 用 户 可 以 对 存 在 的 触 发 器 进 行 浏 览 和 修 改, 编 辑 T ransact 唱 SQ L 语 句 之 后, 单 击 检 查 语 法 按 钮, 确 保 所 编 写 的 程 序 代 码 语 法 无 误, 最 后 单 击 确 定 按 钮 2. 修 改 触 发 器 通 过 企 业 管 理 器 和 系 统 过 程 或 T ransaction_ SQ L 命 令, 可 以 修 改 触 发 器 的 名 字 和 正 文 (1) 使 用 sp_rename 命 令 修 改 触 发 器 的 名 字, 其 语 法 格 式 为 : sp_rename oldname, newname 其 中,oldname 为 触 发 器 原 来 的 名 称,newname 为 触 发 器 的 新 名 称 (2) 通 过 企 业 管 理 器 修 改 触 发 器 定 义 通 过 企 业 管 理 器 修 改 触 发 器 定 义 的 操 作 步 骤 与 查 看 触 发 器 信 息 一 样 修 改 完 触 发 器 后 要 使 用 检 查 语 法 选 项 对 语 句 进 行 检 查
第 9 章 存 储 过 程 与 触 发 器 235 (3) 通 过 A LER T trigger 命 令 修 改 触 发 器 正 文 在 实 际 应 用 中, 用 户 可 能 需 要 改 变 一 个 已 经 存 在 的 触 发 器, 可 以 通 过 使 用 SQ L Server 提 供 的 A L T ER T RIGGER 语 句 来 实 现 SQ L Server 可 以 在 保 留 现 有 触 发 器 名 称 的 同 时, 修 改 触 发 器 的 触 发 动 作 和 执 行 内 容 修 改 触 发 器 的 具 体 语 法 如 下 : ALTER TRIGGER trigge_name ON {table view} {FOR AFTER INSTEAD OF}{INSERT,UPDATE,DELETE} [WITH ENCRYPTION] AS IF UPDATE(column_name) [{and or} UPDATE(column name)...] sql_statesments 其 中 各 参 数 的 意 义 与 建 立 触 发 器 语 句 中 参 数 的 意 义 相 同 例 9.23 修 改 数 据 库 student 中 的 表 teacher_info 上 建 立 的 INS TEAD OF 触 发 器 teacher_trigger2, 使 得 用 户 执 行 删 除 增 加 修 改 操 作 时, 自 动 给 出 错 提 示 信 息 并 撤 销 此 次 操 作 具 体 命 令 如 下 : USE student GO ALTER TRIGGER teacher_trigger2 ON teacher_info INSTEAD OF DELETE,INSERT,UPDATE AS RAISERROR( You can not insert,delete or update records from this table,10,1) 3. 删 除 触 发 器 删 除 已 创 建 的 触 发 器 有 三 种 方 法 : (1) 使 用 命 令 DROP T RIGGER 删 除 指 定 的 触 发 器, 删 除 触 发 器 的 具 体 语 法 形 式 如 下 : DROP TRIGGER trigger_name 例 如, 用 户 可 以 使 用 DROP T RIGGER teacher _ trigger2 来 删 除 触 发 器 teacher _ trigger2 (2) 删 除 触 发 器 所 在 的 表 时,SQ L Server 将 自 动 删 除 与 该 表 相 关 的 触 发 器 (3) 按 照 前 面 介 绍 的 方 法 进 入 触 发 器 属 性 对 话 框, 在 该 对 话 框 中 选 择 要 删 除 的 触 发 器, 然 后 单 击 删 除 按 钮 即 可 4. 禁 止 和 启 用 触 发 器 在 使 用 触 发 器 时, 用 户 可 能 遇 到 在 某 些 时 候 需 要 禁 止 某 个 触 发 器 起 作 用 的 场 合, 例 如 用 户 需 要 对 某 个 建 有 INSER T 触 发 器 的 表 中 插 入 大 量 数 据 当 一 个 触 发 器 被 禁 止 后, 该 触 发 器 仍 然 存 在 于 表 上, 只 是 触 发 器 的 动 作 将 不 再 执 行, 直 到 该 触 发 器 被 重 新 启 用 禁 止
236 SQL Server 数 据 库 应 用 技 术 和 启 用 触 发 器 的 具 体 语 法 如 下 : ALTER TABLE table_name {ENABLE DISABLE} TRIGGER {ALL trigger_name[,...n]} 其 中,{EN ABLE DISABLE} T RIGGER 指 定 启 用 或 禁 用 trigger_name 当 一 个 触 发 器 被 禁 用 时, 它 对 表 的 定 义 依 然 存 在 ; 然 而, 当 在 表 上 执 行 INSER T U PDA T E 或 DELE T E 语 句 时, 触 发 器 中 的 操 作 将 不 执 行, 除 非 重 新 启 用 该 触 发 器 A L L 指 定 启 用 或 禁 用 表 中 所 有 的 触 发 器 ;trigger_name 指 定 要 启 用 或 禁 用 的 触 发 器 名 称 发 器 实 训 例 9.24 禁 止 或 启 用 在 数 据 库 student 中 表 teacher_info 上 创 建 的 所 有 触 发 器 ALTER T ABLE teacher_info DISABLE TRIGGER ALL ALTER T ABLE teacher_info ENABLE TRIGGER ALL 用 户 可 以 自 己 尝 试 禁 止 或 启 用 在 数 据 库 student 中 表 stud_info 上 创 建 的 某 个 触 1. 实 训 目 的 (1) 理 解 存 储 过 程 和 触 发 器 的 作 用 (2) 学 会 使 用 企 业 管 理 器 和 查 询 分 析 器 创 建 存 储 过 程 (3) 学 会 使 用 企 业 管 理 器 和 查 询 分 析 器 创 建 触 发 器 (4) 学 会 存 储 过 程 和 触 发 器 的 管 理 方 法 2. 实 训 的 知 识 准 备 使 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 ( CREA T E PROCEDURE A L TER PROCEDURE DROP PROCEDURE CREA T E T RIGGER A L T ER T RIGGER DROP T RIGGER) 创 建 修 改 删 除 存 储 过 程 和 触 发 器, 能 够 在 存 储 过 程 中 定 义 和 使 用 输 入 输 出 参 数, 能 够 确 定 由 INSER T U PDA T E 或 DELE TE 语 句 引 起 的 数 据 变 化 而 激 活 触 发 器 同 样 重 要 的 是, 在 存 储 过 程 和 触 发 器 中 灵 活 使 用 T ransact 唱 SQ L 语 句 3. 实 训 内 容 和 步 骤 (1) 创 建 和 执 行 存 储 过 程 1 针 对 教 师 基 本 信 息 表 teacher_info, 创 建 一 个 名 称 为 teacher_select 的 存 储 过 程, 执 行 存 储 过 程 将 从 数 据 表 teacher_info 中, 根 据 编 号 检 索 某 一 教 师 的 姓 名 和 职 称 USE student GO CREATE PROCEDURE teacher_select ( @ no char(6), @ nam varchar(8) OU TPU T, @ title char(10) OUTPU T) AS SELECT @ nam = name, @ title = tech_title FROM teacher_info WHERE teacher_id = @ no
第 9 章 存 储 过 程 与 触 发 器 237 执 行 已 经 定 义 的 存 储 过 程 : DECLARE @ nam varchar(6) / 倡 声 明 为 局 部 变 量, 用 来 存 放 姓 名 的 值 倡 / DECLARE @ title char(10) / 倡 声 明 为 局 部 变 量, 用 来 存 放 职 称 的 值 倡 / EXECU TE teacher_select 010104,@ nam OU TPUT,@ title OUTPU T SELECT 姓 名 :,@ nam, 职 称 :,@ title 2 建 立 一 个 插 入 教 师 记 录 的 存 储 过 程 teacher_insert, 在 查 询 分 析 器 中 输 入 存 储 过 程 的 代 码 并 执 行 CREATE PROCEDURE teacher_insert ( @ no char(6), @ nam varchar(8), @ sex char(2), @ age int, @ title char(10), @ tel varchar(12), @ sala decimal(7), @ num char(10)) AS INSERT INTO teacher_info VALUES( @ no,@ nam,@ sex,@ age,@ title,@ tel,@ sala,@ num) GO EXEC teacher_insert 010119, 聂 小 蛋, 男,40, 研 究 员, 02034367219,250.0, 0401010113 在 企 业 管 理 器 中 检 查 新 记 录 是 否 已 经 插 入 至 教 师 基 本 信 息 表 中 3 建 立 一 个 修 改 教 师 记 录 的 存 储 过 程 teacher_update, 并 执 行 之 CREATE PROCEDURE teacher_update ( @ no char(6), @ nam varchar(8), @ sex char(2), @ age int, @ title char(10), @ tel varchar(12), @ sala decimal(7), @ num char(10)) AS BEGIN UPDATE teacher_info SET name = @ nam, gender = @ sex, age = @ age, tech_title = @ title, telephone = @ tel, salary = @ sala, course_id = @ num WHERE teacher_id = @ no END 在 查 询 分 析 器 运 行 EXEC 命 令, 调 用 存 储 过 程 teacher_update, 修 改 一 个 具 体 的 教 师 记 录 4 建 立 一 个 删 除 教 师 信 息 表 中 记 录 的 存 储 过 程 teacher_delete, 并 执 行 之 CREATE PROCEDURE teacher_delete ( @ no char(6)) AS DELETE FROM teacher_info WHERE teacher_id = @ no
238 SQL Server 数 据 库 应 用 技 术 在 查 询 分 析 器 运 行 EXEC 命 令 调 用 存 储 过 程 teacher_delete, 删 除 teacher_info 中 的 teacher_id 为 010119 的 教 师 记 录 自 行 练 习 : 编 写 一 个 存 储 过 程 对 student 数 据 库 中 表 stud_info 进 行 检 索 插 入 修 改 删 除 的 操 作, 然 后 调 用 这 个 存 储 过 程 (2) 创 建 触 发 器 1 使 用 CREA T E T RIGGER 命 令 创 建 一 个 触 发 器 teacher_tri1, 当 向 表 teacher_info 中 插 入 一 条 记 录 时, 自 动 显 示 表 teacher_info 中 的 记 录 在 查 询 分 析 器 中 输 入 触 发 器 的 代 码 并 执 行 CREATE TRIGGER teacher_tri1 ON stud_info FOR INSERT AS SELECT 倡 FROM teacher_info 触 发 器 建 立 完 毕 后, 当 执 行 如 下 操 作 时 将 会 显 示 数 据 表 teacher_info 中 的 全 部 记 录 INSERT INTO teacher_info VALUES( 010119, 聂 晓 基, 男,40, 讲 师, 02034360338,250.0, 0401010108 ) 2 使 用 系 统 存 储 过 程 sp_helptext 查 看 触 发 器 teacher_tri1 的 定 义 文 本 信 息 具 体 命 令 如 下 : USE student EXEC sp_helptext teacher_tri1 GO 在 查 询 分 析 器 的 查 询 窗 口 中 运 行 上 面 的 命 令, 在 结 果 窗 口 中 将 返 回 触 发 器 teacher_ tri1 的 定 义 信 息 3 在 数 据 库 student 中 的 teacher_info 上 建 立 DELE T E 触 发 器 teacher_tri2, 使 得 在 删 除 表 teacher_info 中 记 录 的 同 时, 自 动 检 查 课 程 安 排 表 teach_schedule 中 是 否 有 该 教 师 的 记 录, 如 果 存 在 该 教 师 记 录, 则 取 消 删 除 具 体 命 令 如 下 : USE student GO CREATE TRIGGER teacher_tri2 ON teacher_info FOR DELETE AS IF(SELECT COUNT( 倡 ) FROM teach_schedule INNER JOIN Deleted ON teach_schedule.teacher_id = Deleted.teacher_id) > 0 BEGIN RAISERROR( You can not delete the teacher_info with the order record.\ The transaction will be cancelled,10,1) ROLLBACK TRANSACTION END
第 9 章 存 储 过 程 与 触 发 器 239 在 查 询 分 析 器 中 输 入 上 述 语 句 后, 可 以 使 用 下 述 命 令 加 以 验 证 DELETE FROM teacher_info WHERE teacher_id = 010101 自 行 练 习 : 编 写 一 个 触 发 器, 在 对 student 数 据 库 中 数 据 表 stud_info 执 行 插 入 更 新 和 删 除 3 种 操 作 后 给 出 相 应 提 示 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 什 么 是 存 储 过 程? 请 分 别 写 出 使 用 企 业 管 理 器 和 SQ L 命 令 创 建 存 储 过 程 的 主 要 步 骤 (2) 如 何 将 数 据 传 递 到 一 个 存 储 过 程 中? 又 如 何 将 存 储 过 程 的 结 果 值 返 回? (3) 同 删 除 和 重 建 存 储 过 程 相 比, 修 改 存 储 过 程 有 什 么 好 处? 请 分 别 写 出 使 用 企 业 管 理 器 和 SQ L 命 令 修 改 存 储 过 程 的 主 要 步 骤 (4) 写 出 删 除 存 储 过 程 stud_info_proc 的 命 令 (5) 使 用 触 发 器 有 什 么 优 点? (6) 当 一 个 表 同 时 具 有 约 束 和 触 发 器 时, 如 何 执 行? (7) 举 个 实 例, 分 别 创 建 INSER T U PDA T E DELE T E 触 发 器 (8) 如 果 触 发 器 运 行 ROLLBACK T RA NSAC TION 命 令 后, 引 起 触 发 器 触 发 的 操 作 命 令 是 否 还 有 效? 2. 按 照 题 目 要 求 写 出 SQL 命 令, 并 在 机 器 上 进 行 测 试 (1) 创 建 一 个 存 储 过 程, 使 其 调 用 后 能 返 回 年 龄 为 40 以 上 职 称 为 副 教 授 的 教 师 基 本 信 息 (2) 针 对 学 生 基 本 信 息 表 (stud_info), 创 建 一 个 按 性 别 统 计 人 数 的 存 储 过 程 (3) 调 用 上 述 存 储 过 程 people_num, 统 计 性 别 为 男 的 人 数 (4) 编 写 一 个 (teacher_cancel) 触 发 器, 当 在 teacher_info 表 中 删 除 一 个 记 录, 将 触 发 该 触 发 器 在 触 发 器 中 将 判 断 教 师 是 否 已 经 授 课 如 果 已 经 安 排 某 位 教 师 授 课, 它 将 激 发 一 个 例 外, 把 无 法 删 除 的 信 息 返 回 用 户 (5) 编 写 一 个 (teacher_insert_update) 触 发 器, 当 向 teacher_info 表 中 插 入 或 修 改 一 个 记 录 时, 触 发 器 激 活 检 查 记 录 的 course_id 值 是 否 存 在 于 lesson_info 表 中, 若 不 存 在, 则 取 消 插 入 或 修 改 操 作 (6) 编 写 一 个 (teacher_update) 触 发 器, 当 修 改 lesson_info 表 的 course_id 字 段 值 时, 该 字 段 在 teacher_info 表 中 的 对 应 值 也 做 相 应 修 改 (7) 编 写 一 个 (teacher_delete) 触 发 器, 删 除 lesson_info 表 中 记 录 的 同 时, 也 删 除 该 记 录 course_id 字 段 值 在 teacher_info 表 中 的 对 应 记 录 (8) 对 于 student 数 据 库, 表 stud_info 的 stud_id 列 与 表 stud_grade 的 stud_id 列 应 满 足 参 照 完 整 性 规 则, 请 用 触 发 器 实 现 两 个 表 间 的 参 照 完 整 性
第 10 章 SQL Server 的 程 序 设 计 本 章 将 主 要 介 绍 包 括 批 处 理 流 程 控 制 事 务 处 理 锁 游 标 在 内 的 T ranscat 唱 SQ L 的 程 序 设 计 知 识, 它 们 是 灵 活 应 用 T ransact 唱 SQ L 语 句 的 关 键 10.1 批 处 理 与 流 程 控 制 10.1.1 批 处 理 数 据 处 理 的 方 式 基 本 上 是 批 处 理 所 谓 批 处 理 是 包 含 一 个 或 多 个 T ransact 唱 SQ L 语 句 的 组, 它 将 一 次 性 地 发 送 到 SQ L Server 中 执 行, 用 GO 来 通 知 SQ L Server 一 批 T ransact 唱 SQ L 语 句 的 结 束 一 些 SQ L 语 句 不 可 以 放 在 一 个 批 处 理 中 进 行 处 理, 它 们 需 要 遵 守 以 下 规 则 : 大 多 数 CREA T E 命 令 要 在 单 个 批 命 令 中 进 行, 但 CREA T E DA T ABASE,CREA T E T ABLE 和 CREA T E INDEX 例 外 例 10.1 一 个 批 处 理 的 例 子 USE student GO CREATE VIEW teacher_info_view AS SELECT teacher_id, name, tech_title, salary FROM teacher_info GO SELECT 倡 FROM teacher_info_view GO 因 为 CREA TE VIEW 必 须 是 批 处 理 中 的 惟 一 语 句, 所 以 需 要 GO 命 令 将 CREA T E VIEW 语 句 与 其 上 下 的 语 句 (U SE 和 SELEC T) 隔 离 开 来 例 10.2 在 数 据 库 student 中 列 出 学 生 基 本 信 息 表 stud_info 中 学 号 姓 名, 其 中 要 求 学 号 stud_id 以 04 开 头 USE student SELECT stud_id, name FROM stud_info WHERE stud_id LIKE 04 % GO
第 10 章 SQL Server 的 程 序 设 计 241 在 查 询 分 析 器 的 运 行 窗 口 中 运 行 上 面 命 令 后, 在 运 行 结 束 窗 口 中 将 返 回 学 号 stud_id 以 04 开 始 的 所 有 内 容 上 述 这 个 查 询 过 程 实 际 上 就 是 一 组 有 效 的 SQ L 命 令 组 成 的 批 处 理 在 程 序 设 计 中 经 常 会 出 现 无 效 的 批 处 理 命 令, 下 面 是 一 个 无 效 的 批 处 理 的 示 例 USE student GO CREATE VIEW stud_info_view AS SELECT stud_id, name FROM stud_info INSERT INTO stud_info_view VALUES( 0501010211, 黄 铭 ) GO 在 查 询 分 析 器 的 运 行 窗 口 中 运 行 上 面 命 令 后, 在 运 行 结 果 窗 口 中 将 返 回 如 下 消 息 : 在 关 键 字 INSER T 附 近 有 语 法 错 误, 这 说 明 第 二 个 批 处 理 是 无 效 的, 原 因 在 于 一 个 批 处 理 中,CREA T E VIEW 必 须 是 其 中 的 惟 一 语 句 如 果 在 INSER T 命 令 之 前 加 一 个 GO 语 句, 那 么, 上 述 批 处 理 就 可 以 正 常 执 行 了 例 10.3 一 个 无 效 批 处 理 的 例 子 DECLARE @ stud_var IN T GO SELECT @ stud_var = 25 GO PRINT @ stud_var GO 运 行 结 果 如 图 10 唱 1 所 示, 因 为 @ stud_var 在 第 一 个 批 处 理 中 定 义, 但 是 在 第 二 个 批 处 理 中 引 用 了 @ stud_var, 在 第 三 个 批 处 理 中 又 引 用 @ stud_var, 所 以 运 行 出 错 10.1.2 流 程 控 制 图 10 唱 1 无 效 批 处 理 的 例 子 流 程 控 制 语 句 是 通 过 判 断 指 定 的 某 些 值 来 控 制 程 序 运 行 方 向 的 语 句 T ransact 唱 SQ L 语 言 使 用 的 流 程 控 制 语 句 与 常 见 的 程 序 设 计 语 言 类 似, 主 要 有 以 下 几 种 控 制 命 令
242 SQL Server 数 据 库 应 用 技 术 1.BEGIN...END 语 法 形 式 : BEGIN {sql_statement statement_block} END BEGIN...END 用 来 设 定 一 个 程 序 块, 将 在 BEGIN...END 内 的 sql_statement 或 statement_block 视 为 一 个 单 元 执 行 BEGIN...END 经 常 在 条 件 语 句 ( 如 IF...ELSE) 中 使 用 在 BEGIN...END 中 可 以 嵌 套 另 外 的 BEGIN...END 来 定 义 另 一 程 序 块 2.IF...ELSE 语 法 形 式 : IF (condution_expression) {sql_statement statement_block} [ELSE {sql_statement statement_block}] 其 中 :condution_expression 为 条 件 表 达 式, 可 以 是 各 种 表 达 式 的 组 合, 但 表 达 式 的 值 必 须 是 逻 辑 值 真 或 假 ELSE 子 句 是 可 选 的, 最 简 单 的 IF 语 句 没 有 ELSE 子 句 部 分 IF...ELSE 用 来 判 断 当 某 一 条 件 成 立 时 执 行 某 段 程 序, 条 件 不 成 立 时 执 行 另 一 段 程 序 如 果 不 使 用 程 序 块 statement _ block,if 或 ELSE 只 能 执 行 一 条 命 令 行 sql_ statement IF...ELSE 可 以 进 行 嵌 套, 在 T ransact 唱 SQ L 中 最 多 可 嵌 套 32 级 例 10.4 从 stud_grade 数 据 表 中 求 出 2004 级 计 算 机 工 程 系 计 算 机 应 用 技 术 专 业 01 班 学 生 的 平 均 成 绩, 如 果 此 平 均 成 绩 大 于 或 等 于 60 分, 则 输 出 pass 信 息 IF (SELECT AVG(grade) FROM stud_grade WHERE LEFT(stud_id,8) = 04010101 ) > = 60 BEGIN PRINT pass END 例 10.5 统 计 2004 级 计 算 机 工 程 系 计 算 机 应 用 技 术 专 业 02 班 的 学 生 人 数, 如 果 不 超 过 45 人, 则 向 数 据 表 stud_info 中 加 入 新 的 学 生 记 录 DECLARE @ p_total IN T BEGIN SELECT @ p_total = COUNT( 倡 ) FROM stud_info WHERE LEFT(stud_id,8) = 04010102 IF ( @ p_total < 45) INSERT IN TO stud_info VALUES ( 0401010245, 谢 背 光, 05 唱 14 唱 1986, 男, 广 东 省 湛 江 市, 0789 唱 4526345, 514020,565) END 例 10.6 从 数 据 表 stud_grade 中 读 出 学 生 陈 红 的 成 绩, 将 百 分 制 转 换 成 等 级 制 DECLARE @ score NU MERIC(4,1), @ step CHAR(1) BEGIN / 倡 从 关 系 stud_grade 中 读 出 学 生 陈 红 的 一 个 成 绩 送 变 量 @ score 倡 / SELECT @ score = grade FROM stud_grade WHERE name = 陈 红 IF ( @ score > = 90 AND @ score < = 100) SET @ step = A ;
第 10 章 SQL Server 的 程 序 设 计 243 ELSE IF ( @ score > = 80) SET @ step = B ELSE IF ( @ score > = 70) SET @ step = C ELSE IF ( @ score > = 60) SET @ step = D ELSE SET @ step = E PRINT @ step END 3.CASE CASE 命 令 有 两 种 语 句 格 式 语 法 形 式 1 : CASE expression WHEN expression_11 THEN expression_12 WHEN expression_n1 THEN expression_n2 [ELSE expression_m] END 该 语 句 的 执 行 过 程 是 : 将 CASE 后 面 表 达 式 的 值 与 各 W HEN 子 句 中 的 表 达 式 的 值 进 行 比 较, 如 果 两 者 相 等, 则 返 回 T HEN 后 的 表 达 式 的 值, 然 后 跳 出 CASE 语 句, 否 则 返 回 ELSE 子 句 中 的 表 达 式 的 值 ELSE 子 句 是 可 选 项 当 CASE 语 句 中 不 包 含 ELSE 子 句 时, 如 果 所 有 比 较 失 败 时,CASE 语 句 将 返 回 N U L L 例 10.7 从 数 据 表 stud_info 中, 选 取 stud_id grade, 如 果 grade 为 男 则 输 出 M, 如 果 为 女 输 出 F SELECT stud_id, sex = CASE gender FROM stud_info 语 法 形 式 2 : END WHEN 男 T HEN M WHEN 女 T HEN F CASE WHEN condition_expression_1 THEN expression_1 WHEN condition_expression_n THEN expression_n [ELSE expression_m] END 该 语 句 的 执 行 过 程 是 : 首 先 测 试 W H EN 后 的 条 件 表 达 式 的 值, 如 果 其 值 为 真, 则 返 回 T H EN 后 面 的 表 达 式 的 值, 否 则 测 试 下 一 个 W HEN 子 句 中 的 表 达 式 的 值 ; 如 果 所 有 W HEN 子 句 后 的 表 达 式 的 值 都 为 假, 则 返 回 ELSE 后 的 表 达 式 的 值 ; 如 果 在 CASE 语 句 中 没 有 ELSE 子 句, 则 CASE 表 达 式 返 回 N U L L 注 意 : CASE 命 令 可 以 嵌 套 到 SQ L 语 句 中 例 10.8 从 stud_grade 表 中 查 询 所 有 同 学 考 试 成 绩 情 况, 凡 成 绩 为 空 者 输 出 未
244 SQL Server 数 据 库 应 用 技 术 考, 小 于 60 分 输 出 不 及 格,60 分 至 70 分 输 出 及 格,70 分 至 90 分 输 出 良 好, 大 于 或 等 于 90 分 时 输 出 优 秀 SELECT stud_id,name,score = CASE WHEN grade IS NULL T HEN 未 考 WHEN grade < 60 THEN 不 及 格 WHEN grade > = 60 AND grade < 70 T HEN 及 格 WHEN grade > = 70 AND grade < 90 T HEN 良 好 WHEN grade > = 90 T HEN 优 秀 END FROM stud_grade 4.WHILE...CONTINUE...BREAK 语 法 形 式 : WHILE condition_expression BEGIN {sql_statement statement_block} [BREAK] [CONTINUE] {sql_statement statement_block} END W HILE 命 令 在 设 定 的 条 件 成 立 时, 会 重 复 执 行 命 令 行 或 程 序 块 CON TIN UE 命 令 可 以 让 程 序 跳 过 CON TIN UE 命 令 之 后 的 语 句, 回 到 W HILE 循 环 的 第 一 行, 继 续 进 行 下 一 次 循 环 BREA K 命 令 则 让 程 序 完 全 跳 出 循 环, 结 束 W HILE 命 令 的 执 行 W HILE 语 句 也 可 以 嵌 套 例 10.9 以 下 程 序 计 算 1 ~ 100 之 间 所 有 能 被 3 整 除 的 数 的 个 数 及 总 和 DECLARE @ x SMALLINT,@ y SMALLINT,@ nums SMALLINT SET @ x = 0 SET @ y = 1 SET @ nums = 0 WHILE ( @ y < = 100) BEGIN IF ( @ y % 3 = 0) BEGIN SET @ x = @ x + @ y SET @ nums = @ nums + 1 END SET @ y = @ y + 1 END PRINT str( @ x) +, + str( @ nums)
第 10 章 SQL Server 的 程 序 设 计 245 5.WAITFOR 语 法 形 式 : WAITFOR {DELAY time TIME time } WAITFOR 命 令 用 来 暂 时 停 止 程 序 执 行, 直 到 所 设 定 的 等 待 时 间 已 过 或 所 设 定 的 时 间 已 到 才 继 续 往 下 执 行 其 中 time 必 须 为 DATETIME 类 型 的 数 据, 但 不 能 包 括 日 期 其 中,DELAY 用 来 设 定 等 待 的 时 间, 最 多 可 达 24 小 时 ;TIME 用 来 设 定 等 待 结 束 的 时 间 点 例 10.10 等 待 1 小 时 2 分 零 3 秒 后 才 执 行 SELEC T 语 句 WAITFOR DELAY 01 :02 :03 SELECT 倡 FROM stud_info 6.GOTO 语 法 形 式 : GOTO label GO T O 命 令 用 来 改 变 程 序 执 行 的 流 程, 使 程 序 跳 到 标 有 标 识 符 的 指 定 的 程 序 行 再 继 续 往 下 执 行 作 为 跳 转 目 标 的 标 识 符 可 为 数 字 与 字 符 的 组 合, 但 必 须 以 : 结 尾 在 GO T O 命 令 行, 标 识 符 后 不 必 跟 : 例 10.11 求 1 + 2 + 3 + + 100 的 总 和 DECLARE @ sum SMALLINT, @ i SMALLINT SET @ i = 1 SET @ sum = 0 BEG : IF ( @ i < = 100) BEGIN SET @ sum = @ sum + @ i SET @ i = @ i + 1 GOTO BEG END PRINT @ sum 7.RETURN 语 法 形 式 : RETURN [integer_expression] RE T URN 命 令 用 于 结 束 当 前 程 序 的 执 行, 返 回 到 上 一 个 调 用 它 的 程 序 或 其 他 程 序 在 括 号 内 可 指 定 一 个 返 回 值 如 果 没 有 指 定 返 回 值,SQ L Server 系 统 会 根 据 程 序 执 行 的 结 果 返 回 一 个 内 定 值, 例 如 :0 表 示 程 序 执 行 成 功 ;- 1 表 示 找 不 到 对 象 ;- 2 表 示 数 据 类 型 错 误 ;- 3 表 示 死 锁 ;- 4 表 示 违 反 权 限 原 则 ;- 5 表 示 语 法 错 误 ;- 6 表 示 用 户 造 成 的 一 般 错 误 ;- 7 表 示 资 源 错 误 如 磁 盘 空 间 不 足 ;- 8 表 示 非 致 命 的 内 部 错 误 ;- 9 表 示 已 达 到 系 统 的 极 限 ;- 10 ~ - 11 表 示 致 命 的 内 部 不 一 致 性 错 误 ;- 12 表 示 表 或 指 针 破 坏 ;- 13 表 示 数 据 库 破 坏 ;- 14 表 示 硬 件 错 误 如 果 运 行 过 程 产 生 了 多 个 错 误,SQ L Server 系 统 将 返 回 绝 对 值 最 大 的 数 值 ; 如 果 此
246 SQL Server 数 据 库 应 用 技 术 时 用 户 定 义 了 返 回 值, 则 返 回 用 户 定 义 的 值 RE T URN 语 句 不 能 返 回 N U LL 值 10.2 事 务 处 理 10.2.1 事 务 概 述 1. 事 务 的 概 念 一 个 事 务 是 由 一 系 列 的 数 据 库 查 询 操 作 和 更 新 操 作 构 成 的 从 用 户 的 观 点 来 看, 根 据 业 务 规 则, 这 些 操 作 是 一 个 整 体, 不 能 分 割, 要 么 所 有 的 操 作 都 顺 利 完 成, 要 么 一 个 也 不 要 做, 绝 不 能 只 完 成 了 部 分 操 作, 而 还 有 一 些 操 作 没 有 完 成 事 务 是 数 据 库 运 行 中 的 一 个 逻 辑 工 作 单 位, 由 DBM S 中 的 事 务 管 理 子 系 统 负 责 事 务 的 处 理 例 10.12 将 student 数 据 库 中 学 生 基 本 信 息 表 (stud_info) 的 学 号 stud_id 由 0401010811 修 改 为 0401010111 因 为 学 号 出 现 在 学 生 基 本 信 息 表 (stud_info), 学 生 成 绩 表 (stud_grade) 中, 所 以 要 将 两 个 表 中 的 学 号 都 修 改, 而 不 能 只 修 改 其 中 的 一 个 表 用 户 必 须 通 知 SQL Server, 通 知 的 方 法 是 将 下 面 的 两 个 UPDATE 语 句 定 义 成 一 个 事 务 通 过 事 务 来 保 证 student 数 据 库 中 表 stud_info 和 stud_grade 的 学 号 stud_id 同 时 修 改, 以 达 到 数 据 保 持 一 致 性 的 目 的 USE student GO BEGIN TRAN stud_transaction 唱 开 始 一 个 事 务 UPDATE stud_id SET stud_id = 0401010111 WHERE course_id = 0401010108 UPDATE stud_grade SET stud_id = 0401010111 WHERE course_id = 0401010108 COM MIT TRAN stud_transaction 唱 提 交 事 务 2. 事 务 的 特 性 事 务 作 为 一 个 逻 辑 工 作 单 元, 其 中 包 括 一 系 列 的 操 作, 这 些 语 句 将 被 作 为 一 个 整 体 进 行 处 理 当 事 务 执 行 遇 到 错 误 时, 将 取 消 事 务 做 的 所 有 操 作 (1) 原 子 性 (Atomicity) 一 个 事 务 中 的 所 有 操 作 是 一 个 逻 辑 上 不 可 分 割 的 单 位 事 务 必 须 作 为 工 作 的 最 小 单 位, 即 原 子 单 位, 其 所 进 行 的 操 作 要 么 全 部 执 行, 要 么 全 部 不 执 行 (2) 一 致 性 (Consistency) 事 务 结 束 时, 必 须 使 所 有 数 据 处 于 一 致 性 状 态 数 据 库 处 于 一 致 性 状 态 是 指 数 据 库 中 的 数 据 满 足 各 种 完 整 性 规 则 在 相 关 数 据 库 中, 事 务 必 须 遵 守 数 据 库 的 约 束 和 规 则 要 求, 以 保 持 所 有 数 据 的 完 整 性 (3) 隔 离 性 (Isolation) 为 了 提 高 事 务 的 吞 吐 率, 大 多 数 DBM S 允 许 同 时 执 行 多 个 事 务, 就 像 分 时 操 作 系 统 为 了 充 分 利 用 系 统 资 源, 同 时 执 行 多 个 进 程 一 样 一 个 事 务 所 作 的 修 改 必 须 与 其 他 事 务 所 作 的 修 改 隔 离 事 务 查 看 数 据 所 处 的 状 态, 要 么 是 另 一 并 发 事 务 修 改 它 之 前 的 状 态, 要 么 是 另 一 事 务 修 改 它 之 后 的 状 态, 事 务 不 会 查 看 中 间 状 态 的 数 据
第 10 章 SQL Server 的 程 序 设 计 247 (4) 持 久 性 (Durability) 一 个 事 务 一 旦 完 成 了 全 部 操 作, 它 对 数 据 库 的 所 有 更 新 操 作 的 结 果 应 反 映 到 数 据 库 中 事 务 完 成 后, 其 对 数 据 库 的 修 改 将 永 久 保 持 事 务 的 这 4 个 特 性 一 般 简 称 为 事 务 的 ACID 特 性, 可 以 说 对 数 据 库 中 的 数 据 保 护 是 围 绕 着 实 现 事 务 的 特 性 而 达 到 的 10.2.2 事 务 管 理 1. 事 务 管 理 语 句 (1) 使 用 BEGIN T RA NSAC TION 语 句 建 立 事 务 BEGIN TRAN[SACTION] [transaction_name @ tran_name_variable[with MARK [ description ] ] ] 一 个 事 务 是 由 若 干 条 SQ L 语 句 组 成 一 般 来 说, 用 户 向 DBM S 提 交 的 第 一 条 SQ L 语 句 开 始 一 个 新 事 务, 事 务 的 最 后 一 条 SQ L 语 句 是 CO M MI T 或 ROL LBACK 语 句, 表 示 一 个 事 务 的 结 束 和 新 事 务 的 开 始 特 别 地, 像 一 条 CREA T E T ABLE 或 GRA N T 语 句 就 构 成 一 个 事 务 这 里,BEGIN T RA N[SAC TION] 是 提 供 定 义 显 式 事 务 开 始 的 语 句 (2) 使 用 COM MI T T RA NSAC TION 语 句 标 识 事 务 结 束 COMMIT [TRAN[SACTION] [ transaction_name @ tran_name_variable] ] 事 务 结 束 后 没 有 遇 到 错 误, 事 务 中 的 所 有 数 据 修 改 在 数 据 库 中 都 将 永 久 有 效, 占 用 的 资 源 将 被 释 放 (3) 使 用 COM MI T WORK 语 句 标 识 事 务 结 束 COMMIT [WORK] 表 示 一 个 事 务 的 正 常 结 束 该 语 句 成 功 执 行 后,SQ L Server 将 从 上 一 个 事 务 结 束 后 到 该 语 句 之 间 的 所 有 SQ L 语 句 对 数 据 库 的 操 作 保 存 到 数 据 库 中 (4) 使 用 ROLLBACK T RA NSAC TION 语 句 回 滚 到 事 务 的 指 定 点 ROLLBACK [TRAN[SACTION] [transaction_name @ tran_name_variable savepoint_name @ savepoint_variable] ] 事 务 执 行 过 程 中 遇 到 错 误, 修 改 的 所 有 数 据 都 被 回 滚 到 事 务 指 定 位 置 的 状 态, 占 用 的 资 源 将 被 释 放 (5) 使 用 ROLLBACK WORK 语 句 回 滚 到 事 务 的 起 点 ROLLBACK [WORK] 表 示 一 个 事 务 的 非 正 常 结 束 该 语 句 执 行 后,SQ L Server 将 从 上 一 个 事 务 结 束 后 到 该 语 句 之 间 的 所 有 SQ L 语 句 对 数 据 库 的 操 作 撤 销, 数 据 库 恢 复 到 事 务 执 行 前 的 状 态 (6) 使 用 SA VE T RA NSAC TION 语 句 设 置 保 存 点 SAVE [TRAN[SACTION] [savepoint_name]]
248 SQL Server 数 据 库 应 用 技 术 SQ L Server 允 许 在 事 务 处 理 上 设 置 保 存 点 保 存 点 允 许 在 一 个 事 务 处 理 内 部 做 些 工 作, 而 后 基 于 特 定 条 件 回 滚 这 些 工 作 保 存 点 (savepoint _ name) 类 似 于 C 语 言 中 的 GO T O 语 句 的 标 号 2. 参 数 说 明 1 transaction_name 是 分 配 给 事 务 的 名 称 2 @ tran_ name_ variable 是 用 户 定 义 的 含 有 事 务 名 称 的 变 量 名 称, 必 须 用 char varchar nchar 或 nvarchar 数 据 类 型 声 明 该 变 量 3 WIT H M ARK[ description ] 指 定 在 日 志 中 标 记 事 务,description 是 描 述 该 标 记 的 字 符 串 如 果 使 用 了 WIT H M ARK, 则 必 须 指 定 事 务 名 4 savepoint_name 是 在 事 务 内 建 立 的 一 个 保 存 点 标 记 5 @ savepoint_variable 是 用 户 定 义 的 含 有 保 存 点 名 称 的 变 量 名 称, 必 须 用 char varchar nchar 或 nvarchar 数 据 类 型 声 明 该 变 量 3. 简 单 例 子 例 10.13 命 名 一 个 事 务 student_manager1, 事 务 将 为 课 程 号 最 后 两 位 为 06 的 多 媒 体 技 术 课 程 的 所 有 学 生 成 绩 扣 10 % USE student GO DECLARE @ tranname VARCH AR(20) SELECT @ tranname = student_manager1 BEGIN TRAN @ tranname GO UPDATE stud_grade SET grade = grade 倡 0.90 WHERE course_id LIKE % 06 GO COM MIT TRAN @ tranname 例 10.14 使 用 事 务 处 理 方 式 对 表 stud_grade 执 行 更 新 操 作, 成 功 则 提 交 事 务, 失 败 则 取 消 事 务 USE student GO BEGIN TRAN student_manager2 UPDATE stud_grade SET grade = ROUND(SQRT(grade) 倡 10,0) WHERE course_id LIKE % 06 IF @ @ ERROR!= 0 ROLLBACK TRAN student_manager2 ELSE COM MIT TRAN student_manager2 从 例 10 唱 14 中 可 以 看 到 事 务 是 类 似 于 具 有 一 个 入 口 两 个 出 口 的 一 种 控 制 结 构 CO M MI T 是 一 个 出 口, 表 示 事 务 的 所 有 操 作 都 完 成 了 ROLLBACK 是 另 一 个 出 口, 通 过 撤 销 所 有 的 已 经 做 过 的 操 作 达 到 一 个 操 作 也 没 做 的 效 果
第 10 章 SQL Server 的 程 序 设 计 249 10.2.3 事 务 模 式 1. 显 式 事 务 显 式 事 务 可 以 由 用 户 在 其 中 定 义 事 务 的 启 动 和 结 束 2. 隐 式 事 务 隐 式 事 务 是 指 在 当 前 事 务 提 交 或 回 滚 后, 自 动 启 动 新 事 务 当 SQ L Server 首 次 执 行 下 列 语 句 时, 都 会 自 动 启 动 一 个 事 务 : 所 有 的 CREA T E 语 句 所 有 的 DROP 语 句 OPEN A L T ER T ABLE INSER T FE T CH DELE T E REVOKE SELEC T GRA N T U PDA T E 使 用 SE T IM PLICI T_ T RA N AC TIONS OFF 语 句 可 以 关 闭 隐 性 事 务 模 式 例 10.15 隐 式 事 务 处 理 过 程 SET QUOTED_IDENTIFIER OFF 唱 标 识 符 不 可 加 引 号 GO SET NOCOUNT OFF 唱 返 回 计 数 GO USE student GO CREATE T ABLE specialty_code (speccode CH AR(6) PRIMARY KEY, specname VARCH AR(20) NOT NULL) GO SET IMPLICIT_TRANSACTIONS ON 唱 打 开 隐 式 事 务 GO INSERT INTO specialty_code VALUES( 040101, 计 算 机 应 用 技 术 ) 唱 打 开 事 务 GO INSERT INTO specialty_code VALUES( 040102, 计 算 机 网 络 技 术 ) GO INSERT INTO specialty_code VALUES( 040103, 计 算 机 控 制 技 术 ) GO INSERT INTO specialty_code VALUES( 040104, 多 媒 体 技 术 ) GO INSERT INTO specialty_code VALUES( 040105, 计 算 机 软 件 技 术 ) GO INSERT INTO specialty_code VALUES( 040106, 计 算 机 通 信 技 术 ) GO COM MIT TRANSACTION GO SELECT COUNT( 倡 ) FROM specialty_code INSERT INTO specialty_code VALUES( 040107, 计 算 机 管 理 技 术 ) SELECT 倡 FROM specialty_code COM MIT TRANSACTION GO SET IMPLICIT_TRANSACTIONS OFF 唱 关 闭 隐 式 事 务
250 SQL Server 数 据 库 应 用 技 术 3. 自 动 事 务 模 式 在 自 动 事 务 模 式 下, 每 个 T ransact 唱 SQ L 语 句 在 成 功 执 行 完 成 后, 都 被 自 动 提 交 ; 如 果 遇 到 错 误, 则 自 动 回 滚 该 语 句 该 模 式 为 系 统 默 认 的 事 务 管 理 模 式 10.2.4 事 务 日 志 事 务 日 志 用 来 记 录 事 务 的 每 一 次 对 数 据 库 的 更 新 操 作, 包 括 用 户 的 更 新 操 作 以 及 由 此 引 起 的 系 统 内 部 的 更 新 操 作 有 了 事 务 日 志,DBM S 就 可 以 根 据 事 务 日 志 进 行 事 务 故 障 恢 复 和 系 统 故 障 恢 复, 并 结 合 备 份 进 行 介 质 故 障 恢 复 了 1. 事 务 日 志 的 内 容 通 常, 事 务 日 志 中 需 要 登 记 的 主 要 内 容 包 括 : (1) 各 个 事 务 的 开 始 (BEGIN T RA NSAC TION) 标 记 ; (2) 各 个 事 务 的 结 束 (CO M MI T 或 ROL LBACK) 标 记 ; (3) 各 个 事 务 的 所 有 更 新 操 作, 每 个 记 录 的 内 容 包 含 : 瞯 事 务 标 识 ( 标 明 是 哪 个 事 务 ) 瞯 操 作 的 类 型 ( 插 入 删 除 或 修 改 ) 瞯 操 作 对 象 ( 记 录 内 部 标 识 ) 瞯 更 新 前 数 据 的 旧 值 ( 对 插 入 操 作 而 言, 此 项 为 空 值 ) 瞯 更 新 后 数 据 的 新 值 ( 对 删 除 操 作 而 言, 此 项 为 空 值 ) 2. 事 务 日 志 文 件 (Logging) 事 务 日 志 用 于 保 持 数 据 库 的 一 致 性 事 务 日 志 文 件 必 须 遵 循 两 条 原 则 : (1) 事 务 的 次 序 严 格 按 并 发 事 务 执 行 的 时 间 次 序 (2) 必 须 先 写 日 志 事 务 文 件, 后 写 数 据 库 文 件 10.3 锁 机 制 锁 作 为 一 种 安 全 机 制, 用 以 控 制 多 个 用 户 的 并 发 操 作, 可 以 防 止 用 户 读 取 正 在 由 其 他 用 户 更 改 的 数 据 或 者 多 个 用 户 同 时 修 改 同 一 数 据, 从 而 确 保 事 务 完 整 性 和 数 据 库 一 致 性 10.3.1 锁 的 控 制 方 法 1. 锁 类 型 最 常 用 的 有 两 种 锁 : 排 它 锁 (Exclusive Locks,X 锁 ) 和 共 享 锁 (Share Locks,S 锁 ) 排 它 锁 (X) 又 称 为 写 锁 若 事 务 T 对 数 据 对 象 A 加 上 X 锁, 则 只 允 许 T 读 取 和 修 改 A, 其 他 任 何 事 务 都 不 能 再 对 A 加 任 何 类 型 的 锁, 直 到 T 释 放 A 上 的 锁 这 就 保 证 了 其 他 事 务 在 T 释 放 A 上 的 锁 之 前 不 能 再 读 取 和 修 改 A 排 它 锁 用 于 数 据 修 改 操 作, 用 以 确 保 不 会 同 时 对 同 一 资 源 进 行 并 发 修 改 排 它 锁 锁 定 的 资 源 不 能 被 其 他 并 发 事 务 读 取 或 修 改, 形 成 独 享 共 享 锁 (S) 又 称 为 读 锁 若 事 务 T 对 数 据 对 象 A 加 上 S 锁, 则 事 务 T 可 以 读 A 但 不 能 修 改 A, 其 他 事 务 只 能 再 对 A 加 S 锁, 而 不 能 加 X 锁, 直 到 T 释 放 A 上 的 S 锁 这 就
第 10 章 SQL Server 的 程 序 设 计 251 保 证 了 其 他 事 务 可 以 读 A, 但 在 T 释 放 A 上 的 S 锁 之 前 不 能 对 A 做 任 何 修 改 共 享 锁 用 于 只 读 操 作, 它 允 许 多 个 并 发 事 务 读 取 (SELEC T) 一 个 资 源, 但 是 任 何 其 他 事 务 都 不 能 修 改 锁 定 的 数 据 默 认 情 况 下, 一 旦 已 经 读 取 数 据, 便 立 即 释 放 资 源 上 的 共 享 锁, 除 非 将 事 务 隔 离 级 别 设 置 为 可 重 复 读 或 更 高 级 别 除 此 之 外, 还 有 修 改 锁 (U) 意 向 锁 (I) 结 构 锁 (Sch) 和 大 容 量 修 改 锁 (BU) 修 改 锁 用 于 可 更 新 资 源, 防 止 通 常 形 式 的 死 锁 ; 意 向 锁 用 于 建 立 锁 的 层 次 结 构, 表 示 SQ L Server 有 在 层 次 结 构 底 层 资 源 上 获 得 共 享 锁 或 排 它 锁 的 意 向 ; 结 构 锁 用 于 执 行 依 赖 于 表 结 构 的 操 作 ; 大 容 量 修 改 锁 用 于 向 表 中 复 制 数 据 并 指 定 T ABLOCK 时 使 用 大 容 量 更 新 锁 允 许 进 程 将 数 据 并 发 地 大 容 量 复 制 到 同 一 个 表, 同 时 防 止 其 他 不 进 行 大 容 量 复 制 数 据 的 进 程 访 问 该 表 2. 锁 的 粒 度 锁 对 象 的 大 小 称 为 锁 粒 度 锁 对 象 可 以 是 逻 辑 单 位, 这 时 的 粒 度 可 以 是 数 据 库 表 记 录 或 列 锁 对 象 也 可 以 是 物 理 单 位, 这 时 的 锁 对 象 可 以 是 数 据 块 或 物 理 记 录 不 同 的 粒 度 会 影 响 事 务 的 并 发 度 具 体 地,SQ L Server 可 以 锁 定 的 资 源 粒 度 包 括 : 数 据 库 (DB), 包 含 所 有 数 据 和 索 引 在 内 的 整 个 表 ( T AB) 文 件 ( FIL) 索 引 (IDX), 用 于 单 独 锁 定 表 中 的 一 行 ( 行 标 识 符 RID), 用 于 保 护 可 串 行 事 务 中 的 键 (KEY) 范 围, 索 引 中 的 行 锁 页 数 据 页 或 索 引 页 (PG) 区 域 (EX T), 相 邻 的 八 个 数 据 页 或 索 引 页 构 成 的 组 3. 两 段 锁 协 议 在 运 用 X 锁 和 S 锁 这 两 种 基 本 锁 对 数 据 对 象 加 锁 时, 还 需 要 约 定 一 些 规 则, 例 如, 何 时 申 请 X 锁 或 S 锁, 持 锁 时 间 和 何 时 释 放 等 这 些 规 则 称 为 封 协 议 (Locking Protocol) 对 锁 方 式 规 定 不 同 的 规 则, 就 形 成 了 各 种 不 同 的 锁 协 议 锁 协 议 是 指 每 个 事 务 的 执 行 可 以 分 为 两 个 阶 段 : 加 锁 阶 段 和 解 锁 阶 段 加 锁 阶 段 : 在 对 任 何 数 据 进 行 读 操 作 之 前 要 申 请 并 获 得 S 锁, 在 进 行 写 操 作 之 前 要 申 请 并 获 得 X 锁 加 锁 不 成 功, 则 事 务 进 入 等 待 状 态, 直 到 加 锁 成 功 才 继 续 执 行 解 锁 阶 段 : 当 事 务 释 放 了 一 个 锁 以 后, 事 务 进 入 解 锁 阶 段, 在 该 阶 段 只 能 进 行 解 锁 操 作 不 能 再 进 行 加 锁 操 作 锁 实 现 是 这 样 进 行 的, 事 务 开 始 后 就 处 于 加 锁 阶 段, 一 直 到 执 行 ROLLBACK 和 CO M MI T 之 前 都 是 加 锁 阶 段 ROLLBACK 和 CO M MI T 使 事 务 进 入 解 锁 阶 段, 即 在 ROL LBACK 和 CO M MI T 模 块 中 DBM S 释 放 所 有 锁 10.3.2 查 看 锁 的 信 息 使 用 系 统 存 储 过 程 sp_lock 查 看 锁 的 信 息, 其 语 法 形 式 是 : [EXEC] sp_lock [[ @ spid1 = ] spid1 ][,[ @ spio2 = ] spid2 ] 参 数 说 明 : [ @ spid1 = ] spid1 : 指 定 进 程 标 识 号 该 进 程 标 识 号 存 储 在 master.dbo. sysprocesses 中 如 果 没 有 指 定 spid1, 则 显 示 所 有 锁 的 信 息
252 SQL Server 数 据 库 应 用 技 术 [ @ spio2 = ] spid2 : 另 外 一 个 进 程 标 识 号 例 10.16 显 示 SQ L Server 中 当 前 所 有 锁 的 信 息 USE master GO EXEC sp_lock 使 用 sp_lock 查 看 锁 的 信 息 返 回 的 结 果 集 如 图 10 唱 2 所 示 图 10 唱 2 锁 信 息 的 结 果 集 图 10 唱 2 中 各 列 的 意 义 如 表 10 唱 1 所 示 表 10 唱 1 执 行 sp_lock 后 结 果 集 中 各 列 的 含 义 列 数 据 类 型 含 义 Spid smallint SQL Server 进 程 标 识 号 Dbid smallint 锁 定 资 源 的 数 据 库 标 识 号 Obiid int 锁 定 资 源 的 数 据 库 对 象 标 识 号 Indid smallint 锁 定 资 源 的 索 引 标 识 号 Type Resoure nchar(4) nchar(16) Mode nvarchar(8) 锁 请 求 资 源 的 锁 定 类 型 锁 的 类 型 : DB 数 据 库 ;FIL 文 件 ;IDX 索 引 ;PG 页 ;KBY 键 ;TAB 表 ; EXT 区 域 ;RID 行 标 识 符 被 锁 定 自 资 源 的 信 息 : RID 表 内 已 锁 定 行 的 行 标 识 符, 行 由 fleid.page.ri 组 合 进 行 标 识 ;KEY 用 于 表 示 索 引 链 值 的 十 六 进 制 数 字 ;PAG 页 码 由 fleid.page 组 合 进 行 标 识 ;EXT 被 锁 定 的 扩 展 盘 区 中 的 第 一 个 页 码 Status int 锁 的 请 求 状 态 : GRANT 锁 定 ;WAIT 阻 塞 ;CNVRT 转 换 10.3.3 死 锁 一 般 来 说, 对 数 据 库 的 修 改 由 一 个 事 务 组 成, 此 事 务 读 取 记 录, 获 取 资 源 的 共 享 锁, 然 后 修 改 行, 最 后 将 锁 转 换 为 排 它 锁 但 是 采 用 这 种 方 法 时, 如 果 两 个 事 务 获 得 了 资 源 上 的 共 享 锁, 然 后 试 图 同 时 更 新 数 据, 并 均 要 将 锁 转 换 为 排 它 锁, 此 时 两 个 事 务 都 会 等 待 对 方 释 放 共 享 锁, 形 成 死 锁 前 面 讨 论 的 修 改 锁 就 是 为 了 避 免 这 种 死 锁 现 象, 因 为 一 次 只 有 一 个 事 务 可 以 获 得 资 源 的 更 新 锁, 如 果 事 务 修 改 资 源, 则 直 接 将 修 改 锁 转 换 为 排 它 锁 否 则, 锁 转 换 为 共 享 锁 通 常, 根 据 使 用 不 同 的 锁 类 型 锁 定 资 源 然 而 当 某 组 资 源 的 两 个 或 多 个 线 程 之 间 有 循 环 相 关 性 时, 就 会 发 生 死 锁 现 象 在 数 据 库 中 解 决 死 锁 常 用 的 方 法 有 : (1) 要 求 每 个 事 务 一 次 就 将 要 使 用 的 数 据 全 部 加 锁, 否 则 就 不 能 继 续 执 行 (2) 预 先 规 定 一 个 锁 顺 序, 所 有 事 务 都 按 这 个 顺 序 实 行 加 锁, 这 样 也 不 会 发 生 死 锁 例 如, 通 过 SE T DEADLOCK PRIORI T Y 语 句 设 置 会 话 的 优 先 级, 如 果 设 置 为 LOW 说 明 该 会 话 的 优 先 级 较 低, 出 现 死 锁 时 首 先 中 断 该 会 话 的 事 务
第 10 章 SQL Server 的 程 序 设 计 253 (3) 允 许 死 锁 发 生, 系 统 采 用 某 些 方 式 诊 断 当 前 系 统 中 是 否 有 死 锁 发 生 10.4 游 标 游 标 (Cursor) 是 一 种 数 据 访 问 机 制, 它 允 许 用 户 访 问 单 独 的 数 据 行, 而 非 对 整 个 行 集 进 行 操 作 ( 通 过 使 用 SELEC T U PDA T E 或 者 DELE T E 语 句 进 行 ) 用 户 可 以 通 过 单 独 处 理 每 一 行 逐 条 收 集 信 息 并 对 数 据 逐 行 进 行 操 作 ; 这 样, 可 以 降 低 系 统 开 销 和 潜 在 的 阻 隔 情 况 用 户 也 可 以 使 用 这 些 数 据 生 成 T ransact 唱 SQ L 代 码 并 立 即 执 行 或 输 出 从 另 一 种 角 度 来 看, 游 标 是 用 户 使 用 T ransact 唱 SQ L 代 码 可 以 获 得 数 据 集 中 最 紧 密 的 数 据 的 一 种 方 法 10.4.1 游 标 的 定 义 及 其 优 点 1. 定 义 游 标 是 一 个 与 T ransact 唱 SQ L SELEC T 语 句 相 关 联 的 符 号 名, 它 使 用 户 可 逐 行 访 问 由 SQ L Server 返 回 的 结 果 集 游 标 包 括 以 下 两 个 部 分 : (1) 游 标 结 果 集 (Cursor Result Set) : 由 定 义 该 游 标 的 SELEC T 语 句 返 回 的 行 的 集 合 (2) 游 标 位 置 (Cursor Position) : 指 向 这 个 行 集 合 中 某 一 行 的 当 前 指 针 2. 游 标 和 面 向 集 合 的 处 理 SQ L 语 言 可 以 认 为 是 一 种 面 向 集 合 的 语 言, 它 对 数 据 库 中 数 据 的 操 作 是 面 向 集 合 的 操 作 所 谓 面 向 集 合 的 操 作 是 指 对 所 有 的 限 定 行 执 行 一 个 特 定 的 动 作 例 如, 对 课 程 号 最 后 两 位 为 06 的 多 媒 体 技 术, 所 有 学 生 成 绩 进 行 RO U ND(SQR T (grade) 倡 10,0) 的 计 算, 这 是 面 向 集 合 的 处 理, 其 SQ L 语 句 是 : SELECT stud_id,name, grade = ROUND(SQRT(grade) 倡 10,0) FROM stud_grade WHERE course_id LIKE % 06 实 际 上, 某 些 业 务 规 则 却 要 求 对 结 果 集 逐 行 执 行 操 作, 而 不 是 对 整 个 集 合 执 行 操 作 游 标 正 是 这 样 一 种 基 于 逐 行 操 作 结 果 集 的 技 术 方 法, 它 对 SELEC T 语 句 的 查 询 结 果 集 中 的 行 作 逐 行 处 理, 而 不 是 整 个 集 合 作 同 一 处 理, 并 基 于 游 标 的 当 前 位 置, 更 新 或 删 除 表 或 视 图 中 的 行 3. 游 标 的 优 点 从 游 标 定 义 可 以 得 到 游 标 的 如 下 优 点, 这 些 优 点 使 游 标 在 实 际 应 用 中 发 挥 了 重 要 作 用 (1) 允 许 程 序 对 由 查 询 语 句 SELEC T 返 回 的 行 集 合 中 的 每 一 行 执 行 相 同 或 不 同 的 操 作, 而 不 是 对 整 个 行 集 合 执 行 同 一 个 操 作 (2) 提 供 对 基 于 游 标 位 置 的 表 中 的 行 进 行 删 除 和 更 新 的 能 力 (3) 游 标 实 际 上 作 为 面 向 集 合 的 数 据 库 管 理 系 统 (RDBM S) 和 面 向 行 的 程 序 设 计 之 间 的 桥 梁, 使 这 两 种 处 理 方 式 通 过 游 标 沟 通 起 来
254 SQL Server 数 据 库 应 用 技 术 10.4.2 使 用 游 标 1. 声 明 游 标 声 明 游 标 的 语 法 形 式 : DECLARE cursor_name CURSOR FOR select_statement [FOR {READ ONLY UPDATE[OF column_name_list[,...]]}] 其 中,cursor_name 是 游 标 的 名 字 ;select_statement 是 定 义 游 标 结 果 集 的 查 询 语 句, 它 可 以 是 一 个 完 整 语 法 和 语 义 的 T ransact 唱 SQ L 的 SELEC T 语 句, 但 是 这 个 SELEC T 语 句 必 须 有 FRO M 子 句, 且 不 能 包 含 CO M PU T E IN T O 子 句 FOR READ ONLY 指 出 该 游 标 结 果 集 只 能 读, 不 能 修 改 ;FOR U PDA T E 指 出 该 游 标 结 果 集 可 以 被 修 改 ;OF column_name_list 列 出 可 以 被 修 改 的 列 的 名 单 注 意 : (1) 游 标 有 且 只 有 两 种 方 式 之 一 : FOR READ ONLY 或 FOR U PDA TE (2) 当 游 标 方 式 指 定 为 FOR READ ONLY 时, 游 标 涉 及 的 表 不 能 被 修 改 (3) 当 游 标 方 式 指 定 为 FOR U PDA T E 时, 可 以 删 除 或 更 新 游 标 涉 及 的 表 中 的 行 通 常, 这 也 是 默 认 方 式, 即 不 指 定 游 标 方 式 时 为 FOR U PDA T E 方 式 (4) 当 定 义 游 标 的 select_statement 中 包 含 DIS TINC T 选 项 GRO U P 子 句 集 合 函 数 U NION 操 作 符 等 内 容 时, 游 标 的 默 认 方 式 为 FOR READ ONLY (5) 声 明 游 标 的 DECL ARE C URSOR 语 句 必 须 是 在 该 游 标 的 任 何 OPEN 语 句 之 前, 而 且 DECL ARE C URSOR 语 句 必 须 单 个 组 成 一 个 批 处 理, 即 在 含 有 DECLARE CURSOR 语 句 的 批 处 理 中 不 可 能 含 有 其 他 SQ L 语 句 2. 打 开 游 标 打 开 游 标 的 语 法 形 式 : OPEN crusor_name 语 句 打 开 已 被 声 明 的 游 标, 分 析 定 义 这 个 游 标 的 select_statement, 并 使 结 果 集 对 于 处 理 是 可 用 的 其 中,cursor_name 是 一 个 已 声 明 的 尚 未 打 开 的 游 标 名 注 意 : (1) 当 游 标 打 开 成 功 时, 游 标 指 针 指 向 结 果 集 的 第 一 行 此 时 SQ L Server 暂 时 中 止 对 这 个 查 询 的 处 理 (2) 只 能 打 开 已 经 声 明 但 尚 未 打 开 的 游 标 3. 推 进 游 标 指 针 并 取 当 前 记 录 游 标 声 明 被 打 开 后, 游 标 指 针 位 于 结 果 集 的 第 一 行 之 前, 由 此 可 以 从 结 果 集 中 提 取 (FE T CH) 行 SQ L Server 将 沿 着 游 标 结 果 集 一 行 或 多 行 地 向 下 移 动 游 标 指 针, 不 断 提 取 结 果 集 中 的 数 据, 并 修 改 和 保 存 游 标 当 前 的 位 置, 直 到 结 果 集 中 行 全 部 被 提 取 读 取 游 标 中 的 数 据 的 语 法 形 式 : FETCH [[NEXT PRIOR FIRST LAST]FROM] cursor_name [INTO fetch_target_list]
第 10 章 SQL Server 的 程 序 设 计 255 其 中,cursor_name 为 一 已 声 明 并 已 打 开 的 游 标 名 字 ;IN T O fetch_target_list 指 定 存 放 被 提 取 的 列 数 据 的 目 的 变 量 清 单 这 个 清 单 中 变 量 的 个 数 数 据 类 型 顺 序 必 须 与 定 义 该 游 标 的 select_statement 的 select_list 中 列 出 的 列 清 单 相 匹 配 为 了 更 灵 活 地 操 纵 数 据, 可 以 把 从 已 声 明 并 已 打 开 的 游 标 结 果 集 中 提 取 的 列 数 据, 分 别 存 放 在 目 的 变 量 清 单 中 NEX T PRIOR FIRS T LAS T 是 游 标 移 动 方 向, 默 认 情 况 下 是 NEX T, 即 向 下 移 动 注 意 : (1) 默 认 情 况 下, 每 次 FE T CH 命 令 只 返 回 结 果 集 中 的 一 行 (2) 游 标 指 针 确 定 了 结 果 集 中 哪 一 行 可 以 被 提 取, 如 果 游 标 方 式 为 FOR U PDA T E, 也 就 确 定 哪 一 行 可 以 被 更 新 或 删 除 (3) 有 两 个 全 局 变 量 可 以 提 供 关 于 游 标 活 动 的 信 息 : 1 @ @ FE T CH_S T A T U S 保 存 着 最 后 FE T C H 语 句 执 行 后 的 状 态 信 息, 如 表 10 唱 2 所 示 表 10 唱 2 FETCH 语 句 的 状 态 值 值 含 义 0 表 示 成 功 完 成 fetch 语 句 - 1-2 表 示 fetch 语 句 有 错 误, 或 者 当 前 游 标 指 针 已 在 结 果 集 中 的 最 后 一 行, 结 果 集 中 不 再 有 数 据 表 提 取 的 行 不 存 在 2 @ @ rowcount 保 存 着 自 游 标 打 开 后 的 第 一 个 FE T CH 语 句, 直 到 最 近 一 次 的 FE T C H 语 句 为 止, 已 从 游 标 结 果 集 中 提 取 的 行 数 也 就 是 说 它 保 存 着 任 何 时 间 点 客 户 机 程 序 看 到 的 已 提 取 的 总 行 数 ( 累 计 行 数 ) 一 旦 结 果 集 中 所 有 行 都 被 提 取, 那 么 @ @ ro wcount 的 值 就 是 该 结 果 集 的 总 行 数 每 个 打 开 的 游 标 都 与 一 特 定 的 @ @ ro wcount 有 关, 关 闭 游 标 时, 该 @ @ ro wcount 变 量 也 被 删 除 在 FE T CH 语 句 执 行 后 查 看 这 个 变 量, 可 提 供 从 该 FE T CH 指 定 的 游 标 结 果 集 中 已 提 取 的 行 数 4. 使 用 游 标 修 改 数 据 U PDA T E 和 DELE T E 都 是 集 合 操 作 语 句, 如 果 只 想 修 改 或 删 除 其 中 某 个 记 录, 则 需 要 用 带 游 标 的 SELEC T 语 句 查 出 所 有 满 足 条 件 的 记 录, 从 中 进 一 步 找 出 要 修 改 或 删 除 的 记 录, 然 后 用 CU RREN T 形 式 的 U PDA T E 和 DELE T E 语 句 修 改 或 删 除 之 具 体 步 骤 是 : 1 用 DECL ARE 语 句 说 明 游 标,FOR U PDA T E OF column_name_list 2 用 OPEN 语 句 打 开 游 标 3 用 FE T C H 语 句 推 进 游 标 指 针 4 检 查 该 记 录 是 否 有 需 要 修 改 或 删 除 的 记 录 5 处 理 完 毕 用 CLOSE 语 句 关 闭 游 标 用 户 可 以 利 用 在 U PDA T E 或 DELE T E 语 句 中 使 用 游 标 来 更 新 或 删 除 表 或 视 图 中 的 行, 但 不 能 用 来 插 入 新 行
256 SQL Server 数 据 库 应 用 技 术 (1) 删 除 数 据 通 过 在 DELE T E 语 句 中 使 用 游 标 来 删 除 (DELE T E) 表 或 视 图 中 的 行 被 删 除 的 行 依 赖 于 游 标 指 针 的 当 前 值 (FE TC H 行 集 合 中 的 当 前 行 ) 其 部 分 语 法 形 式 为 : DELETE[FROM] {table_name view_name} WHERE CURRENT OF cursor_name 其 中,table_name view_name 为 欲 删 除 记 录 的 表 名 或 视 图 名, 它 必 须 是 定 义 该 游 标 的 SELEC T 语 句 中 的 表 名 或 视 图 名 ;cursor_ name 为 已 声 明 并 已 打 开 的 游 标 名 ;W HERE CURREN T OF 表 示 只 能 删 除 游 标 指 针 指 向 的 当 前 行 注 意 : 1 使 用 游 标 的 DELE TE 语 句, 一 次 只 能 删 除 游 标 指 针 指 向 的 那 一 行 OPEN 语 句 将 游 标 指 针 定 位 在 结 果 集 第 一 行, 可 以 用 一 个 或 多 个 FE TC H 语 句 把 游 标 指 针 定 位 在 要 被 删 除 的 行 2 在 DELE T E 语 句 中 使 用 的 游 标 必 须 声 明 为 FOR U PDA T E 方 式 而 且 声 明 游 标 的 SELEC T 语 句 中 不 能 含 有 连 接 操 作 或 涉 及 多 表 视 图, 否 则 即 使 声 明 中 指 明 了 FOR U PDA T E 方 式, 也 不 能 删 除 其 中 的 行 3 对 使 用 游 标 删 除 行 的 表, 要 求 有 一 个 惟 一 索 引 4 使 用 游 标 的 DELE TE 语 句, 删 除 一 行 后 将 游 标 指 针 向 前 移 动 一 行 (2) 更 新 数 据 通 过 在 U PDA T E 语 句 中 使 用 游 标 来 更 新 (U PDA T E) 表 或 视 图 中 的 行 被 更 新 的 行 依 赖 于 游 标 指 针 的 当 前 值 (FE TC H 结 果 集 中 的 当 前 行 ) 其 部 分 语 法 形 式 为 : UPDATE {table_name view_name} SET [table_name. view.]column_name1 = {expression1 NULL (select_statement)} [,column_name2 = {expression2 NULL (select_statement)}] WHERE CURRENT OF cursor_name 其 中, 紧 跟 U PDA T E 之 后 的 table_name view_name 是 要 更 新 的 表 名 或 视 图 名, 它 必 须 是 声 明 该 游 标 的 select 语 句 中 的 表 名 或 视 图 名 ;column_name i (i = 1,2, ) 是 要 更 新 的 列 的 列 名, 它 们 必 须 是 声 明 游 标 的 SELEC T 语 句 中 U PDA T E OF column_name_list 的 子 集 ;expression N U LL (select_ statement) 为 被 更 新 列 的 新 值, 它 可 以 是 一 个 表 达 式 空 值 或 子 查 询 W HERE CURREN T OF 使 SQ L Server 只 能 更 新 游 标 指 针 指 向 的 行 ;cursor_name 是 已 声 明 为 FOR U PDA T E 方 式, 并 已 打 开 的 游 标 名 注 意 : 1 使 用 U PDA T E...CU RREN T OF 语 句 一 次 只 能 更 新 当 前 游 标 指 针 确 定 的 那 一 行,OPEN 语 句 将 游 标 指 针 定 位 在 结 果 集 第 一 行, 可 以 使 用 一 个 或 多 个 FE T CH 语 句 把 游 标 指 针 定 位 在 要 被 更 新 的 行 2 用 U PDA T E...W HERE CURREN T OF 语 句 更 新 表 中 的 行 时, 不 会 移 动 游 标 指 针, 被 更 新 的 行 可 以 再 次 被 修 改, 直 到 下 一 个 FE T C H 语 句 的 执 行
第 10 章 SQL Server 的 程 序 设 计 257 3 U PDA T E...W HERE CU RREN T OF 语 句 可 以 更 新 多 表 视 图 或 被 连 接 的 多 表, 但 只 能 更 新 其 中 一 个 表 的 行, 即 所 有 被 更 新 的 列 都 来 自 同 一 个 表 5. 关 闭 游 标 关 闭 (Close) 游 标 是 停 止 处 理 定 义 游 标 的 那 个 查 询 关 闭 游 标 并 不 改 变 它 的 定 义, 随 后 可 以 再 次 用 OPEN 语 句 打 开 它,SQ L Server 会 用 该 游 标 的 定 义 重 新 创 建 这 个 游 标 的 一 个 结 果 集 关 闭 游 标 的 语 法 形 式 : CLOSE cursor_name 其 中,cursor_name 是 已 被 打 开 的 游 标 名 字 ; 当 退 出 这 个 SQ L Server 会 话 或 者 从 声 明 游 标 的 存 储 过 程 中 返 回 时,SQ L Server 会 自 动 地 关 闭 已 打 开 的 游 标 6. 释 放 游 标 释 放 (Deallocate) 游 标 将 释 放 所 有 分 配 给 此 游 标 的 资 源, 包 括 该 游 标 的 名 字 释 放 游 标 的 语 法 是 : DEALLOCATE CURSOR cursor_name 其 中,cursor_name 为 已 打 开 或 已 关 闭 的 游 标 名 字 如 果 释 放 一 个 已 打 开 未 关 闭 的 游 标, SQ L Server 会 自 动 先 关 闭 这 个 游 标, 然 后 再 释 放 它 注 意 : 关 闭 游 标 并 不 改 变 游 标 的 定 义, 可 以 不 用 再 次 声 明 一 个 被 关 闭 的 游 标 而 重 新 打 开 它 但 释 放 游 标 就 释 放 了 与 该 游 标 有 关 的 一 切 资 源, 也 包 括 游 标 的 声 明, 就 不 能 再 使 用 该 游 标 了 10.4.3 游 标 示 例 例 10.17 本 例 说 明 了 一 个 游 标 是 如 何 工 作 的 例 子 中 显 示 的 游 标 结 果 集 是 由 SQ L 语 句 创 建 的, 用 于 查 询 sysobjects 系 统 表, 从 而 获 得 student 数 据 库 中 的 所 有 用 户 表 名 并 通 过 游 标, 逐 行 处 理 每 个 表, 调 用 sp_spaceused 系 统 存 储 过 程 获 得 每 个 表 的 空 间 使 用 情 况 最 后 关 闭 和 释 放 游 标 USE student GO DECLARE @ table_name nvarchar(256) DECLARE tnames_cursor CURSOR FOR SELECT name FROM sysobjects WHERE objectproperty(id, IsUserTable ) = 1 ORDER BY name OPEN tnames_cursor FETCH NEXT FROM tnames_cursor INTO @ table_name WHILE ( @ @ FETCH_STAT US = 0) BEGIN EXEC sp_spaceused @ table_name
258 SQL Server 数 据 库 应 用 技 术 FETCH NEXT FROM tnames_cursor INTO @ table_name END CLOSE tnames_cursor DEALLOCATE tnames_cursor 例 10.18 统 计 多 媒 体 技 术 课 程 考 试 成 绩 的 各 分 数 段 的 分 布 情 况 DECLARE course_cursor CURSOR FOR 唱 声 明 游 标 SELECT grade FROM stud_grade WHERE course_id = (SELECT course_id FROM lesson_info WHERE course_name = 多 媒 体 技 术 ) DECLARE @ p_100 SMALLINT,@ p_90 SMALLINT,@ p_80 SMALLINT DECLARE @ p_70 SMALLINT, @ p_60 SMALLINT, @ p_others SMALLINT DECLARE @ p_grade SMALLINT SET @ p_100 = 0 SET @ p_90 = 0 SET @ p_80 = 0 SET @ p_70 = 0 SET @ p_60 = 0 SET @ p_others = 0 SET @ p_grade = 0 OPEN course_cursor 唱 打 开 游 标 LOOP : FETCH NEXT FROM course_cursor INTO @ p_grade 唱 使 用 游 标 提 取 数 据 IF ( @ p_grade = 100) SET @ p_100 = @ p_100 + 1 ELSE IF ( @ p_grade > = 90) SET @ p_90 = @ p_90 + 1 ELSE IF( @ p_grade > = 80) SET @ p_80 = @ p_80 + 1 ELSE IF ( @ p_grade > = 70) SET @ p_70 = @ p_70 + 1 ELSE IF ( @ p_grade > = 60) SET @ p_60 = @ p_60 + 1 ELSE SET @ p_others = @ p_others + 1 IF( @ @ FETCH_STAT US = 0) GOTO LOOP PRINT STR( @ p_100) +, + STR( @ p_90) +, + STR( @ p_80) +, PRINT STR( @ p_70) +, + STR( @ p_60) +, + STR( @ p_others) CLOSE course_cursor 唱 关 闭 游 标 倡 / DEALLOCATE course_cursor 唱 释 放 游 标 倡 / 实 训 1. 实 训 目 的 (1) 了 解 SQ L Server 程 序 设 计 的 方 法 (2) 学 会 批 处 理 流 程 控 制 事 务 处 理 锁 游 标 的 使 用 方 法
第 10 章 SQL Server 的 程 序 设 计 259 2. 实 训 的 知 识 准 备 充 分 理 解 批 处 理 流 程 控 制 事 务 处 理 锁 游 标 等 基 本 概 念, 知 晓 如 何 使 用 事 务, 以 及 在 什 么 情 况 下 需 要 使 用 事 务 掌 握 简 单 事 务 处 理 语 句 IF 语 句 W HILE 语 句 RE T URN 和 CASE 语 句, 以 及 使 用 游 标 的 声 明 打 开 游 标 读 取 数 据 关 闭 游 标 释 放 游 标 这 里 如 果 能 将 循 环 处 理 表 的 语 句 转 换 为 存 储 过 程 并 用 游 标 来 处 理, 则 会 大 大 提 高 数 据 的 处 理 速 度 3. 实 训 内 容 和 步 骤 (1) 批 处 理 写 几 个 批 处 理, 完 成 下 列 任 务 : 首 先 创 建 一 个 名 为 dept_code 的 院 系 代 码 表, 然 后 构 建 一 个 无 穷 循 环 结 构, 插 入 数 据 到 表 中, 直 到 有 10 条 记 录 用 变 量 记 录 已 存 储 到 表 中 的 记 录 数, 当 变 量 的 值 达 到 10 时, 使 用 BREA K 语 句 退 出 循 环 最 后 显 示 所 输 入 的 记 录 (2) 流 程 控 制 自 行 练 习 : 运 用 流 程 控 制 语 句 (DECLARE BEGIN...END IF...ELSE W HILE BREA K CON TIN UE 等 ) 写 一 段 小 程 序 (3) 事 务 处 理 运 用 事 务 处 理 将 student 数 据 库 中 课 程 信 息 表 lesson_info 的 多 媒 体 技 术 课 程 编 号 course_id 由 0401010106 修 改 为 0401010116 因 为 课 程 编 号 出 现 在 课 程 信 息 表 (lesson_info) 课 程 安 排 表 (teach_schedule) 学 生 成 绩 表 (stud_grade) 教 师 基 本 信 息 表 (teacher_info) 中, 所 以 要 将 四 个 表 中 的 课 程 编 号 都 修 改, 而 不 能 只 修 改 其 中 的 一 个 表 用 户 必 须 通 知 DBM S, 通 知 的 方 法 是 将 下 面 的 四 个 U PDA T E 语 句 定 义 成 一 个 事 务 通 过 事 务 来 保 证 student 数 据 库 中 lesson_info,teach_ schedule,stud _ grade,teacher _ info 的 所 有 课 程 号 course _ id 由 0401010106 修 改 为 0401010116, 以 达 到 数 据 保 持 一 致 性 的 目 的 USE student GO BEGIN TRAN stud_transaction / 倡 开 始 一 个 事 务 倡 / UPDATE lesson_info SET course_id = 0401010116 WHERE course_id = 0401010106 SAVE TRAN stud_savepoint / 倡 保 存 能 回 滚 的 点 倡 / UPDATE teach_schedule SET course_id = 0401010116 WHERE course_id = 0401010106 UPDATE stud_grade SET course_id = 0401010116 WHERE course_id = 0401010106 UPDATE teacher_info SET course_id = 0401010116 WHERE course_id = 0401010106 ROLLBACK TRAN stud_transaction / 倡 回 滚 本 次 事 务 至 保 存 点 倡 / COM MIT TRAN stud_transaction 在 事 务 stud_transaction 中, 由 于 设 置 了 中 间 回 滚 点, 所 以 当 提 交 事 务 时 由 于 执 行 了 回 滚 点 stud_savepoint 的 回 滚 语 句, 所 以 只 有 对 lesson_info 的 course_id 进 行 了 修 改, 而 表 teach_schedule,stud_grade,teacher_info 中 相 似 的 修 改 没 有 发 生 如 果 将 回 滚 语 句 改 写 为 ROLLBACK T RA N 或 ROLLBACK T RA N stud_transaction, 那 将 使 事 务 中 所 有
260 SQL Server 数 据 库 应 用 技 术 的 修 改 都 被 取 消 (4) 制 造 死 锁 1 在 查 询 分 析 器 输 入 并 执 行 下 列 语 句 : USE student SET DEADLOCK_PRIORITY LOW / 倡 指 定 当 前 会 话 为 死 锁 首 选 牺 牲 品 倡 / BEGIN TRANSACTION UPDATE stud_info SET mark = 565 WHERE stud_id = 0401030101 / 倡 第 1 个 事 务 倡 / 2 单 击 工 具 栏 上 的 新 建 查 询 图 标, 新 建 一 个 查 询 分 析 器 窗 口, 在 新 的 查 询 分 析 器 中 输 入 并 执 行 下 列 语 句 : BEGIN TRANSACTION UPDATE stud_grade SET grade = 65 WHERE stud_id = 0401040112 / 倡 第 2 个 事 务 倡 / 3 切 换 到 第 一 个 查 询 分 析 器 窗 口, 输 入 并 执 行 下 列 语 句 : UPDATE stud_grade SET grade = 67 WHERE stud_id = 0401040112 / 倡 第 1 个 事 务 倡 / 此 时, 事 务 1 和 事 务 2 都 锁 住 了 stud_grade 表 中 stud_id = 0401040112 的 记 录, 所 以 第 1 个 事 务 被 第 2 个 事 务 阻 止, 但 还 没 有 发 生 死 锁 4 切 换 到 第 二 个 查 询 分 析 器 窗 口, 输 入 并 执 行 下 列 语 句 : UPDATE stud_info SET mark = 568 WHERE stud_id = 0401030101 / 倡 第 2 个 事 务 倡 / 此 时, 由 于 事 务 1 等 待 事 务 2 释 放 stud_grade 表 中 stud_id = 0401040112 记 录 的 锁, 而 事 务 2 又 等 待 事 务 1 释 放 stud_info 表 中 stud_id = 0401030101 记 录 的 锁, 这 样 互 相 等 待 而 造 成 死 锁 因 为 第 一 个 事 务 的 DEADLOCK_PRIORI T Y 选 项 设 置 为 LOW,SQ L Server 能 自 动 检 测 并 能 将 其 解 除 所 以 第 1 个 事 务 立 即 终 止 (5) 游 标 的 使 用 1 定 义 一 个 游 标 stud_cursor, 逐 行 读 取 stud_info 表 中 的 数 据 USE student GO SELECT 倡 FROM stud_info / 倡 显 示 表 stud_info 中 的 所 有 数 据 倡 / GO DECLARE stud_cursor CURSOR / 倡 声 明 一 个 游 标 stud_cursor 倡 / FOR SELECT 倡 FROM stud_info OPEN stud_cursor / 倡 打 开 游 标 倡 / FETCH NEXT FROM stud_cursor / 倡 读 取 该 游 标 中 的 第 一 行 数 据 倡 / / 倡 检 查 @ @ FETCH_STATUS 的 值, 以 确 保 新 位 置 的 有 效 性 倡 / WHILE @ @ FETCH_ST AT US = 0 BEGIN FETCH NEXT FROM stud_cursor END CLOSE stud_cursor / 倡 关 闭 游 标 倡 / DEALLOCATE stud_cursor
第 10 章 SQL Server 的 程 序 设 计 261 2 定 义 一 个 游 标 stud_cursor, 删 除 表 stud_info 中 的 第 一 行 数 据 USE student GO SELECT 倡 FROM stud_info GO DECLARE stud_cursor CURSOR FOR SELECT 倡 FROM stud_info OPEN stud_cursor FETCH NEXT FROM stud_cursor DELETE FROM stud_info WHERE CURRENT OF stud_cursor CLOSE stud_cursor DEALLOCATE stud_cursor GO SELECT 倡 FROM stud_info / 倡 显 示 修 改 前 表 stud_info 中 的 所 有 数 据 倡 / / 倡 声 明 一 个 游 标 gzb_cursor 倡 / / 倡 打 开 游 标 倡 / / 倡 读 取 游 标 中 的 第 一 行 数 据 倡 / / 倡 删 除 游 标 中 的 第 一 行 数 据 倡 / / 倡 关 闭 游 标 倡 / / 倡 显 示 修 改 后 表 stud_info 中 的 所 有 数 据 倡 / 3 定 义 一 个 游 标 stud_cursor, 更 新 表 stud_info 中 的 数 据 USE student GO SELECT 倡 FROM stud_info GO DECLARE stud_cursor CURSOR FOR SELECT 倡 FROM stud_info OPEN stud_cursor FETCH NEXT FROM stud_cursor UPDATE stud_info SET bh = 111 WHERE CURRENT OF stud_cursor CLOSE stud_cursor DEALLOCATE stud_cursor GO SELECT 倡 FROM stud_info / 倡 显 示 修 改 前 表 stud_info 中 的 所 有 数 据 倡 / / 倡 声 明 一 个 游 标 stud_cursor 倡 / / 倡 打 开 游 标 倡 / / 倡 读 取 游 标 中 的 第 一 行 数 据 倡 / / 倡 更 新 当 前 游 标 指 针 所 在 的 行 中 BH 列 的 内 容 倡 / / 倡 关 闭 游 标 倡 / / 倡 显 示 修 改 后 表 stud_info 中 的 所 有 数 据 倡 / 4 自 行 练 习 : 定 义 一 个 游 标 stud_cursor, 删 除 表 stud_info 中 的 某 一 行 数 据 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 什 么 是 批 处 理? 用 什 么 命 令 来 通 知 SQ L Server 批 处 理 语 句 的 结 束 (2) 什 么 是 流 程 控 制? 可 以 用 什 么 流 控 制 语 句 来 创 建 一 个 循 环 结 构? (3) 什 么 是 事 务? 如 果 要 取 消 一 个 事 务, 使 用 什 么 语 句?
SQL Server 数 据 库 应 用 技 术 (4) 简 述 锁 机 制, 解 释 死 锁 的 含 义 (5) 请 说 明 下 面 批 处 理 无 效 的 原 因, 并 指 出 能 够 正 常 执 行 的 方 法 USE student GO CREATE T ABLE dept_code (deptcode CH AR(6),deptname VARCH AR(20)) GO ALTER TABLE ADD director CHAR(8) INSERT INTO dept_code VALUES
第 10 章 SQL Server 的 程 序 设 计 263 SELECT @ courseno = course_id SELECT @ score = grade PRINT 学 号 + @ no + 姓 名 + @ name + 课 程 号 + @ courseno + 成 绩 + STR ( @ score) END FETCH NEXT FROM stud_cursor INTO @ no,@ name,@ courseno,@ score END (7) 请 用 适 当 的 语 句 完 善 下 列 程 序 USE student GO DECLARE teacher_cursor CURSOR FOR SELECT 倡 FROM teacher_info / 倡 打 开 游 标 倡 / FETCH NEXT FROM teacher_cursor WHILE @ @ FETCH_ST AT US = 0 BEGIN / 倡 提 取 数 据 倡 / END (8) 请 用 适 当 的 语 句 完 善 下 列 程 序 USE student GO DECLARE teacher_cursor CURSOR FOR SELECT 倡 FROM teacher_info OPEN teacher_cursor / 倡 读 取 游 标 中 的 数 据, 并 且 游 标 指 向 下 一 行 倡 / / 倡 删 除 游 标 中 的 第 一 行 数 据 倡 / CLOSE teacher_cursor 3. 阅 读 下 列 基 本 的 Transact 唱 SQL 游 标 例 子, 回 答 下 列 问 题 USE student DECLARE @ tablename nvarchar(256) DECLARE tnames_cursor CURSOR FOR SELECT name FROM sysobjects WHERE objectproperty(id, IsUserTable ) = 1 ORDER BY name OPEN tnames_cursor
264 SQL Server 数 据 库 应 用 技 术 FETCH NEXT FROM tnames_cursor INTO @ table_name WHILE ( @ @ FETCH_STAT US = 0 ) BEGIN EXEC sp_spaceused @ tablename FETCH NEXT FROM tnames_cursor INTO @ tablename END CLOSE tnames_cursor DEALLOCATE tnames_cursor (1) 此 例 中 的 游 标 名 是 什 么? (2) 此 例 中 的 游 标 类 型 是 什 么? (3) 此 例 中 的 游 标 所 指 示 的 结 果 集 是 什 么? (4) 请 说 明 EXEC sp_spaceused @ tablename 命 令 的 作 用 (5) 请 说 明 FE T CH NEX T FRO M tnames _ cursor IN T O @ table _ name 命 令 的 作 用 (6) 请 说 明 此 例 中 的 循 环 条 件
第 11 章 数 据 转 换 服 务 SQ L Server 中 的 数 据 传 输 的 工 具, 例 如 导 入 / 导 出 向 导 D T S 设 计 器 等 可 以 将 数 据 从 一 个 数 据 环 境 传 输 到 另 一 个 数 据 环 境 本 章 就 将 介 绍 数 据 导 入 / 导 出 的 概 念 和 SQ L Server 的 数 据 传 输 服 务, 以 及 使 用 导 入 / 导 出 向 导 和 D T S 设 计 器 来 完 成 不 同 数 据 环 境 间 的 数 据 传 输 过 程 11.1 导 入 / 导 出 概 述 作 为 一 名 数 据 库 管 理 员, 经 常 需 要 将 一 个 数 据 环 境 中 的 数 据 传 输 到 另 一 种 数 据 环 境 中, 或 者 是 将 几 种 数 据 环 境 中 的 数 据 经 合 并 后 复 制 到 某 种 数 据 环 境 中 这 里 说 的 数 据 环 境 种 类 较 多, 它 有 可 能 是 一 种 应 用 程 序, 有 可 能 是 不 同 厂 家 的 数 据 库 管 理 系 统, 也 有 可 能 是 文 本 文 件 电 子 邮 件 或 电 子 表 格 (Excel) 等 将 数 据 从 一 个 数 据 环 境 传 输 到 另 一 个 数 据 环 境 就 是 数 据 的 导 入 / 导 出 导 入 数 据 是 从 SQ L Server 的 外 部 数 据 源 ( 如 ASCII 文 本 文 件 ) 中 检 索 数 据, 并 将 数 据 插 入 到 SQ L Server 表 的 过 程 导 出 数 据 是 将 SQ L Server 实 例 中 的 数 据 析 取 为 某 些 用 户 指 定 格 式 的 过 程, 例 如 将 SQ L Server 表 的 内 容 复 制 到 Microsoft Access 数 据 库 中 将 数 据 从 外 部 数 据 源 导 入 SQ L Server 实 例 很 可 能 是 建 立 数 据 库 后 要 执 行 的 第 一 步 数 据 导 入 SQ L Server 数 据 库 后, 即 可 开 始 使 用 该 数 据 库 将 数 据 导 入 SQ L Server 实 例 可 以 是 一 次 性 操 作, 例 如 将 另 一 个 数 据 库 系 统 中 的 数 据 迁 移 到 SQ L Server 实 例 在 初 次 迁 移 完 成 后, 该 SQ L Server 数 据 库 将 直 接 用 于 所 有 与 数 据 相 关 的 任 务, 而 不 再 使 用 原 来 的 系 统, 不 需 要 进 一 步 导 入 数 据 导 入 数 据 也 可 以 是 不 断 进 行 的 任 务 例 如, 创 建 了 用 于 行 政 报 告 的 新 SQ L Server 数 据 库, 但 是 数 据 驻 留 在 旧 式 系 统 中, 并 且 该 旧 式 系 统 由 大 量 业 务 应 用 程 序 进 行 更 新 在 这 种 情 况 下, 可 以 每 天 或 每 周 将 旧 式 系 统 中 的 数 据 复 制 或 更 新 到 SQ L Server 实 例 导 出 数 据 的 发 生 频 率 通 常 较 低 SQ L Server 提 供 多 种 工 具 和 功 能, 使 应 用 程 序 ( 如 Access 或 Microsoft Excel) 可 以 直 接 连 接 并 操 作 数 据, 而 不 必 在 操 作 数 据 前 先 将 所 有 数 据 从 SQ L Server 实 例 复 制 到 该 工 具 中 但 是, 可 能 需 要 定 期 将 数 据 从 SQ L Server 实 例 导 出 在 这 种 情 况 下, 可 以 将 数 据 先 导 出 到 文 本 文 件, 然 后 由 应 用 程 序 读 取, 或 者 采 用 特 殊 方 法 复 制 数 据 例 如, 可 以 将 SQ L Server 实 例 中 的 数 据 析 取 为 Excel 电 子 表 格 格 式,
266 SQL Server 数 据 库 应 用 技 术 并 将 其 存 储 在 便 携 式 计 算 机 中, 以 便 在 商 务 旅 行 中 使 用 SQ L Server 提 供 多 种 工 具 用 于 各 种 数 据 源 的 数 据 导 入 和 导 出, 这 些 数 据 源 包 括 文 本 文 件 ODBC 数 据 源 ( 例 如 Oracle 数 据 库 ) OLE DB 数 据 源 ( 例 如 其 他 SQ L Server 实 例 ) ASCII 文 本 文 件 和 Excel 电 子 表 格 此 外,SQ L Server 复 制 使 数 据 得 以 在 整 个 企 业 内 发 布, 在 各 个 位 置 之 间 复 制 数 据, 以 及 自 动 同 步 不 同 数 据 复 本 之 间 的 更 改 11.2 导 入 数 据 SQ L Server 2000 提 供 多 种 工 具 来 完 成 数 据 的 导 入, 例 如 D T S 导 入 / 导 出 向 导 D T S 设 计 器 D T S 大 容 量 插 入 操 作 bcp 大 容 量 复 制 程 序 等 由 于 使 用 图 形 界 面 的 D T S 导 入 / 导 出 向 导 直 观 简 单 这 里, 将 介 绍 使 用 D T S 导 入 / 导 出 向 导 来 完 成 导 入 Excel 工 作 表 和 导 入 文 本 文 件 的 整 个 过 程 11.2.1 导 入 Excel 工 作 表 (1) 首 先 在 企 业 管 理 器 中 单 击 工 具, 启 动 数 据 转 换 服 务 中 的 D T S 导 入 向 导, 系 统 弹 出 如 图 11 唱 1 所 示 的 D T S 导 入 / 导 出 向 导 界 面 图 11 唱 1 DTS 导 入 / 导 出 向 导 (2) 单 击 下 一 步 按 钮 后, 用 户 可 以 在 选 择 数 据 源 对 话 框 中 选 择 数 据 源 默 认 的 数 据 源 是 用 于 SQ L Server 的 Microsoft OLE DB 提 供 程 序, 它 用 于 连 接 到 SQ L Server 实 例 这 里, 计 划 将 Excel 表 中 的 数 据 导 入 到 SQ L Server 中, 因 此 需 要 在 数 据 源 的 下 拉 列 表 中 选 择 Microsoft Excel 97 唱 2000, 然 后 单 击 文 件 名 后 的 省 略 号 按 钮, 以 选 择 要 导 入 的 Excel 表 的 文 件 名, 如 图 11 唱 2 所 示 (3) 单 击 下 一 步 按 钮, 系 统 弹 出 如 图 11 唱 3 所 示 的 选 择 目 的 对 话 框, 目 的 就 是 选 择 把 数 据 导 入 到 哪 里 可 以 在 目 的 的 下 拉 框 中 选 择 是 将 数 据 导 入 到 SQ L Server Excel 表 格 或 Access 等 其 他 数 据 库 中 (4) 在 服 务 器 里 选 择 目 的 数 据 库 所 在 的 服 务 器, 在 数 据 库 下 拉 选 择 框 里 选 择 目 的 数 据 库 的 名 称 然 后 单 击 下 一 步, 系 统 弹 出 如 图 11 唱 4 所 示 的 指 定 表 复 制 或 查 询 的 对 话
第 11 章 数 据 转 换 服 务 267 图 11 唱 2 选 择 数 据 源 图 11 唱 3 选 择 目 的 图 11 唱 4 指 定 表 复 制 或 查 询
268 SQL Server 数 据 库 应 用 技 术 框 选 择 第 一 项 从 源 数 据 库 复 制 表 和 视 图 (5) 单 击 下 一 步 按 钮, 可 以 在 如 图 11 唱 5 所 示 的 选 择 源 表 和 视 图 对 话 框 中 选 择 需 要 复 制 的 表 和 视 图 这 里 选 择 表 XSCJ, 也 可 以 创 建 新 表 或 视 图 图 11 唱 5 选 择 源 表 和 视 图 (6) 单 击 下 一 步 按 钮, 弹 出 如 图 11 唱 6 所 示 的 保 存 调 度 和 复 制 包, 可 以 调 度 D T S 包 的 执 行 时 间, 这 里 选 择 立 即 执 行 也 可 以 选 择 是 否 保 存 D T S 包, 以 便 以 后 执 行 相 同 的 D T S 任 务 图 11 唱 6 保 存 调 度 和 复 制 包 (7) 单 击 下 一 步 按 钮 之 后, 在 如 图 11 唱 7 所 示 的 对 话 框 中 单 击 完 成 按 钮, 即 可 以 完 成 将 Excel 表 导 入 到 数 据 库 的 工 作
第 11 章 数 据 转 换 服 务 269 11.2.2 导 入 文 本 文 件 图 11 唱 7 导 入 / 导 出 向 导 摘 要 SQ L Server 2000 除 了 可 以 将 数 据 表 和 Excel 电 子 表 格 的 数 据 导 入 到 数 据 库 中, 还 可 以 将 文 本 文 件 中 的 数 据 导 入 到 SQ L Server 中 下 面 使 用 企 业 管 理 器 中 的 导 入 / 导 出 向 导 将 一 个 记 录 了 课 程 信 息 的 文 本 文 件 课 程 信 息.txt 导 入 到 数 据 库 student 中 的 表 aaaa 中 (1) 首 先 启 动 企 业 管 理 器 中 的 导 入 / 导 出 向 导, 在 如 图 11 唱 8 所 示 的 选 择 数 据 源 对 话 框 中 的 数 据 源 下 拉 框 中 选 择 文 本 文 件, 并 选 择 需 要 导 入 的 文 本 文 件 名 图 11 唱 8 选 择 数 据 源 (2) 单 击 下 一 步 按 钮, 在 如 图 11 唱 9 所 示 的 选 择 文 件 格 式 对 话 框 中, 必 须 根 据 图 中 的 文 件 预 览 来 选 择 是 带 分 隔 符 还 是 固 定 宽 度 的 源 文 件 格 式, 即 源 文 件 中 数 据 列 与 列 之 间 的 间 隔 方 式 如 果 选 择 与 源 文 件 不 一 致 将 会 导 致 错 误
270 SQL Server 数 据 库 应 用 技 术 (3) 单 击 下 一 步 按 钮, 在 选 择 目 的 对 话 框 中 选 择 将 数 据 导 入 到 哪 个 SQ L Server 服 务 器 的 哪 个 数 据 库 中, 如 图 11 唱 10 所 示 图 11 唱 9 选 择 文 件 格 式 图 11 唱 10 选 择 目 的 (4) 单 击 下 一 步 按 钮, 在 选 择 源 表 和 视 图 对 话 框 中 单 击 目 的 下 拉 框, 选 择 将 数 据 导 入 到 目 的 数 据 库 的 哪 一 个 数 据 表, 这 里 选 定 student 数 据 库 的 aaaa 数 据 表 同 时 单 击 转 换 按 钮, 如 果 数 据 导 入 到 目 的 时 需 要 进 行 转 换, 就 可 以 在 此 进 行 转 换 设 置 如 图 11 唱 11 所 示 (5) 单 击 下 一 步 按 钮, 在 保 存 调 度 和 复 制 包 对 话 框 里 设 置 D T S 包 的 运 行 调 度, 如 图 11 唱 12 所 示 (6) 单 击 下 一 步 按 钮 之 后, 单 击 完 成 按 钮 即 可 完 成 将 文 本 文 件 导 入 到 SQ L Server 中 之 后, 如 果 打 开 企 业 管 理 器 中 student 数 据 库 的 aaaa 数 据 表, 就 会 看 到 文 本 文 件 课 程 信 息.txt 的 数 据 已 经 导 入 到 aaaa 表 中 了 如 图 11 唱 13 所 示
第 11 章 数 据 转 换 服 务 271 图 11 唱 11 选 择 源 表 和 视 图 图 11 唱 12 保 存 调 度 和 复 制 包 图 11 唱 13 企 业 管 理 器 中 aaaa 数 据 表
272 SQL Server 数 据 库 应 用 技 术 11.3 导 出 数 据 SQ L Server 不 仅 可 以 将 数 据 导 入, 而 且 也 可 以 将 数 据 导 出 到 其 他 的 数 据 库 文 本 文 件 或 Excel 表 格, 等 下 面 介 绍 将 SQ L Server 数 据 库 中 的 数 据 分 别 导 出 到 Access 数 据 库 和 文 本 文 件 的 过 程 11.3.1 导 出 数 据 至 Access 导 出 数 据 至 Access 的 过 程 与 将 Access 数 据 导 入 数 据 库 的 过 程 相 似, 不 同 的 是 导 入 / 导 出 的 源 和 目 的 不 同 将 数 据 库 导 出 到 Access, 其 数 据 源 是 SQ L Server 数 据 库, 其 目 的 是 Access 现 在 计 划 将 SQ L Server 服 务 器 上 的 student 数 据 库 导 出 到 Access 中 如 果 Access 目 的 文 件 不 存 在, 则 需 要 先 打 开 Access, 并 建 立 一 个 空 的 Access 数 据 库, 为 了 保 持 一 致, 将 其 取 名 为 student.mdb (1) 首 先, 打 开 企 业 管 理 器 并 展 开 student 数 据 库, 然 后 打 开 导 入 / 导 出 向 导, 在 如 图 11 唱 14 所 示 的 选 择 数 据 源 对 话 框 中 选 择 数 据 源 为 用 于 SQ L Server 的 Microsoft OLE DB 提 供 程 序, 数 据 库 为 student, 然 后 单 击 下 一 步 按 钮 图 11 唱 14 选 择 数 据 源 (2) 在 如 图 11 唱 15 所 示 的 选 择 目 的 对 话 框 中 选 择 目 的 下 拉 框 为 Microsoft Access, 并 单 击 文 件 名 旁 边 的 省 略 号 按 钮, 选 择 刚 才 在 Access 中 建 立 的 空 数 据 库 文 件 student.mdb, 然 后 单 击 下 一 步 按 钮 (3) 在 选 择 源 表 和 视 图 对 话 框 中 选 择 所 要 导 出 的 数 据 表 或 视 图, 如 图 11 唱 16 所 示 (4) 其 他 步 骤 与 导 入 操 作 基 本 一 致, 读 者 根 据 向 导 提 示 一 步 步 就 可 完 成 整 个 将 数 据 库 导 出 到 Access 的 操 作 (5) 最 后 可 以 打 开 student.mdb 文 件 查 看 导 出 的 数 据 如 图 11 唱 17 所 示
第 11 章 数 据 转 换 服 务 273 图 11 唱 15 选 择 目 的 图 11 唱 16 选 择 源 表 和 视 图 图 11 唱 17 Access 中 查 看 导 出 的 数 据
274 SQL Server 数 据 库 应 用 技 术 11.3.2 导 出 数 据 至 文 本 文 件 导 出 数 据 至 文 本 文 件 的 过 程 与 将 文 本 文 件 的 数 据 导 入 数 据 库 的 过 程 一 样, 不 同 的 是 导 入 / 导 出 的 源 和 目 的 不 同 将 数 据 库 导 出 到 文 本 文 件, 其 数 据 源 是 SQ L Server 数 据 库, 其 目 的 是 文 本 文 件 现 在 计 划 将 SQ L Server 服 务 器 上 的 student 数 据 库 中 的 数 据 表 lesson_info 导 出 到 文 本 文 件 中 如 果 目 的 文 件 不 存 在, 则 需 要 先 创 建 一 个 空 的 文 本 文 件, 为 了 保 持 一 致, 将 其 取 名 为 lesson_info.txt (1) 首 先, 打 开 企 业 管 理 器 并 展 开 student 数 据 库, 然 后 打 开 导 入 / 导 出 向 导, 在 如 图 11 唱 18 所 示 的 选 择 数 据 源 对 话 框 中 选 择 数 据 源 为 用 于 SQ L Server 的 Microsoft OLE DB 提 供 程 序, 数 据 库 为 student, 然 后 单 击 下 一 步 按 钮 图 11 唱 18 选 择 数 据 源 (2) 在 如 图 11 唱 19 所 示 的 选 择 目 的 对 话 框 中 选 择 目 的 下 拉 框 为 文 本 文 件, 并 单 击 文 件 名 旁 边 的 省 略 号 按 钮, 选 择 刚 才 建 立 的 空 文 本 文 件 student.txt, 然 后 单 击 下 一 步 按 钮 图 11 唱 19 选 择 目 的
第 11 章 数 据 转 换 服 务 275 (3) 在 目 的 文 件 格 式 对 话 框 中 选 择 所 要 导 出 的 数 据 表 或 视 图, 如 图 11 唱 20 所 示 图 11 唱 20 选 择 目 的 文 件 格 式 (4) 其 他 步 骤 与 导 入 操 作 基 本 一 致, 读 者 可 以 根 据 向 导 提 示 一 步 步 就 可 完 成 整 个 将 数 据 库 导 出 到 文 本 文 件 的 操 作 (5) 最 后 可 以 打 开 lesson_info.txt 文 件 查 看 导 出 的 数 据 如 图 11 唱 21 所 示 图 11 唱 21 记 事 本 查 看 导 出 的 数 据 11.4 使 用 DTS 设 计 器 D T S 设 计 器 允 许 以 图 形 化 的 方 式 创 建 数 据 源 和 数 据 目 的 的 连 接 配 置 D T S 任 务 执 行 D T S 转 换 和 指 定 优 先 约 束 等 可 以 用 拖 放 方 式 来 完 成 对 象 的 设 置, 然 后 在 设 计 区 中 创 建 D T S 包 (1) 打 开 企 业 管 理 器, 右 击 左 边 控 制 台 树 中 的 数 据 转 换 服 务, 然 后 单 击 新 建 包 系 统 出 现 如 图 11 唱 22 所 示 的 界 面 图 11 唱 22 显 示 了 D T S 设 计 器 的 用 户 界 面 它 的 左 边 工
276 SQL Server 数 据 库 应 用 技 术 具 栏 的 连 接 部 分 提 供 了 一 些 可 用 的 连 接 数 据 源, 下 面 的 任 务 部 分 提 供 了 D T S 设 计 器 能 提 供 数 据 转 换 任 务 等 可 以 将 左 边 的 图 标 拖 放 到 右 边 的 设 计 区 中, 以 图 形 化 的 方 式 来 创 建 新 的 D T S 包 和 执 行 数 据 转 换 任 务 图 11 唱 22 DTS 设 计 器 的 用 户 界 面 (2) 使 用 D T S 设 计 器 来 创 建 D T S 包 时, 第 一 步 时 选 择 数 据 源 可 以 将 数 据 源 对 象 从 连 接 工 具 栏 中 拖 放 到 设 计 区 中, 也 可 以 从 连 接 菜 单 中 选 择 数 据 源 一 旦 拖 放 成 功, 系 统 弹 出 连 接 属 性 对 话 框, 在 此 可 以 配 置 数 据 源 如 图 11 唱 23 所 示 图 11 唱 23 连 接 属 性 (3) 接 着, 以 同 样 的 方 式 来 配 置 数 据 目 的, 如 图 11 唱 24 所 示
第 11 章 数 据 转 换 服 务 277 图 11 唱 24 配 置 数 据 源 和 数 据 目 的 (4) 接 着, 需 要 使 用 任 务 菜 单 或 者 任 务 工 具 栏 来 确 定 需 要 生 成 的 任 务 若 选 择 了 转 换 数 据 任 务, 并 分 别 单 击 数 据 源 和 数 据 目 的, 将 会 显 示 从 数 据 源 指 向 数 据 目 的 的 深 灰 色 箭 头 如 图 11 唱 25 所 示 图 11 唱 25 转 换 数 据 任 务 (5) 双 击 数 据 源 和 数 据 目 的 之 间 的 深 灰 色 箭 头, 就 可 以 打 开 该 任 务 的 对 话 框, 并 进 行 数 据 转 换 任 务 的 配 置, 如 图 11 唱 26 所 示 在 图 11 唱 26 所 示 的 源 标 签 页 中, 若 数 据 源 为 数 据 库, 则 可 以 提 供 选 择 指 定 表 视 图 或 使 用 T ransact 唱 SQ L 查 询, 过 滤 要 传 输 的 数 据 目
278 SQL Server 数 据 库 应 用 技 术 的 标 签 页 中, 可 以 定 义 要 导 入 数 据 的 有 关 信 息 ( 如 定 义 列 ), 如 数 据 目 的 是 数 据 库, 也 可 以 新 建 表, 或 选 择 现 有 表 格 进 行 导 入 图 11 唱 26 转 换 数 据 任 务 属 性 源 标 签 页 转 换 标 签 页 中, 可 以 配 置 自 定 义 转 换 默 认 情 况 下, 源 列 将 不 加 修 改 地 复 制 到 目 的 列 如 果 需 要 在 数 据 源 和 数 据 目 的 之 间 修 改 列 数 据, 在 名 称 下 拉 列 表 中 选 中 要 修 改 地 列 若 单 击 新 建 按 钮, 可 以 在 创 建 新 转 换 对 话 框 可 用 转 换 列 表 中, 选 择 想 要 地 转 换 类 型 D T S 设 计 器 可 以 在 异 构 数 据 环 境 中 转 换 数 据 和 定 义 复 杂 的 工 作 流 程, 包 括 定 义 一 个 或 者 多 个 数 据 传 输 步 骤 以 及 这 些 步 骤 的 执 行 顺 序 数 据 传 输 步 骤 是 一 个 工 作 单 元, 它 可 以 是 执 行 一 条 T ransact 唱 SQ L 语 句 执 行 脚 本 命 令 移 动 和 转 换 异 构 环 境 中 的 数 据 调 用 外 部 程 序 检 索 和 执 行 其 他 D T S 包 等 这 些 步 骤 可 以 通 过 三 种 方 式 来 执 行 : 优 先 级 约 束 条 件 判 断 约 束 和 优 先 权 约 束 使 用 D T S 设 计 器 可 以 在 不 同 的 平 台 上 的 SQ L Server 服 务 器 之 间 移 动 数 据 结 构 对 象 和 数 据 11.5 使 用 bcp 和 BULK INSERT 11.5.1 批 复 制 程 序 批 复 制 程 序 (bcp) 是 一 个 从 SQ L Server 导 入 / 导 出 数 据 的 命 令 行 形 式 的 程 序 它 可 以 在 运 行 bcp 的 机 器 上 把 表 或 视 图 中 的 数 据 导 出 到 一 个 文 件 中 该 文 件 可 以 被 发 送 到 另 一 台 计 算 机 或 另 一 个 位 置 上, 再 导 入 到 另 一 台 计 算 机 上 的 SQ L Server 数 据 库 中 1. 命 令 格 式 bcp {[[database_name.][owner].]{table_name view_name} query }
第 11 章 数 据 转 换 服 务 279 {in out queryout format} data_file [ 唱 m max_errors] [ 唱 f format_file] [ 唱 e err_file] [ 唱 F first_row] [ 唱 L last_row] [ 唱 b batch_size] [ 唱 n] [ 唱 c] [ 唱 w] [ 唱 N] [ 唱 V (60 65 70)] [ 唱 6] [ 唱 q] [ 唱 C code_page] [ 唱 t field_term] [ 唱 r row_term] [ 唱 i input_file] [ 唱 o output_file] [ 唱 a packet_size] [ 唱 S server_name[\instance_name]] [ 唱 U login_id] [ 唱 P password] [ 唱 T] [ 唱 v] [ 唱 R] [ 唱 k] [ 唱 E] [ 唱 h hint [,...n] ] 2. 选 项 注 释 bcp 各 选 项 含 义 如 表 11 唱 1 所 示 表 11 唱 1 批 复 制 程 序 各 选 项 含 义 选 项 描 述 table_name view_name query in out queryout format data_file 唱 m max_errors 唱 f format_file 唱 e err_file 唱 F first_row 唱 L last_row 唱 b batch_size 唱 n 唱 c 唱 w 导 入 或 导 出 的 表 的 名 称 导 入 或 导 出 的 视 图 的 名 称 从 不 同 表 中 指 定 行 和 列 的 SQL 查 询 如 果 指 定 此 选 项, 同 时 也 必 须 指 定 queryout 选 项 将 文 件 内 容 复 制 到 指 定 的 表 或 视 图 将 指 定 的 表 或 视 图 内 容 复 制 到 文 件 与 SQL 查 询 一 起 使 用, 用 于 告 诉 系 统 支 持 查 询 的 运 行, 并 将 结 果 返 回 到 指 定 的 文 件 生 成 基 于 表 和 视 图 指 定 的 代 码 页 或 选 定 定 界 符 的 格 式 文 件 如 果 指 定 此 选 项, 同 时 也 必 须 指 定 唱 f 选 项 导 入 或 导 出 数 据 的 文 件 指 定 在 全 部 操 作 被 放 弃 之 前 允 许 出 现 的 错 误 次 数 任 何 向 数 据 库 复 制 失 败 的 行 都 会 被 记 作 是 一 次 错 误 默 认 值 为 10 指 定 格 式 文 件 的 位 置, 用 该 文 件 来 决 定 导 入 或 导 出 数 据 将 怎 样 格 式 化 创 建 格 式 文 件 并 不 是 必 须 的 指 定 存 储 BCP 过 程 中 出 错 信 息 的 文 件 的 位 置 假 如 没 有 指 定 它, 将 在 屏 幕 上 显 示 出 错 信 息 指 定 被 复 制 数 据 的 首 行 默 认 值 为 1, 指 明 复 制 到 服 务 器 上 的 数 据 文 件 的 首 行 指 定 被 复 制 数 据 的 末 行 默 认 值 为 0, 指 明 所 有 行 数 据 将 被 处 理 指 定 每 批 复 制 的 行 数 每 批 都 作 为 单 独 的 批 复 制 到 SQL Server 不 要 和 唱 h ROWS _PER_BATCH = bb 选 项 一 起 使 用 本 选 项 如 果 不 指 定 批, 整 个 过 程 将 被 作 为 一 个 单 独 的 事 务 处 理 假 如 任 何 情 况 导 致 失 败, 将 取 消 所 做 的 一 切 指 定 使 用 本 地 数 据 库 格 式 的 批 复 制, 如 果 指 定 该 选 项 SQL Server 将 不 提 供 任 何 列 信 息 指 定 使 用 字 符 格 式 的 批 复 制 SQL Server 使 用 字 符 数 据 类 型 作 为 存 储 类 型 \t (Tab 键 ) 作 为 字 段 定 界 符,\n ( 新 行 ) 作 为 行 终 止 符 指 定 使 用 统 一 字 符 编 码 标 准 字 符 集 进 行 的 BCP 操 作 该 选 项 不 提 示 字 段 类 型, 它 使 用 nchart 数 据 类 型 作 为 存 储 类 型 \t (Tab 键 ) 作 为 字 段 定 界 符,\n ( 新 行 ) 作 为 行 终 止 符
280 SQL Server 数 据 库 应 用 技 术 续 表 选 项 描 述 唱 N 唱 q 唱 C code_page 唱 t field_term 唱 r row_term 唱 i input_file 唱 o output_file 唱 a packet_size 唱 S server_name 唱 U login_id 唱 P password 唱 T 唱 v 唱 R 唱 k 唱 E 唱 h hint[,...n] 指 定 使 用 本 地 数 据 库 格 式 的 批 复 制 它 同 允 许 使 用 统 一 字 符 编 码 标 准 字 符 类 型 的 唱 n 选 项 不 同 该 选 项 用 于 指 定 用 SQL 6.5 的 数 据 类 型 去 执 行 BCP 操 作, 但 必 须 将 唱 n 或 唱 c 选 项 与 本 选 项 一 起 使 用 告 诉 SQL 应 该 使 用 引 号 括 起 来 的 标 识 符 假 如 表 或 视 图 名 包 含 了 非 ANSI 字 符 集 的 字 符, 必 须 把 它 们 放 在 引 号 中 指 定 将 要 用 于 数 据 文 件 的 代 码 页 指 定 要 用 于 数 据 文 件 的 字 段 终 止 符 此 选 项 的 默 认 值 是 /t, 它 产 生 一 个 制 表 位 指 定 要 用 于 数 据 文 件 的 行 终 止 符 此 选 项 的 默 认 值 是 /n, 它 产 生 一 个 新 行 指 定 一 个 文 件, 当 在 交 互 模 式 下 运 行 BCP 时, 该 文 件 包 含 了 必 须 提 供 的 应 答 指 定 一 个 文 件, 接 收 从 BCP 得 到 的 输 出 如 果 未 指 定 该 选 项, 这 个 信 息 会 发 送 到 屏 幕 上 指 定 SQL Server 将 通 过 网 络 发 送 的 字 节 数 在 大 型 BCP 操 作 中, 加 大 包 可 增 加 处 理 的 性 能 有 效 字 节 为 512 字 节 到 65,536 字 节 Windows NT 和 SQL Sever 都 将 默 认 值 定 为 4096 字 节 指 定 当 执 行 BCP 操 作 时 将 连 接 的 服 务 器 的 名 称 指 定 登 录 的 服 务 器 用 的 登 录 ID 指 定 与 登 录 ID 相 关 的 口 令 告 诉 BCP 将 使 用 一 个 信 任 连 接 与 服 务 器 连 接 让 SQL Server 返 回 BCP 工 具 的 版 本 和 版 权 信 息 指 定 使 用 客 户 机 本 地 的 信 息 将 货 币 日 期 和 时 间 数 据 复 制 到 SQL Server 上 指 定 在 数 据 复 制 到 表 期 间, 任 何 空 列 应 保 持 NULL 值, 而 不 是 用 这 些 列 的 默 认 值 如 果 不 指 定 该 参 数 值,SQL Server 将 把 默 认 值 放 入 该 列 为 当 前 文 件 中 任 何 相 同 的 列 指 定 值 如 果 唱 E 未 指 定, 将 忽 略 相 同 的 值 并 创 建 新 值 指 定 在 向 表 或 视 图 进 行 批 复 制 操 作 时 用 到 的 提 示 毋 庸 置 疑, 尽 管 使 用 BCP 时 有 大 量 的 选 项 可 用, 但 是, 实 际 应 用 中 只 会 用 到 它 们 中 的 很 少 部 分 例 如, 在 computer 服 务 器 上 使 用 bcp 从 student 数 据 库 的 stud_info 表 中 导 出 所 有 行 C :\ > bcp student.dbo.stud_info out stud_info.txt 唱 c 唱 S computer 唱 U sa 唱 P 123456 3. 举 例 说 明 利 用 数 据 库 脚 本 和 bcp 命 令 将 student 数 据 库 复 制 到 其 他 机 器 上 (1) 将 student 数 据 库 生 成 SQ L 脚 本 1 展 开 服 务 器 组, 然 后 展 开 服 务 器 2 右 击 student 数 据 库, 然 后 单 击 所 有 任 务 下 的 生 成 SQ L 脚 本, 出 现 如 图 11 唱 27 所 示 的 对 话 框
第 11 章 数 据 转 换 服 务 281 图 11 唱 27 生 成 SQL 脚 本 唱 常 规 1 3 单 击 全 部 显 示, 再 选 中 编 写 全 部 对 象 脚 本 设 置 后 如 图 11 唱 28 所 示 图 11 唱 28 生 成 SQL 脚 本 唱 常 规 2 4 单 击 选 项 标 签 页, 如 图 11 唱 29 所 示, 选 中 编 写 数 据 库 脚 本 编 写 触 发 器 脚 本 编 写 主 键 外 键 默 认 值 和 检 查 约 束 脚 本 5 单 击 确 定 按 钮, 出 现 另 存 为 对 话 框, 表 示 将 脚 本 文 件 保 存 在 何 处, 这 里 将 其 保 存 在 C 根 目 录 下, 文 件 名 为 xsgl.sql 设 定 好 路 径 和 文 件 名 后, 单 击 保 存 按 钮 6 成 功 保 存 后, 出 现 编 写 脚 本 对 话 框, 单 击 确 定 按 钮 (2) 使 用 bcp 从 student 数 据 库 导 出 数 据
282 SQL Server 数 据 库 应 用 技 术 图 11 唱 29 生 成 SQL 脚 本 唱 选 项 在 M S 唱 DOS 命 令 运 行 如 下 命 令 : c : cd\ bcp student..stud_info out stud_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..teacher_info out teacher_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..stud_grade out stud_grade.txt 唱 n 唱 U sa 唱 P 123456 bcp student..lesson_info out lesson_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..teach_schedule out teach_schedule.txt 唱 n 唱 U sa 唱 P 123456 bcp student..dept_code out dept_code.txt 唱 n 唱 U sa 唱 P 123456 bcp student..specialty_code out specialty_code.txt 唱 n 唱 U sa 唱 P 123456 bcp student..staffroom_info out staffroom_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..classroom_info out classroom_info.txt 唱 n 唱 U sa 唱 P 123456 可 以 将 上 述 命 令 以 批 处 理 文 件 ( 扩 展 名 为.bat) 形 式 保 存, 以 后 每 次 运 行 时 直 接 运 行 该 批 处 理 文 件 即 可 (3) 在 其 他 计 算 机 上 生 成 student 数 据 库 因 为 选 择 同 一 台 计 算 机 操 作, 所 以 采 取 模 拟 的 形 式 现 在 原 计 算 机 上 删 除 student 数 据 库, 再 重 新 生 成 (4) 利 用 生 成 的 SQ L 脚 本 创 建 数 据 库 在 查 询 分 析 器 的 主 菜 单 中 选 择 文 件 下 的 打 开 菜 单 项, 出 现 打 开 查 询 文 件 对 话 框, 找 到 刚 才 生 成 的 数 据 库 脚 本 文 件 xsgl.sql, 单 击 打 开 按 钮 ; 查 询 分 析 器 出 现 数 据 库 脚 本 文 件, 单 击 工 具 栏 的 运 行 按 钮 即 可 (5) 使 用 bcp 将 导 出 数 据 导 入 至 student 数 据 库 在 M S 唱 DOS 命 令 运 行 如 下 命 令 :
第 11 章 数 据 转 换 服 务 283 c : cd\ bcp student..stud_info in stud_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..teacher_info in teacher_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..stud_grade in stud_grade.txt 唱 n 唱 U sa 唱 P 123456 bcp student..lesson_info in lesson_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..teach_schedule in teach_schedule.txt 唱 n 唱 U sa 唱 P 123456 bcp student..dept_code in dept_code.txt 唱 n 唱 U sa 唱 P 123456 bcp student..specialty_code in specialty_code.txt 唱 n 唱 U sa 唱 P 123456 bcp student..staffroom_info in staffroom_info.txt 唱 n 唱 U sa 唱 P 123456 bcp student..classroom_info in classroom_info.txt 唱 n 唱 U sa 唱 P 123456 同 样, 可 以 将 上 述 命 令 以 批 处 理 文 件 ( 扩 展 名 为.bat) 形 式 保 存, 以 后 每 次 运 行 时 直 接 运 行 该 批 处 理 文 件 即 可 11.5.2 BULK INSERT BU L K INSER T 命 令 是 一 个 用 于 处 理 数 据 迁 移 的 命 令, 它 用 于 将 数 据 插 入 数 据 库 中 1. 命 令 格 式 BULK INSERT [ [ database_name.][ owner ].]{ table_name FROM data_file } [ WITH ( [ BATCHSIZE [ = batch_size ] ] [ [,] CHECK_CONSTRAINTS ] [ [,] CODEPAGE [ = ACP OEM RAW code_page ] ] [ [,] DATAFILETYPE [ = { char native widechar widenative } ] ] [ [,] FIELDTERMINATOR [ = field_terminator ] ] [ [,] FIRSTROW [ = first_row ] ] [ [,] FIRE_TRIGGERS ] [ [,] FORMATFILE = format_file_path ] [ [,] KEEPIDENTITY ] [ [,] KEEPNULLS ] [ [,] KILOBYTES_PER_BATCH [ = kilobytes_per_batch ] ] [ [,] LASTROW [ = last_row ] ] [ [,] MAXERRORS [ = max_errors ] ] [ [,] ORDER ( { column [ ASC DESC ] } [,...n ] ) ] [ [,] ROWS_PER_BATCH [ = rows_per_batch ] ] [ [,] ROWTERMINATOR [ = row_terminator ] ] [,[ TABLOCK ] ] ) ] 2. 选 项 注 释 BU L K INSER T 的 大 部 分 选 项 与 BCP 中 的 一 样
284 SQL Server 数 据 库 应 用 技 术 3. 举 例 说 明 要 将 c :\stud_info.txt( 前 面 用 BCP 命 令 所 创 建 的 文 件 ) 的 数 据 插 入 到 student 数 据 库 的 pupil 表 中, 只 需 要 在 查 询 分 析 器 中 运 行 以 下 的 命 令 : BULK INSERT student..pupil FROM c :\stud_info.txt WIT H ( DATAFILETYPE = char, FIELDTERMINATOR = \t, KEEPNULLS ) 实 训 1. 实 训 目 的 (1) 了 解 导 入 和 导 出 的 作 用 (2) 学 会 从 SQ L Server 2000 数 据 库 导 出 数 据 (3) 学 会 将 数 据 导 入 SQ L Server 2000 数 据 库 (4) 学 会 使 用 D T S 设 计 器 (5) 学 会 使 用 BCP 和 BU L K INSER T 2. 实 训 的 知 识 准 备 数 据 转 换 过 程 或 者 数 据 导 入 / 导 出 过 程 是 数 据 库 管 理 系 统 中 的 主 要 部 分 D T S 使 用 OLE DB 提 供 程 序 来 转 换 数 据, 从 一 个 或 多 个 数 据 源 将 数 据 传 输 并 导 出 到 一 个 或 多 个 目 的 中 使 用 D T S 时, 数 据 源 和 数 据 目 的 可 以 是 异 类 的, 两 者 都 不 一 定 是 SQ L Server 可 以 把 D T S 作 为 两 个 数 据 源 之 间 的 传 输 数 据 机 制 ;OLE DB 支 持 访 问 任 何 存 储 格 式 的 数 据, 不 管 存 储 格 式 是 关 系 的 还 是 非 关 系 的 每 个 OLE DB 提 供 程 序 都 有 特 定 的 存 储 机 制, 例 如 SQ L Server 数 据 库 Microsoft Access 数 据 库 或 Microsoft Excel 电 子 表 格 3. 实 训 内 容 和 步 骤 (1) 使 用 导 入 导 出 向 导 将 student 数 据 库 中 stud_info 表 的 数 据 以 文 本 文 件 的 形 式 导 出 (2) 使 用 导 入 / 导 出 向 导 将 下 列 查 询 语 句 的 结 果 导 入 到 新 表 teacher 中 SELECT lesson.course_name, teacher.name, classroom.room_name, schedule.course_ week, schedule.course_time, schedule.course_id FROM classroom_info classroom, teacher_info teacher, lesson_info lesson, teach_schedule schedule WHERE classroom.room_id = schedule.room_id AND teacher.teacher_id = schedule.teacher_id AND lesson.course_id = schedule.course_id
第 11 章 数 据 转 换 服 务 285 (3) 使 用 D T S 设 计 器 创 建 一 个 D T S 包, 使 它 从 student 数 据 库 的 lesson_info 表 中 提 取 所 有 数 据, 并 导 出 到 一 个 excel 文 件 中 (4) 将 student 数 据 库 生 成 SQ L 脚 本, 使 用 bcp 命 令 将 student 数 据 库 数 据 导 出 ; 然 后 删 除 student 数 据 库, 再 利 用 生 成 SQ L 脚 本 重 新 创 建 student 数 据 库, 最 后 使 用 bcp 命 令 将 导 出 的 数 据 恢 复 至 student 数 据 库 (5) 使 用 BCP 和 BU L K INSER T 1 在 指 定 的 服 务 器 上 使 用 bcp, 从 student 数 据 库 的 teacher_info 表 中 导 出 所 有 行 到 文 本 文 件 teacher_info.txt, 并 通 过 记 事 本 查 看 2 使 用 CREA T E T ABLE 创 建 表 pupil 结 构 后, 使 用 bcp 将 文 本 文 件 内 容 teacher_ info.txt 导 入 到 student 数 据 库 中 指 定 的 pupil 表 3 使 用 DELE T E FRO M 删 除 表 pupil 数 据 后, 再 使 用 下 面 的 T ransact 唱 SQ L 语 句 从 c :\teacher_info.txt 载 入 数 据 到 student 数 据 库 中 BULK INSERT student..teacher_info FROM c :\teacher_info.txt WIT H (DAT AFILETYPE CHAR,FIELDTERMINATOR =,,ROWTERMINATOR = \n ) (6) 使 用 SELEC T...IN T O 语 句 将 stud_info 表 中 数 据 插 入 未 建 立 的 stud_back 表 中, 然 后 使 用 DELE T E FRO M 语 句 删 除 表 stud_info 的 所 有 数 据, 最 后 使 用 INSER T... SELEC T 语 句 将 stud_back 表 中 数 据 恢 复 至 表 stud_info 中 USE student SELECT 倡 INTO stud_back FROM stud_info DELETE FROM stud_info INSERT INTO stud_info SELECT 倡 FROM stud_back 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 什 么 是 D T S? 什 么 是 包? (2) 如 何 使 用 D T S 包 设 计 器 完 成 包 的 创 建? (3) D T S 的 三 个 特 点 是 什 么? (4) 使 用 导 入 导 出 向 导 创 建 一 个 D T S 包, 使 它 从 student 数 据 库 的 teacher_info 表 中 提 取 所 有 数 据, 并 导 出 到 一 个 文 本 文 件 中 请 简 述 具 体 的 操 作 步 骤 (5) 批 复 制 程 序 用 于 什 么 目 的? (6) BU LK INSER T 命 令 用 于 什 么 目 的? 2. 请 在 空 白 处 填 写 最 适 合 的 内 容 (1) 如 果 从 SQ LServer 数 据 库 导 出 数 据 到 Excel 中, 选 用 下 列 查 询 语 句 :
286 SQL Server 数 据 库 应 用 技 术 SELECT c.name,a.deptname, b.jysh_name FROM dept_code a, staffroom_info b, teacher_info c WHERE SUBSTR(c.teacher_id,1,2) = a.deptcode AND SUBSTR(c.teacher_id,3,2) = SUBSTR(b.jysh_id,3,2) 那 么 在 Excel 表 中, 将 得 到 的 列 (2) 请 说 明 bcp 命 令 中 选 项 的 功 用 bcp new_database..new_data in c :\new_data.txt 唱 c 唱 r\n 唱 e c :\new_data.err 唱 b250 唱 m50 in 唱 c 唱 r\n 唱 e c :\new_data.err 唱 b250 唱 m50 (3) 对 下 列 BU L K INSER T 语 句 进 行 注 释 BULK INSERT new_database..new_data FROM c :\new_data.txt WIT H ( BATCHSIZE = 250 / 倡 倡 / DATAFILETYPE = char / 倡 倡 / FIELDTERMINATOR =, / 倡 倡 / ROWTERMINATOR = \n / 倡 倡 / MAXERRORS = 50 / 倡 倡 / TABLOCK) / 倡 倡 / (4) 下 面 SQ L 语 句 是 将 c : \ classroom _ info.txt 导 入 数 据 到 student 数 据 库 classroom_info 表 中, 请 完 善 其 语 句 BULK INSERT FROM WIT H ( CHAR, =,, = \n ) (5) 将 teacher_info 表 中 数 据 导 出 至 未 建 立 的 teacher_back 表 中, 其 SQ L 命 令 是 : (6) 将 teacher_back 表 中 数 据 恢 复 至 表 teacher_info 中, 其 SQ L 命 令 是 :
SQL Server 2000 的 安 全 管 理 第 12 章 本 章 将 从 安 全 性 的 角 度 介 绍 对 SQ L Server 系 统 的 基 本 管 理 方 法, 因 为 无 论 对 于 系 统 管 理 员 还 是 数 据 库 编 程 人 员, 甚 至 对 于 每 个 用 户, 数 据 库 系 统 的 安 全 性 都 至 关 重 要 通 过 对 本 章 的 学 习, 读 者 将 会 了 解 到 要 想 确 保 系 统 的 安 全 性, 应 该 使 用 用 户 账 户, 同 时 还 应 该 对 账 户 授 予 相 应 的 权 限 对 用 户 角 色 和 权 限 的 管 理 可 以 通 过 企 业 管 理 器 来 操 作, 也 可 以 使 用 系 统 存 储 过 程 来 实 现 12.1 SQL Server 2000 的 安 全 认 证 模 式 用 户 使 用 SQ L Server 时, 需 要 经 过 两 个 安 全 性 阶 段 : 身 份 验 证 和 权 限 认 证 (1) 身 份 验 证 阶 段 : 用 户 在 SQ L Server 上 获 得 对 任 何 数 据 库 的 访 问 权 限 之 前, 必 须 登 录 到 SQ L Server 上, 并 且 被 认 为 是 合 法 的 SQ L Server 或 者 Window s 2000 对 用 户 进 行 验 证 如 果 验 证 通 过, 用 户 就 可 以 连 接 到 SQ L Server 上, 否 则, 服 务 器 将 拒 绝 用 户 登 录 从 而 保 证 了 系 统 安 全 (2) 权 限 认 证 阶 段 : 身 份 验 证 阶 段 系 统 只 检 验 用 户 是 否 有 连 接 SQ L Server 实 例 的 权 力, 如 果 身 份 验 证 通 过 了, 只 表 示 用 户 可 以 连 接 SQ L Server 实 例, 否 则 系 统 将 拒 绝 用 户 的 连 接 然 后 需 要 检 验 用 户 是 否 有 访 问 服 务 器 上 数 据 库 的 权 限, 为 此 需 要 授 予 每 个 数 据 库 中 映 射 到 用 户 登 录 的 账 户 访 问 权 限, 权 限 认 证 就 可 以 控 制 用 户 在 数 据 库 中 进 行 的 操 作 12.1.1 身 份 验 证 在 验 证 阶 段, 系 统 对 用 户 登 录 进 行 验 证 SQ L Server 和 Window s 2000 是 结 合 在 一 起 的, 因 此 产 生 了 两 种 验 证 模 式 : Window s 身 份 验 证 模 式 和 混 合 身 份 验 证 模 式 (Window s 身 份 验 证 和 SQ L Server 身 份 验 证 ) 1.Windows 身 份 验 证 模 式 Window s 身 份 验 证 模 式 是 使 用 Window s 操 作 系 统 的 安 全 机 制 验 证 用 户 身 份, 只 要 用 户 能 够 通 过 Window s 2000 用 户 账 户 验 证, 即 可 连 接 到 SQ L Server 这 种 验 证 模 式 只 适 用 于 能 够 提 供 有 效 身 份 验 证 的 Windo ws 操 作 系 统, 在 其 他 操 作 系 统 下 无 法 使 用 Window s 身 份 验 证 模 式 下,SQ L Server 检 测 当 前 使 用 的 Windo ws 用 户 账 号, 并 在 syslogins 表 中 查 找 该 账 号, 以 确 定 该 账 号 是 否 有 权 登 录 在 这 种 方 式 下, 用 户 不 必 提 供
288 SQL Server 数 据 库 应 用 技 术 密 码 或 者 登 录 名 让 SQ L Server 验 证 Window s 验 证 模 式 主 要 有 以 下 优 点 : 1 数 据 库 管 理 员 的 工 作 可 以 集 中 在 管 理 数 据 库 上 面, 而 不 是 管 理 用 户 账 户 对 用 户 账 户 的 管 理 可 以 交 给 Windo ws 2000 去 完 成 2 Window s 2000 有 着 更 强 的 用 户 账 户 管 理 工 具 可 以 设 置 账 户 锁 定 密 码 期 限 等 如 果 不 是 通 过 定 制 来 扩 展 SQ L Server,SQ L Server 是 不 具 备 这 些 功 能 的 3 Window s 2000 的 组 策 略 支 持 多 个 用 户 同 时 被 授 权 访 问 SQ L Server 注 意 : 要 在 客 户 和 服 务 器 间 建 立 连 接, 使 用 该 验 证 模 式 时, 必 须 满 足 以 下 两 个 条 件 中 的 一 个 1 客 户 端 的 用 户 必 须 有 合 法 的 服 务 器 上 的 Window s 2000 账 户, 服 务 器 能 够 在 自 己 的 域 中 或 者 信 任 域 中 验 证 该 用 户 2 服 务 器 启 动 了 Guest 账 户, 但 是 该 方 法 会 带 来 安 全 上 的 隐 患, 因 而 不 是 一 个 好 的 方 法 2. 混 合 身 份 验 证 模 式 混 合 身 份 验 证 模 式 使 用 户 可 以 使 用 Window s 身 份 验 证 或 SQ L Server 身 份 验 证 与 SQ L Server 实 例 连 接 它 将 区 分 用 户 账 号 在 Window s 操 作 系 统 下 是 否 可 信, 对 于 可 信 连 接 用 户, 系 统 直 接 采 用 Window s 身 份 验 证 机 制, 否 则 SQ L Server 会 通 过 账 户 的 存 在 性 和 密 码 的 匹 配 性 自 行 进 行 验 证 例 如, 允 许 某 些 非 可 信 的 Window s 用 户 (Internet 客 户 ) 连 接 到 SQ L Server, 它 通 过 检 查 是 否 已 设 置 SQ L Server 登 录 账 户 以 及 输 入 的 密 码 是 否 与 设 置 的 密 码 相 符 来 进 行 身 份 验 证 如 果 SQ L Server 未 设 置 登 录 账 户, 则 身 份 验 证 将 失 败, 而 且 用 户 会 收 到 错 误 信 息 使 用 哪 个 模 式 取 决 于 在 最 初 的 通 信 时 使 用 的 网 络 库 如 果 一 个 用 户 使 用 的 是 T CP/ IP Sockets 进 行 登 录 验 证, 则 将 使 用 SQ L Server 验 证 模 式 ; 如 果 用 户 使 用 命 名 管 道, 则 登 录 时 将 使 用 Window s 验 证 模 式, 这 种 模 式 能 更 好 地 适 应 用 户 的 各 种 环 境 但 是 对 于 Windows 9x 系 列 的 操 作 系 统, 只 能 使 用 SQ L Server 验 证 模 式 SQ L Server 验 证 模 式 下, 处 理 登 录 的 过 程 为 : 用 户 在 输 入 登 录 名 和 密 码 后,SQ L Server 在 系 统 注 册 表 中 检 测 输 入 的 登 录 名 和 密 码 如 果 输 入 的 登 录 名 存 在, 而 且 密 码 也 正 确, 就 可 以 登 录 到 SQ L Server 上 混 合 验 证 模 式 具 有 以 下 优 点 : 1 创 建 了 Window s 2000 之 上 的 另 外 一 个 安 全 层 次 2 支 持 更 大 范 围 的 用 户, 如 非 Window s 客 户 U NIX/Linux 用 户 等 3 一 个 应 用 程 序 可 以 使 用 单 个 的 SQ L Server 登 录 和 口 令 由 此 可 以 看 出 : 验 证 模 式 的 选 择 通 常 与 网 络 验 证 的 模 型 和 客 户 与 服 务 器 间 的 通 信 协 议 有 关 如 果 网 络 主 要 是 Window s 2000 网, 则 用 户 登 录 到 Window s 2000 时 已 经 得 到 了 确 认, 因 此, 使 用 Window s 验 证 模 式 将 减 轻 系 统 的 工 作 负 担 ; 但 是, 对 于 连 接 到 Window s Server 2000 客 户 端 以 外 的 其 他 客 户 端, 必 须 使 用 SQ L Server 身 份 验 证 例 如 U NIX/ Linux 网 络 用 户, 则 需 要 使 用 SQ L Server 验 证 模 式 12.1.2 权 限 认 证 为 了 防 止 不 合 理 的 使 用 而 造 成 数 据 的 泄 密 和 破 坏,SQ L Server 数 据 库 管 理 系 统 除 了
第 12 章 SQL Server 2000 的 安 全 管 理 289 使 用 身 份 验 证 方 法 来 限 制 用 户 进 入 数 据 库 系 统, 还 使 用 权 限 认 证 来 控 制 用 户 对 数 据 库 操 作 当 用 户 身 份 通 过 了 验 证 连 接 到 SQ L Server 实 例 后, 在 用 户 可 以 访 问 的 每 个 数 据 库 中 都 要 求 单 独 的 用 户 账 户, 对 于 没 有 账 户 的 数 据 库, 将 无 法 访 问 此 时, 用 户 虽 然 可 以 发 送 各 种 T ransact 唱 SQ L 语 句 命 令, 但 是 这 些 操 作 命 令 在 数 据 库 中 是 否 能 够 成 功 地 执 行, 还 取 决 于 该 用 户 账 户 在 该 数 据 库 中 对 这 些 操 作 的 权 限 设 置 如 果 发 出 操 作 命 令 的 用 户 没 有 执 行 该 语 句 的 权 限 或 者 没 有 访 问 该 对 象 的 权 限, 则 SQ L Server 将 不 会 执 行 该 操 作 命 令 所 以 若 没 有 通 过 数 据 库 中 的 权 限 认 证, 即 使 用 户 连 接 到 了 SQ L Server 示 例 上, 也 无 法 使 用 数 据 库 一 般 来 说, 数 据 库 的 所 有 者 或 者 对 象 的 所 有 者 可 以 对 其 他 数 据 库 用 户 授 予 或 者 解 除 权 限 12.2 创 建 和 管 理 安 全 账 户 12.2.1 创 建 安 全 账 户 1. 登 录 账 户 和 用 户 账 户 不 管 使 用 哪 种 验 证 方 式, 都 必 须 首 先 具 备 有 效 的 登 录 账 户 SQ L Server 有 三 个 默 认 的 用 户 账 户 : sa BUIL TIN \ Administrators 和 guest 其 中 sa 是 系 统 管 理 员 (System Administrators) 的 简 称, 允 许 SQ L Server 的 系 统 管 理 员 登 录, 并 拥 有 全 部 的 系 统 权 限 和 数 据 库 权 限 ;BUIL TIN\Administrators 是 SQ L Server 提 供 给 Windo ws 系 统 管 理 员 的 一 个 默 认 的 用 户 账 户, 拥 有 全 部 的 系 统 权 限 和 数 据 库 权 限, 凡 是 Windows N T Server/2000 中 Administrators 组 的 账 号 都 允 许 登 录 SQ L Server guest 是 一 个 默 认 的 访 问 系 统 的 用 户 账 户, 拥 有 一 般 用 户 权 限 SQ L Server 用 户 分 为 两 级 : 登 录 账 户 和 用 户 账 户 其 中 登 录 账 户 是 附 加 到 SQ L Server 本 身 的 能 力, 所 有 的 登 录 账 户 信 息 都 被 存 放 在 系 统 表 syslogins 中 而 用 户 账 户 是 由 SQ L Server 管 理 的, 所 有 的 用 户 账 户 都 存 放 在 系 统 表 sysusers 中 每 个 用 户 必 须 通 过 登 录 账 户 建 立 自 己 的 连 接 能 力 ( 身 份 验 证 ), 以 便 获 得 对 SQ L Server 实 例 的 访 问 权 限 然 后, 该 登 录 必 须 映 射 到 用 于 控 制 在 数 据 库 中 所 执 行 的 活 动 ( 权 限 验 证 ) 的 SQ L Server 用 户 账 户 因 此, 单 个 登 录 映 射 到 在 该 登 录 正 在 访 问 的 每 个 数 据 库 中 创 建 的 一 个 用 户 账 户 如 果 数 据 库 中 没 有 用 户 账 户, 则 即 使 用 户 能 够 连 接 到 SQ L Server 实 例 中, 也 无 法 访 问 该 数 据 库 所 以, 在 Microsoft Window s 2000 账 户 ( 用 户 或 组 ) 可 以 访 问 数 据 库 之 前, 必 须 为 其 授 予 连 接 到 SQ L Server 实 例 的 权 限 在 数 据 库 中 是 使 用 用 户 账 户 来 标 识 用 户 的, 并 且 数 据 库 中 对 象 的 全 部 权 限 和 所 有 权 由 用 户 账 户 来 控 制, 用 户 账 户 与 数 据 库 相 关 登 录 账 户 本 身 并 不 提 供 访 问 数 据 库 对 象 的 用 户 权 限 当 一 个 登 录 账 户 与 每 个 数 据 库 中 的 一 个 用 户 账 户 相 关 联 后, 使 用 该 登 录 账 户 连 接 SQ L Server, 方 能 访 问 数 据 库 中 的 对 象 默 认 情 况 下, 登 录 账 户 与 数 据 库 中 的 guest 用 户 账 户 相 关 联, 但 是, 如 果 数 据 库 中 没 有 guest 用 户 账 户, 则 不 能 访 问 该 数 据 库, 除 非 它
290 SQL Server 数 据 库 应 用 技 术 已 与 一 个 有 效 的 用 户 账 户 相 关 联 在 SQ L Server 数 据 库 中,guest 账 户 是 特 殊 的 用 户 账 户 如 果 用 户 使 用 U SE database 语 句 访 问 的 数 据 库 中 没 有 与 此 用 户 关 联 的 账 户, 此 用 户 就 与 guest 用 户 相 关 联 没 有 特 定 账 户 的 用 户 可 以 使 用 guest 账 户 登 录 访 问 数 据 库 只 有 在 满 足 下 列 两 个 条 件 时, 登 录 账 户 才 会 与 guest 用 户 相 关 联 : (1) 登 录 有 访 问 SQ L Server 实 例 的 权 限, 但 没 有 通 过 自 己 的 用 户 账 户 访 问 数 据 库 的 权 限 (2) 数 据 库 中 含 有 guest 用 户 账 户 默 认 情 况 下, 新 建 的 数 据 库 中 没 有 guest 用 户 账 户 可 以 将 权 限 应 用 到 guest 用 户, 就 如 同 它 是 任 何 其 他 用 户 账 户 一 样 可 以 在 除 master 和 tempdb 外 ( 在 这 两 个 数 据 库 中 它 必 须 始 终 存 在 ) 的 所 有 数 据 库 中 添 加 或 删 除 guest 用 户 用 户 账 户 在 定 义 时 便 与 一 个 登 录 账 户 相 关 联 下 面 介 绍 登 录 账 户 与 用 户 账 户 的 建 立 和 管 理 方 法 2. 创 建 SQL Server 登 录 账 户 (1) 使 用 企 业 管 理 器 添 加 SQ L Server 登 录 1 在 SQ L Server 的 企 业 管 理 器 下, 展 开 SQ L Server 组 文 件 夹, 找 到 需 要 建 立 登 录 账 号 的 服 务 器 并 展 开 其 文 件 夹, 再 展 开 安 全 性 文 件 夹, 在 登 录 选 项 上 右 击 鼠 标, 在 出 现 的 快 捷 菜 单 中 单 击 新 建 登 录 菜 单 命 令, 打 开 SQ L Server 登 录 属 性 新 建 登 录 对 话 框, 如 图 12 唱 1 所 示 图 12 唱 1 SQL Server 登 录 属 性 新 建 登 录 2 如 果 选 择 Window s 身 份 验 证 单 选 钮, 则 名 称 文 本 框 后 面 的 按 钮 被 激 活, 单 击 可 打 开 选 择 Window s 用 户 的 对 话 框, 如 图 12 唱 2 所 示 从 其 对 话 框 中 可 选 择 Window s 系
第 12 章 SQL Server 2000 的 安 全 管 理 291 统 的 用 户 作 为 SQ L Server 的 登 录 账 号 不 过, 在 这 之 前 需 要 单 击 开 始 设 置 控 制 面 板 管 理 工 具 计 算 机 管 理, 右 击 本 地 用 户 和 用 户 用 户, 选 中 新 用 户, 如 图 12 唱 3 所 示, 在 图 12 唱 4 所 示 的 新 用 户 对 话 框 中, 输 入 用 户 名 和 密 码 等 图 12 唱 2 选 择 Windows 用 户 的 对 话 框 图 12 唱 3 Windows 中 计 算 机 管 理 窗 口 图 12 唱 4 Windows 中 创 建 新 用 户 窗 口
292 SQL Server 数 据 库 应 用 技 术 3 如 果 单 击 SQ L Server 身 份 验 证 单 选 钮, 就 在 名 称 文 本 框 中 输 入 要 创 建 的 登 录 账 号 名 称, 例 如 stud_user, 在 身 份 验 证 选 项 组 中, 并 输 入 密 码, 然 后 在 默 认 设 置 选 项 组 中, 选 择 数 据 数 据 库 列 表 中 的 某 个 数 据 库, 例 如 student, 表 示 该 登 录 账 号 默 认 登 录 到 student 数 据 库 中 4 在 图 12 唱 1 对 话 框 中, 单 击 服 务 器 角 色 标 签, 打 开 服 务 器 角 色 标 签 页, 在 此 标 签 页 中, 可 以 设 置 登 录 账 号 所 属 的 服 务 器 角 色 5 在 图 12 唱 1 对 话 框 中, 单 击 数 据 库 访 问 标 签, 打 开 数 据 库 访 问 标 签 页 在 此 标 签 页 中 可 选 择 登 录 账 号 可 以 访 问 的 数 据 库, 即 选 中 所 需 要 的 数 据 库 左 面 的 复 选 框 6 设 置 完 毕 后, 单 击 确 定 按 钮, 即 可 完 成 登 录 账 号 的 创 建 (2) 使 用 系 统 存 储 过 程 建 立 登 录 账 户 和 用 户 账 户 要 在 SQ L Server 中 添 加 登 录 账 户, 可 以 使 用 系 统 存 储 过 程 sp _ grantlogin, 使 Windows 用 户 或 组 账 户 得 以 使 用 Window s 身 份 验 证 连 接 到 SQ L Server 上 sp_grantlogin 存 储 过 程 的 语 法 格 式 如 下 : sp_grantlogin [ @ loginame = ] login 其 中, 参 数 [ @ loginame = ] login 是 要 添 加 的 Windo w s 用 户 或 组 的 名 称 Window s 组 和 用 户 必 须 用 域 名 限 定, 格 式 为 域 \ 用 户,login 的 数 据 类 型 为 sysname, 没 有 默 认 值 例 12.1 向 系 统 中 添 加 一 个 域 名 为 stud_domain 的 Windo ws 用 户 stud_user, 可 执 行 下 列 代 码 : EXEC sp_grantlogin computer\stud_admin 尽 管 执 行 上 述 代 码 后, 登 录 可 以 连 接 到 SQ L Server, 但 是, 除 非 在 每 个 登 录 必 须 访 问 的 数 据 库 中 都 创 建 该 登 录 的 用 户 账 户, 否 则 对 用 户 数 据 库 的 访 问 仍 会 被 拒 绝 要 在 每 个 用 户 数 据 库 中 创 建 用 户 账 户, 可 以 使 用 sp_grantdbaccess 存 储 过 程 为 登 录 账 户 授 予 访 问 数 据 库 的 权 限 例 12.2 在 当 前 数 据 库 中 为 Window s 用 户 computer\stud_admin 添 加 账 户, 并 取 名 为 user_manager, 可 执 行 下 列 代 码 : EXEC sp_grantdbaccess computer\stud_admin, user_manager 除 了 使 用 sp_grantlogin 系 统 存 储 过 程 之 外,SQ L Server 还 提 供 sp_addlogin 系 统 存 储 过 程 来 完 成 同 样 的 操 作 利 用 sp_addlogin 存 储 过 程 创 建 登 录 账 号 的 语 法 格 式 为 : sp_addlogin [ @ loginame = ] login [,[ @ passwd = ] password ] [,[ @ defdb = ] database ] [,[ @ deflanguage = ] language ][,[ @ sid = ]sid][,[ @ encryptopt = ] encryption_option ] 其 中,[ @ loginame = ] login 为 登 录 账 号 名 称,[ @ passwd = ] passw ord 为 登 录 密 码,[ @ defdb = ] database 为 登 录 的 默 认 数 据 库 名,[ @ deflanguage = ] language 为 使 用 的 语 言, [ @ sid = ]sid 为 安 全 标 识 号,[ @ encryptopt = ] encryption_option 为 指 定 当 密 码 存 储 在
第 12 章 SQL Server 2000 的 安 全 管 理 293 系 统 表 中 时, 密 码 是 否 要 加 密 注 意 : 使 用 的 语 言 如 果 指 定 为 N U L L, 则 表 示 使 用 系 统 默 认 语 言 例 12.3 建 立 一 个 名 为 stud_ login 的 登 录 账 号, 并 将 登 录 账 号 加 入 到 数 据 库 student 中 USE student EXEC sp_addlogin stud_login, computer, student, NULL EXEC sp_adduser stud_login 运 行 结 果 显 示 : 已 创 建 新 登 录, 已 向 stud_login 授 予 数 据 库 访 问 权 例 12.4 利 用 sp_addlogin 命 令 建 立 SQ L server 登 录 ID 为 my_login 由 于 没 有 指 定 passwd 和 defdb 参 数, 因 此 my_login 的 口 令 是 N U L L, 默 认 数 据 库 是 master EXEC sp_addlogin my_login 运 行 结 果 显 示 : 已 创 建 新 登 录 3. 创 建 数 据 库 的 用 户 由 上 可 知,SQ L Server 账 号 有 两 种 : 一 种 是 登 录 服 务 器 的 登 录 账 号 (login name), 另 外 一 种 是 使 用 数 据 库 的 用 户 账 号 (user name) 登 录 账 号 是 指 能 登 录 到 SQ L Server 的 账 号, 属 于 服 务 器 的 层 面, 它 本 身 并 不 能 让 用 户 访 问 服 务 器 中 的 数 据 库, 而 登 录 者 要 使 用 服 务 器 中 的 数 据 库 时, 必 须 要 有 用 户 账 号 才 能 够 存 取 数 据 库 就 如 同 公 司 门 口 先 刷 卡 进 入 ( 登 录 服 务 器 ), 然 后 再 拿 钥 匙 打 开 自 己 的 办 公 室 ( 进 入 数 据 库 ) 一 样 用 户 名 要 在 特 定 的 数 据 库 内 创 建, 并 关 联 一 个 登 录 名 ( 当 一 个 用 户 创 建 时, 必 须 关 联 一 个 登 录 名 ) 用 户 定 义 的 信 息 存 放 在 服 务 器 的 每 个 数 据 库 的 sysusers 表 中, 用 户 没 有 密 码 同 它 相 关 联, 通 过 授 权 给 用 户 来 指 定 用 户 可 以 访 问 的 数 据 库 对 象 的 权 限 一 个 SQ L Server 的 登 录 账 号 只 有 成 为 数 据 库 的 用 户 时, 才 有 对 数 据 库 访 问 权 限 在 安 装 SQ L Server 后, 默 认 数 据 库 如 master tempdb msdb 等 包 含 两 个 用 户 : dbo 和 guest 任 何 一 个 登 录 账 号 都 可 以 通 过 guest 用 户 账 号 来 存 取 相 应 的 数 据 库 但 是 当 新 建 一 个 数 据 库 时, 默 认 只 有 dbo 用 户 账 号 而 没 有 guest 用 户 账 号 每 个 登 录 账 号 在 一 个 数 据 库 中 只 能 有 一 个 用 户 账 号, 但 是 每 个 登 录 账 号 可 以 在 不 同 的 数 据 库 中 各 有 一 个 用 户 账 号 如 果 在 新 建 登 录 账 号 过 程 中, 指 定 对 某 个 数 据 库 具 有 存 取 权 限, 则 在 该 数 据 库 中 将 自 动 创 建 一 个 与 登 录 账 号 同 名 的 用 户 账 号 注 意 : 1 master 和 tempdb 数 据 库 中 的 guest 用 户 账 号 不 能 删 除, 而 其 他 数 据 库 中 的 guest 用 户 账 号 可 以 删 除 因 为 master 数 据 库 中 记 录 了 所 有 的 系 统 信 息, 每 个 登 录 的 用 户 若 没 有 特 别 指 定 数 据 库, 默 认 都 是 使 用 master 数 据 库 而 tempdb 数 据 库 是 临 时 使 用 的 数 据 库, 所 有 与 服 务 器 连 接 的 数 据 都 会 存 储 在 该 处, 因 此 也 必 须 提 供 guest 用 户 账 号 2 登 录 账 号 具 有 对 某 个 数 据 库 的 访 问 权 限, 并 不 表 示 该 登 录 账 号 对 数 据 库 具 有 存 取 的 权 限 如 果 要 对 数 据 库 的 对 象 进 行 插 入 更 新 等 操 作, 还 需 要 设 置 用 户 账 号 的 权 限 (1) 使 用 企 业 管 理 器 创 建 数 据 库 的 用 户 1 在 企 业 管 理 器 中, 展 开 SQ L Server 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某
294 SQL Server 数 据 库 应 用 技 术 一 数 据 库, 例 如 student 的 文 件 夹, 然 后 在 用 户 选 项 上 右 击, 在 弹 出 的 快 捷 菜 单 中 选 择 新 建 数 据 库 用 户 命 令, 打 开 新 建 用 户 对 话 框 2 单 击 登 录 名 下 拉 列 表 框 右 端 的 下 拉 箭 头, 选 择 stud_login 登 录 账 号, 此 时 用 户 名 文 本 框 中 自 动 显 示 为 stud_login 可 以 更 改 用 户 名 文 本 框 中 的 用 户 名, 也 可 以 在 数 据 库 角 色 成 员 列 表 框 中 选 择 新 建 用 户 应 该 属 于 的 数 据 库 角 色 3 设 置 完 毕 后, 单 击 确 定 按 钮, 即 可 在 student 数 据 库 中 创 建 一 个 新 的 用 户 账 号 如 果 不 想 创 建 用 户 账 号, 单 击 取 消 按 钮 即 可 (2) 使 用 存 储 过 程 创 建 数 据 库 的 用 户 1 使 用 sp_grantdbaccess 语 法 格 式 : sp_grantdbaccess [ @ loginame = ] login [,[ @ name_in_db = ] name_in_db [OUTPUT]] 其 中,[ @ loginame = ] login 表 示 当 前 数 据 库 中 新 账 户 的 登 录 名 称 如 果 是 Windows 组 和 用 户, 则 必 须 用 域 名 限 定 登 录 不 能 使 用 数 据 库 中 已 有 的 账 户 作 为 别 名 [ @ name_in_db = ] name_in_db [OU TPU T] 表 示 数 据 库 中 账 户 的 名 称 name_in_ db 的 默 认 值 为 N U L L 如 果 没 有 指 定 name_in_db 的 值, 即 将 其 指 定 为 具 有 N U L L 值 的 O U T PU T 变 量, 则 使 用 登 录 名 称 作 为 该 账 户 的 名 称 2 使 用 sp_adduser 语 法 格 式 : sp_adduser [ @ loginame = ] login [,[ @ name_in_db = ] user ][,[ @ grpname = ] group ] 其 中,[ @ loginame = ] login 为 登 录 名 称 ;[ @ name _ in _ db = ] user 为 用 户 账 号 ; [ @ grpname = ] group 为 组 或 所 属 的 数 据 库 角 色, 新 用 户 自 动 地 成 为 其 成 员 例 12.5 向 student 数 据 库 中, 添 加 一 个 名 称 为 teach_user 的 用 户 账 号 USE student GO EXEC sp_addlogin teach_login, office, student, NULL GO EXEC sp_adduser teach_login, teach_user, db_owner 这 里 sp _ addlogin 只 是 添 加 了 一 个 登 录 账 号, 只 能 登 录 到 SQ L Server, 并 不 对 student 数 据 库 具 有 存 取 权 限, 所 以, 还 需 要 利 用 sp_adduser 将 登 录 账 号 加 入 到 指 定 数 据 库 中 才 行 (3) 设 置 数 据 库 用 户 账 号 的 权 限 在 创 建 数 据 库 用 户 账 号 对 话 框 中, 当 新 建 一 个 新 的 用 户 账 号 时, 登 录 名 右 侧 的 权 限 按 钮 是 灰 色 的, 表 示 不 能 在 创 建 数 据 库 用 户 账 号 的 同 时 设 置 其 权 限 但 是 可 以 在 创 建 后 通 过 其 属 性 对 话 框 来 设 置 其 权 限, 步 骤 如 下 : 1 在 企 业 管 理 器 的 右 窗 格 中 的 用 户 账 号 上 右 击, 然 后 选 择 属 性 命 令, 打 开 数 据 库 用 户 属 性 对 话 框 2 在 数 据 库 用 户 属 性 对 话 框 中, 单 击 权 限 按 钮, 打 开 权 限 设 置 对 话 框 在 此 对
第 12 章 SQL Server 2000 的 安 全 管 理 295 话 框 中, 可 以 设 置 用 户 对 数 据 库 对 象 所 具 有 的 权 限 在 对 象 列 中, 显 示 了 数 据 库 中 所 有 的 对 象, 而 所 有 者 列 则 显 示 了 相 应 对 象 的 所 有 者 其 后 的 6 列 则 是 对 数 据 库 对 象 的 操 作, 具 体 含 义 如 下 : 瞯 SELEC T : 对 表 或 者 视 图 的 查 询 ; 瞯 INSER T : 在 表 或 者 视 图 中 插 入 记 录 ; 瞯 U PDA T E : 对 表 或 者 视 图 中 的 数 据 修 改 ; 瞯 DELE T E : 删 除 表 或 者 视 图 中 的 数 据 ; 瞯 EXEC : 执 行 存 储 过 程 ; 瞯 DRI : Declarative Referential Integrity, 可 对 表 的 外 键 加 上 限 制, 以 达 成 表 的 参 照 完 整 性 对 某 个 数 据 库 对 象 而 言, 如 果 选 中 对 应 的 复 选 框, 则 表 示 具 有 对 该 对 象 进 行 相 应 操 作 的 权 限 每 个 复 选 框 具 有 3 种 状 态 空 白 时 表 示 未 指 定 权 限, 或 权 限 还 原 到 未 设 置 状 态 ; 当 打 时 表 示 具 有 该 权 限 ; 当 打 时, 表 示 不 具 有 该 权 限 3 如 果 要 设 置 对 表 或 者 视 图 的 某 一 列 进 行 操 作 的 权 限, 可 在 列 表 中 选 择 表 或 者 视 图 对 象, 然 后 单 击 列 按 钮, 可 打 开 列 权 限 对 话 框 使 用 对 话 框 即 可 进 行 相 应 权 限 的 设 置 12.2.2 管 理 安 全 账 户 1. 查 看 服 务 器 的 登 录 账 号 (1) 使 用 企 业 管 理 器 查 看 登 录 账 号 进 入 企 业 管 理 器, 展 开 SQ L Server 组, 找 到 所 要 连 接 的 SQ L Server 服 务 器, 展 开 该 服 务 器 对 应 的 文 件 夹, 再 展 开 安 全 性 文 件 夹, 单 击 登 录 选 项, 即 可 看 到 系 统 创 建 的 默 认 登 录 账 号 及 已 建 立 的 其 他 登 录 账 号 (2) 使 用 存 储 过 程 查 看 登 录 账 号 使 用 sp_helplogins 可 查 看 登 录 账 号 语 法 格 式 : EXEC sp_helplogins 2. 修 改 登 录 账 户 属 性 (1) 使 用 企 业 管 理 器 修 改 登 录 账 户 属 性 在 创 建 登 录 之 后, 有 时 需 要 更 改 密 码 默 认 数 据 库 或 默 认 语 言 例 如, 用 户 可 能 忘 了 自 己 的 密 码, 或 者 出 于 安 全 考 虑 而 想 更 改 密 码, 或 者 需 要 定 期 使 用 另 一 个 数 据 库, 或 者 需 要 查 看 以 另 一 种 语 言 显 示 的 消 息 一 般 可 执 行 下 列 操 作 : 1 展 开 服 务 器 组, 然 后 展 开 服 务 器 2 展 开 安 全 性 项, 然 后 单 击 登 录 3 在 详 细 信 息 窗 格 中, 右 击 要 修 改 的 登 录, 从 弹 出 菜 单 中 选 择 属 性 选 项 4 单 击 常 规 标 签 页, 在 密 码 文 本 框 中 输 入 新 的 密 码 ; 或 者 在 数 据 库 列 表 中, 单 击 登 录 到 SQ L Server 实 例 之 后 登 录 所 连 接 的 新 的 默 认 数 据 库 ; 或 者 在 语 言 列 表 中, 单
296 SQL Server 数 据 库 应 用 技 术 击 给 用 户 显 示 消 息 时 要 使 用 的 默 认 语 言 5 单 击 服 务 器 角 色 标 签 页 或 数 据 库 访 问 标 签 页, 即 可 完 成 其 中 各 项 的 修 改 这 里 如 同 创 建 登 录 账 号 时 基 本 相 同, 在 此 不 再 重 复 最 后, 单 击 确 认 按 钮, 完 成 登 录 账 户 的 修 改 (2) 使 用 存 储 过 程 修 改 登 录 账 户 属 性 1 用 sp_passw ord 改 变 登 录 账 号 的 密 码 语 法 格 式 : sp_password [[ @ old = ] old_password,] [ @ new = ] new_password [,[ @ loginame = ] login ] 其 中,[ @ old = ] old _ passw ord 为 旧 密 码,[ @ new = ] new _ passw ord 为 新 密 码,[ @ loginame = ] login 为 登 录 账 号 名 称 例 12.6 将 stud_login 账 号 的 密 码 由 原 来 的 computer 改 为 aacomputer EXEC sp_password computer, aacomputer, stud_login 2 用 sp_addsrvrolemember 将 登 录 账 号 加 入 服 务 器 角 色 中 语 法 格 式 : sp_addsrvrolemember [ @ loginame = ] login [ @ rolename = ] role 其 中,[ @ loginame = ] login 是 添 加 到 服 务 器 角 色 的 登 录 名 称 ;[ @ rolename = ] role 为 服 务 器 角 色 的 名 称 ( sysadmin, securityadmin, serveradmin, setupadmin,processadmin, diskadmin,dbcreator, bulkadmin) 例 12.7 将 登 录 账 号 stud_login 加 入 到 dbcreator 服 务 器 角 色 中 EXEC sp_addsrvrolemember stud_login, dbcreator (3) 改 变 登 录 账 户 和 用 户 之 间 的 关 系 要 更 改 当 前 数 据 库 中 SQ L Server 用 户 与 SQ L Server 登 录 之 间 的 关 系, 可 使 用 存 储 过 程 sp_change_users_login, 其 语 法 格 式 如 下 : sp_change_users_login [ @ Action = ] action [,[ @ UserNamePattern = ] user ][,[ @ loginname = ] login ] 其 中,[ @ Action = ] action 说 明 过 程 要 执 行 的 操 作, 例 如 Update_One 是 将 当 前 数 据 库 中 指 定 的 用 户 链 接 到 登 录 账 户 登 录 账 户 必 须 已 经 存 在, 又 不 能 为 sa, 而 用 户 不 能 为 dbo guest 用 户 使 用 这 个 过 程 可 将 当 前 数 据 库 中 用 户 的 安 全 账 户 链 接 到 不 同 的 登 录 如 果 用 户 登 录 已 更 改, 则 使 用 sp_change_users_login 将 用 户 链 接 到 新 的 登 录, 而 不 会 丢 失 用 户 的 权 限 例 12.8 将 student 数 据 库 中 的 用 户 stud_user 与 现 有 登 录 之 间 的 链 接, 变 更 为 链 接 到 新 的 登 录 teac_login 账 户 上, 可 执 行 下 列 代 码 :
第 12 章 SQL Server 2000 的 安 全 管 理 297 USE student GO EXEC sp_addlogin teach_login / 倡 添 加 新 的 登 录 账 户 倡 / GO / 倡 将 现 有 链 接 变 更 为 teach_login 倡 / EXEC sp_change_users_login Update_One, stud_user, teach_login 3. 查 看 数 据 库 的 用 户 (1) 使 用 企 业 管 理 器 查 看 数 据 库 的 用 户 在 企 业 管 理 器 中, 展 开 SQ L Server 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某 数 据 库, 例 如 student 的 文 件 夹, 单 击 用 户 选 项, 则 可 在 企 业 管 理 器 的 右 窗 格 中 显 示 出 目 前 数 据 库 中 所 有 的 用 户 (2) 利 用 存 储 过 程 查 看 数 据 库 的 用 户 语 法 格 式 : sp_helpuser [[ @ name_in_db = ] security_account ] 语 句 将 显 示 当 前 数 据 库 中 SQ L Server 用 户 Window s 用 户 和 数 据 库 角 色 的 信 息 例 12.9 列 出 目 前 student 数 据 库 中 所 有 的 数 据 库 用 户 账 户 USE student GO EXEC sp_helpuser 12.2.3 删 除 登 录 和 用 户 1. 删 除 登 录 账 号 (1) 使 用 企 业 管 理 器 删 除 登 录 账 号 进 入 企 业 管 理 器, 展 开 SQ L Server 组, 找 到 所 要 连 接 的 SQ L Server 服 务 器, 展 开 该 服 务 器 对 应 的 文 件 夹, 再 展 开 安 全 性 文 件 夹, 单 击 登 录 选 项, 在 企 业 管 理 器 的 右 侧 窗 格 中 即 可 看 到 系 统 创 建 的 默 认 登 录 账 号 及 已 建 立 的 其 他 登 录 账 号 在 需 要 更 改 属 性 的 账 号 上 右 击, 在 出 现 的 快 捷 菜 单 中, 单 击 删 除 菜 单 项, 此 时 会 打 开 一 个 提 示 对 话 框, 单 击 是 按 钮 确 定 删 除 (2) 使 用 存 储 过 程 删 除 登 录 账 号 使 用 存 储 过 程 sp_droplogin 可 删 除 某 一 登 录 账 号 语 法 格 式 如 下 : sp_droplogin [ @ loginame = ] login [ @ loginame = ] login 为 被 删 除 的 登 录 账 号 例 12.10 从 数 据 库 student 中 删 除 stud_login 登 录 账 号 EXEC sp_droplogin stud_login 要 删 除 用 sp_grantlogin 或 sp_denylogin 创 建 的 Microsoft Window s 用 户 或 组 的 登 录 项, 可 以 使 用 sp_revokelogin 存 储 过 程, 其 语 法 格 式 如 下 : sp_revokelogin [ @ loginame = ] login
298 SQL Server 数 据 库 应 用 技 术 例 12.11 删 除 Window s 用 户 computer\stud_admin 的 登 录 项, 可 执 行 下 列 代 码 EXEC sp_revokelogin computer\stud_admin 2. 删 除 用 户 账 号 (1) 使 用 企 业 管 理 器 删 除 用 户 账 号 在 企 业 管 理 器 中, 展 开 SQ L Server 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某 一 数 据 库, 例 如 student 的 文 件 夹, 单 击 用 户 选 项, 在 详 细 信 息 窗 格 中, 右 击 要 删 除 的 用 户, 从 弹 出 菜 单 中 选 择 删 除, 在 出 现 的 提 示 框 中, 单 击 确 认 按 钮, 确 认 删 除 代 码 (2) 使 用 系 统 存 储 过 程 删 除 用 户 账 户 1 使 用 sp_revokedbaccess 语 法 格 式 : sp_revokedbaccess [ @ name_in_db = ] name 例 12.12 从 当 前 数 据 库 中 删 除 用 户 账 户 computer \ stud_ admin, 可 执 行 下 列 EXEC sp_grantdbaccess computer\stud_admin, computer\stud_admin EXEC sp_revokedbaccess computer\stud_admin 删 除 用 户 账 户 时, 依 赖 于 用 户 账 户 的 权 限 和 别 名 将 自 动 删 除 sp_revokedbaccess 只 能 删 除 当 前 数 据 库 中 的 账 户 2 使 用 sp_dropuser 语 法 格 式 : sp_dropuser [ @ name_in_db = ] user 从 当 前 数 据 库 中 删 除 SQ L Server 用 户 或 Windows 用 户 [ @ name_in_db = ] user 为 将 要 被 删 除 的 用 户 名 user 必 须 已 经 存 在 于 当 前 的 数 据 库 中 当 指 定 Windows 用 户 时, 需 要 指 定 Window s 用 户 在 数 据 库 中 可 以 被 识 别 的 名 称 ( 用 sp_grantdbaccess 添 加 ) 例 12.13 从 数 据 库 student 中 删 除 stud_user 用 户 账 号 EXEC sp_grantdbaccess computer\stud_admin, stud_manager EXEC sp_dropuser stud_manager 12.3 管 理 数 据 库 用 户 和 角 色 12.3.1 服 务 器 角 色 角 色 (role) 是 一 组 用 户 所 构 成 的 组, 可 分 为 服 务 器 角 色 与 数 据 库 角 色 以 下 先 介 绍 服 务 器 角 色, 然 后 介 绍 数 据 库 角 色 服 务 器 角 色 是 负 责 管 理 与 维 护 SQ L Server 的 组, 一 般 只 会 指 定 需 要 管 理 服 务 器 的 登 录 账 号 属 于 服 务 器 角 色 SQ L Server 在 安 装 过 程 中 定 义 几 个 固 定 的 服 务 器 角 色, 其 具 体 权 限 如 下 : 1 sysadmin : 全 称 为 System Administrators, 可 以 在 SQ L Server 中 执 行 任 何 活 动
第 12 章 SQL Server 2000 的 安 全 管 理 299 2 serveradmin : 全 称 为 Server Administrators, 可 以 设 置 服 务 器 范 围 的 配 置 选 项, 关 闭 服 务 器 3 setupadmin : 全 称 为 Setup Administrators, 可 以 管 理 链 接 服 务 器 和 启 动 过 程 4 securityadmin : 全 称 为 Security Administrators, 可 以 管 理 登 录 和 创 建 数 据 库 的 权 限, 还 可 以 读 取 错 误 日 志 和 更 改 密 码 5 processadmin : 全 称 为 Process Administrators, 可 以 管 理 在 SQ L Server 中 运 行 的 进 程 6 dbcreator : 全 称 为 Database Creators, 可 以 创 建 更 改 和 除 去 数 据 库 7 diskadmin : 全 称 为 Disk Administrators, 可 以 管 理 磁 盘 文 件 8 bulkadmin : 全 称 为 Bulk Insert Administrators, 可 以 执 行 BU LK INSER T( 大 容 量 插 入 ) 语 句 注 意 : 属 于 Window s 2000 Administrators 组 的 账 号, 在 SQ L Server 中 被 自 动 设 置 为 sysadmin 服 务 器 角 色 12.3.2 数 据 库 角 色 角 色 是 一 个 强 大 的 工 具, 可 以 将 用 户 集 中 到 一 个 单 元 中, 然 后 对 该 单 元 应 用 权 限 对 一 个 角 色 授 予 拒 绝 或 废 除 的 权 限 也 适 用 于 该 角 色 的 任 何 成 员 可 以 建 立 一 个 角 色 来 代 表 单 位 中 一 类 工 作 人 员 所 执 行 的 工 作, 然 后 给 这 个 角 色 授 予 适 当 的 权 限 和 登 录 账 号 类 似, 用 户 账 号 也 可 以 分 成 组, 称 为 数 据 库 角 色 (Database Roles) 数 据 库 角 色 应 用 于 单 个 数 据 库 1. 标 准 角 色 与 应 用 程 序 角 色 在 SQ L Server 中, 数 据 库 角 色 可 分 为 两 种 : (1) 标 准 角 色 标 准 角 色 是 由 数 据 库 成 员 所 组 成 的 组, 此 成 员 可 以 是 用 户 或 者 其 他 的 数 据 库 角 色 在 创 建 一 个 数 据 库 时, 系 统 默 认 创 建 10 个 固 定 的 标 准 角 色 在 企 业 管 理 器 中, 展 开 SQ L Server 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某 一 数 据 库 ( 例 如 student) 的 文 件 夹, 然 后 单 击 角 色 选 项, 这 时 可 在 企 业 管 理 器 的 右 侧 窗 格 中 显 示 出 默 认 的 10 个 标 准 角 色 瞯 db_ow ner : 在 数 据 库 中 有 全 部 权 限 瞯 db_accessadmin : 可 以 添 加 或 删 除 用 户 ID 瞯 db_securityadmin : 可 以 管 理 全 部 权 限 对 象 所 有 权 角 色 和 角 色 成 员 资 格 瞯 db_ ddladmin : 可 以 发 出 除 GRA N T REVOKE DEN Y 之 外 的 所 有 数 据 定 义 语 句 瞯 db_backupoperator : 可 以 发 出 DBCC CHECKPOIN T 和 BACK U P 语 句 瞯 db_datareader : 可 以 选 择 数 据 库 内 任 何 用 户 表 中 的 所 有 数 据 瞯 db_dataw riter : 可 以 更 改 数 据 库 内 任 何 用 户 表 中 的 所 有 数 据 瞯 db_denydatareader : 不 能 选 择 数 据 库 内 任 何 用 户 表 中 的 任 何 数 据 瞯 db_denydataw riter : 不 能 更 改 数 据 库 内 任 何 用 户 表 中 的 任 何 数 据 瞯 Public : 最 基 本 的 数 据 库 角 色 每 个 用 户 可 以 不 属 于 其 他 9 个 固 定 数 据 库 角 色,
300 SQL Server 数 据 库 应 用 技 术 但 是 至 少 会 属 于 public 数 据 库 角 色 当 在 数 据 库 中 添 加 新 用 户 账 号 时,SQ L Server 会 自 动 将 新 用 户 账 号 加 入 public 数 据 库 角 色 中 (2) 应 用 程 序 角 色 应 用 程 序 角 色 用 来 控 制 应 用 程 序 存 取 数 据 库 的, 本 身 并 不 包 括 任 何 成 员 在 编 写 数 据 库 的 应 用 程 序 时, 可 以 自 己 定 义 应 用 程 序 角 色, 让 应 用 程 序 的 操 作 者 能 用 编 写 的 程 序 来 存 取 SQ L Server 的 数 据 也 就 是 说, 应 用 程 序 的 操 作 者 本 身 并 不 需 要 在 SQ L Server 上 有 登 录 账 号 以 及 用 户 账 号, 仍 然 可 以 存 取 数 据 库 ( 但 只 能 通 过 我 们 写 的 应 用 程 序 来 操 作 ), 如 此 可 以 避 免 操 作 者 自 行 登 录 SQ L Server 2. 创 建 新 的 角 色 (1) 使 用 企 业 管 理 器 创 建 角 色 在 企 业 管 理 器 中, 展 开 SQ L Server 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某 一 数 据 库 ( 例 如 student) 的 文 件 夹, 然 后 在 角 色 选 项 上 右 击, 在 弹 出 的 快 捷 菜 单 中 选 择 新 建 数 据 库 角 色 菜 单 命 令, 则 出 现 数 据 库 角 色 属 性 新 建 角 色 对 话 框, 在 该 对 话 框 中 名 称 文 本 框 中 输 入 角 色 的 名 称 ; 在 数 据 库 角 色 类 型 中 选 择 角 色 的 类 型 为 标 准 角 色 ; 单 击 添 加 按 钮 可 向 角 色 中 添 加 成 员, 设 置 完 成 后, 单 击 确 定 按 钮 创 建 应 用 程 序 角 色 的 过 程 与 标 准 角 色 的 创 建 过 程 基 本 相 同, 就 是 在 数 据 库 角 色 属 性 新 建 角 色 对 话 框 中, 选 择 应 用 程 序 角 色 即 可 (2) 使 用 存 储 过 程 创 建 角 色 使 用 sp_addrole 能 在 当 前 数 据 库 创 建 新 的 角 色 其 语 法 格 式 是 : sp_addrole [ @ rolename = ] role [,[ @ ownername = ] owner ] 其 中,[ @ rolename = ] role 为 新 建 角 色 的 名 称 ;[ @ ownername = ] ow ner 为 新 建 角 色 的 拥 有 者 例 12.14 在 student 数 据 库 中 创 建 一 名 称 为 myrole 的 角 色 USE student EXEC sp_addrole myrole, dbo 如 果 创 建 应 用 程 序 角 色, 需 要 使 用 sp_addapprole 存 储 过 程 语 法 格 式 为 : sp_addapprole[ @ rolename = ] role [ @ password = ] password 语 句 将 在 当 前 数 据 库 中 添 加 一 个 特 殊 类 型 的 角 色 以 使 应 用 程 序 安 全 其 中 : [ @ rolename = ] role 为 新 角 色 的 名 称 ;[ @ passw ord = ] passw ord 激 活 角 色 所 需 的 密 码, passw ord 以 加 密 形 式 存 储 例 12.15 利 用 sp_addapprole 在 当 前 数 据 库 中 建 立 一 个 应 用 程 序 角 色 approle Use student EXEC sp_addapprole approle, application 应 用 程 序 角 色 创 建 后, 还 要 激 活 与 当 前 数 据 库 中 的 应 用 程 序 角 色 关 联 的 权 限 通 常 使 用 sp_setapprole 存 储 过 程 其 语 法 格 式 为 :
第 12 章 SQL Server 2000 的 安 全 管 理 301 sp_setapprole [ @ rolename = ] role,[ @ password = ]{Encrypt N password } password [,[ @ encrypt = ] encrypt_style ] 其 中,[ @ rolename = ] role 是 在 当 前 数 据 库 中 定 义 的 应 用 程 序 角 色 名,[ @ passw ord = ] {Encrypt N passw ord } passw ord 是 激 活 应 用 程 序 角 色 所 需 的 密 码, 可 以 使 用 Encrypt 函 数 对 passw ord 加 密 使 用 Encrypt 函 数 时, 必 须 在 密 码 的 前 面 加 上 N 以 将 密 码 转 换 成 Unicode 字 符 串 [ @ encrypt = ] encrypt_style 指 定 passw ord 使 用 的 加 密 样 式 例 12.16 在 student 数 据 库 中 激 活 名 称 为 approle 的 应 用 程 序 角 色, 密 码 为 application USE student EXEC sp_setapprole approle, application 通 过 这 个 语 句 将 激 活 与 当 前 数 据 库 中 的 应 用 程 序 角 色 关 联 的 权 限 角 色 ( 也 称 为 安 全 性 角 色 ) 定 义 一 组 Window s 用 户 账 户 和 组, 它 们 对 于 SQ L Server 数 据 具 有 相 同 的 访 问 权 限 角 色 是 用 来 实 现 最 终 用 户 安 全 性 的, 实 现 方 法 是 通 过 从 客 户 应 用 程 序 连 接 的 用 户 来 控 制 对 服 务 器 上 数 据 的 访 问, 默 认 情 况 下, 一 个 数 据 库 角 色 仅 指 定 读 取 权 限 3. 查 看 角 色 的 属 性 下 面 以 student 数 据 库 中 的 db_ow ner 角 色 为 例 说 明 : (1) 在 企 业 管 理 器 中, 展 开 SQ L Server 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某 一 数 据 库 ( 如 student) 的 文 件 夹, 然 后 单 击 角 色 选 项, 这 时 可 在 企 业 管 理 器 的 右 侧 窗 格 中 显 示 对 应 数 据 库 的 所 有 角 色 (2) 在 右 侧 窗 格 中, 右 击 db_ow ner 角 色, 在 出 现 的 快 捷 菜 单 中, 单 击 属 性 菜 单 命 令, 则 打 开 数 据 库 角 色 属 性 对 话 框 对 话 框 中 列 出 了 目 前 包 括 在 该 角 色 中 的 数 据 库 用 户 账 号, 例 如 包 括 stud_user 和 dbo 两 个 用 户 账 号 默 认 每 个 数 据 库 的 db_o wner 中 一 定 包 括 dbo 用 户,dbo 是 默 认 就 存 在 的 用 户, 就 是 指 数 据 库 的 创 建 者 在 此 对 话 框 中, 单 击 添 加 按 钮 可 为 该 角 色 添 加 一 个 用 户, 单 击 删 除 按 钮, 可 从 角 色 中 删 除 被 选 中 的 用 户, 但 是 dbo 是 不 能 被 删 除 的 4. 删 除 角 色 (1) 使 用 企 业 管 理 器 删 除 角 色 在 企 业 管 理 器 中, 展 开 SQ L Server 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某 一 数 据 库 ( 如 student) 的 文 件 夹, 然 后 单 击 角 色 选 项, 这 时 在 企 业 管 理 器 的 右 侧 窗 格 中 会 显 示 出 目 前 所 有 的 角 色, 在 某 一 角 色 上 右 击, 在 弹 出 的 快 捷 菜 单 中 选 择 删 除 菜 单 命 令 即 可 (2) 使 用 存 储 过 程 删 除 角 色 使 用 sp_droprole 能 从 当 前 数 据 库 删 除 指 定 的 角 色 其 语 法 格 式 是 : sp_droprole [ @ rolename = ] role 其 中,[ @ rolename = ] role 为 将 要 从 当 前 数 据 库 中 删 除 的 角 色 的 名 称
302 SQL Server 数 据 库 应 用 技 术 例 12.17 删 除 数 据 库 student 中 的 myrole 角 色 USE student EXEC sp_droprole myrole 5. 用 户 和 角 色 的 权 限 问 题 用 户 是 否 具 有 对 数 据 库 存 取 的 权 力, 要 看 其 权 限 设 置 而 定 但 是, 它 还 要 受 其 角 色 的 权 限 的 限 制 (1) 用 户 权 限 继 承 角 色 的 权 限 数 据 库 角 色 中 可 以 包 含 许 多 用 户, 用 户 对 数 据 库 对 象 的 存 取 权 限 也 就 继 承 角 色 的 权 限 假 设 用 户 stud_user 属 于 角 色 stud_role1, 角 色 stud_role1 已 经 取 得 了 对 表 stud_info 的 SELEC T 权 限, 则 用 户 stud_user 也 自 动 取 得 对 表 stud_info 的 SELEC T 权 限 如 果 stud_role1 对 stud _ info 没 有 INSER T 权 限, 而 stud _ user 取 得 了 对 表 stud _ info 的 INSER T 权 限, 则 stud_user 最 终 也 取 得 对 表 stud_info 的 INSER T 权 限 而 拒 绝 是 优 先 的, 只 要 stud_role1 和 stud_user 中 的 之 一 拒 绝, 则 该 权 限 就 是 拒 绝 的 (2) 用 户 分 属 不 同 角 色 如 果 一 个 用 户 分 属 于 不 同 的 数 据 库 角 色 例 如 : 用 户 stud_user 既 属 于 角 色 stud_ role1, 又 属 于 角 色 stud_role2, 则 用 户 stud_user 的 权 限 基 本 上 是 以 stud_role1 和 stud_ role2 的 并 集 为 准 但 是 只 要 有 一 个 拒 绝, 则 用 户 stud_user 的 权 限 就 是 拒 绝 的 12.4 SQL Server 权 限 管 理 当 用 户 连 接 到 SQ L Server 实 例 后, 若 要 进 行 任 何 涉 及 更 改 数 据 库 定 义 或 访 问 数 据 的 活 动, 则 必 须 有 相 应 的 权 限 (1) 权 限 管 理 包 括 授 予 或 废 除 执 行 以 下 活 动 的 用 户 权 限 1 处 理 数 据 和 执 行 过 程 ( 对 象 权 限 ) 2 创 建 数 据 库 或 数 据 库 中 的 项 目 ( 语 句 权 限 ) 3 利 用 授 予 预 定 义 角 色 的 权 限 ( 暗 示 性 权 限 ) (2) 对 象 权 限 包 括 : 1 SELEC T INSER T U PDA T E 和 DELE T E 语 句 权 限, 可 以 应 用 到 整 个 表 或 视 图 中 2 SELEC T 和 U PDA T E 语 句 权 限, 可 以 有 选 择 性 地 应 用 到 表 或 视 图 中 的 单 个 列 上 3 SELEC T 权 限, 可 以 应 用 到 用 户 定 义 函 数 4 INSER T 和 DELE T E 语 句 权 限, 会 影 响 整 行, 因 此 只 可 以 应 用 到 表 或 视 图 中, 而 不 能 应 用 到 单 个 列 上 5 EXECU T E 语 句 权 限, 可 以 影 响 存 储 过 程 和 函 数 (3) 语 句 权 限 包 括 : 1 BACK U P DA T ABASE
第 12 章 SQL Server 2000 的 安 全 管 理 303 2 BACK U P LOG 3 CREA T E DA T ABASE 4 CREA T E DEFA U L T 5 CREA T E F U NC TION 6 CREA T E PROCEDU RE 7 CREA T E RU LE 8 CREA T E T ABLE 9 CREA T E VIEW (4) 暗 示 性 权 限 主 要 控 制 那 些 只 能 由 预 定 义 系 统 角 色 的 成 员 或 数 据 库 对 象 所 有 者 执 行 的 活 动 例 如, 数 据 库 对 象 所 有 者 可 以 对 所 拥 有 的 对 象 执 行 一 切 活 动, 拥 有 表 的 用 户 可 以 查 看 添 加 或 删 除 数 据, 更 改 表 定 义, 或 者 控 制 允 许 其 他 用 户 对 表 进 行 操 作 的 权 限 12.4.1 使 用 企 业 管 理 器 管 理 权 限 1. 给 用 户 授 予 数 据 库 中 的 语 句 权 限 在 企 业 管 理 器 中, 如 果 要 给 用 户 授 予 数 据 库 中 的 语 句 权 限, 可 按 下 列 步 骤 进 行 操 作 : 展 开 服 务 器 组, 然 后 展 开 服 务 器 ; 展 开 数 据 库 项, 右 击 将 被 授 予 语 句 权 限 的 用 户 所 在 的 数 据 库, 然 后 从 弹 出 菜 单 中 选 择 属 性 选 项 ; 单 击 权 限 标 签 页, 选 择 授 予 每 位 用 户 的 语 句 权 限 其 中, 选 中 标 记 表 示 授 予 权 限 如 图 12 唱 5 所 示 图 12 唱 5 授 予 用 户 的 语 句 权 限 2. 通 过 授 权 允 许 访 问 某 个 对 象 通 过 授 权 而 允 许 访 问 某 个 对 象, 可 按 下 列 步 骤 进 行 操 作 : 展 开 服 务 器 组, 然 后 展 开 服
304 SQL Server 数 据 库 应 用 技 术 务 器 ; 展 开 数 据 库 项, 然 后 展 开 对 象 所 属 的 数 据 库 ; 根 据 对 象 类 型, 单 击 表 视 图 存 储 过 程 等 对 象 ; 在 详 细 信 息 窗 格 中, 右 击 授 予 权 限 所 在 的 对 象, 从 弹 出 菜 单 中 选 择 所 有 任 务 管 理 权 限 选 项 ; 单 击 列 出 全 部 用 户 / 用 户 定 义 的 数 据 库 角 色 /public 选 项, 然 后 选 择 授 予 每 位 用 户 的 权 限, 其 中, 选 中 标 记 表 示 授 予 权 限, 如 图 12 唱 6 所 示 图 12 唱 6 针 对 某 个 对 象 给 用 户 授 权 3. 授 予 拒 绝 或 撤 销 用 户 定 义 角 色 在 多 个 对 象 上 的 权 限 如 果 要 授 予 拒 绝 或 废 除 用 户 定 义 角 色 在 多 个 对 象 上 的 权 限, 可 按 下 列 步 骤 进 行 操 作 : 展 开 服 务 器 组, 然 后 展 开 服 务 器 ; 展 开 数 据 库 项, 然 后 展 开 角 色 所 属 的 数 据 库 ; 单 击 角 色 ; 在 详 细 信 息 窗 格 中, 右 击 要 授 予 拒 绝 废 除 其 权 限 的 用 户 定 义 的 角 色, 然 后 从 弹 出 菜 单 中 选 择 属 性 选 项 ; 单 击 权 限 按 钮 ; 单 击 列 出 全 部 对 象 选 项, 然 后 选 择 在 每 个 对 象 上 授 予 拒 绝 或 废 除 的 权 限 如 图 12 唱 7 所 示 其 中, 选 中 标 志 表 示 授 予 权 限 ; 表 示 拒 绝 权 限 ; 空 框 表 示 废 除 权 限 12.4.2 使 用 Transact 唱 SQL 语 句 管 理 权 限 1. 授 予 权 限 授 予 权 限 的 操 作 可 通 过 GRA N T 语 句 来 完 成 下 面 就 授 予 语 句 权 限 和 授 予 对 象 权 限 分 别 加 以 介 绍 (1) 授 予 语 句 权 限 的 语 法 格 式 如 下 : GRANT {ALL statement [,...n]} TO security_account [,...n ] (2) 授 予 对 象 权 限 的 语 法 格 式 如 下 : GRANT
第 12 章 SQL Server 2000 的 安 全 管 理 305 图 12 唱 7 为 角 色 在 多 个 对 象 上 的 授 权 { ALL [PRIVILEGES] permission [,...n]} { [(column[,...n])] ON {table view} ON {table view} [(column [,...n])] ON {stored_procedure extended_procedure} ON {user_defined_function} } TO security_account[,...n] [WITH GRANT OPTION] [AS {group role}] 如 果 指 定 了 WI T H GRA N T OP T ION 子 句, 则 获 得 某 种 权 限 的 用 户 还 可 以 把 这 种 权 限 再 授 予 其 他 用 户 如 果 没 有 指 定 WI T H GRA N T OP TION 子 句, 则 获 得 某 种 权 限 的 用 户 只 能 使 用 该 权 限, 但 不 能 传 播 权 限 例 12.18 给 用 户 stud_user 和 teach_user 以 及 Window s 用 户 组 student\stud_ group 授 予 多 个 语 句 权 限, 可 执 行 下 列 代 码 : USE master GRANT CREATE DATABASE, CREATE TABLE TO stud_user, teach_user,[student\stud_group] 例 12.19 给 用 户 stud_user stud_manager 授 予 对 stud_info 表 的 所 有 权 限 首 先 给 public 角 色 授 予 SELEC T 权 限, 然 后, 将 特 定 的 权 限 授 予 stud_ user stud_ manager 用 户, 需 要 执 行 如 下 程 序 代 码 :
306 SQL Server 数 据 库 应 用 技 术 USE student GO GRANT SELECT ON stud_info TO public GO GRANT INSERT, UPDATE, DELETE ON stud_info TO stud_user, stud_manager 2. 拒 绝 权 限 拒 绝 权 限 在 一 定 程 度 上 类 似 废 除 权 限, 但 是 这 种 设 置 拥 有 最 高 优 先 权, 即 只 要 指 定 一 个 保 护 对 象 拒 绝 一 个 用 户 或 者 角 色 访 问, 则 即 使 该 用 户 或 者 角 色 被 明 确 授 予 某 种 权 限 ( 或 因 继 承 关 系 得 到 某 种 权 限 ), 仍 然 不 允 许 执 行 相 应 的 操 作 (1) 拒 绝 语 句 权 限 的 语 法 格 式 如 下 : DENY {ALL statement [,...n ]} TO security_account [,...n ] (2) 拒 绝 对 象 权 限 的 语 法 格 式 如 下 : DENY { ALL [ PRIVILEGES ] permission [,...n ] } { [ ( column [,...n ] ) ] ON { table view} ON { table view } [ ( column [,...n ] )] ON { stored_procedure extended_procedure} ON {user_defined_function} } TO security_account [,...n] [CASCADE] 例 12.20 拒 绝 给 用 户 stud_user 和 teach_user 以 及 Windows 用 户 组 student \ stud_group 授 予 的 多 个 语 句 权 限, 可 执 行 下 列 代 码 : USE master DENY CREATE DATABASE, CREATE TABLE TO stud_user, teach_user,[student\stud_group] 例 12.21 拒 绝 给 用 户 stud_ user stud_ manager 授 予 的 对 stud_info 表 的 所 有 权 限 首 先 给 public 角 色 删 除 SELEC T 权 限, 然 后, 拒 绝 用 户 stud_user stud_manager 的 特 定 权 限, 需 要 执 行 下 列 程 序 代 码 : USE student GO REVOKE SELECT ON stud_info TO public GO DENY INSERT, UPDATE, DELETE ON stud_info TO stud_user, stud_manager GO
第 12 章 SQL Server 2000 的 安 全 管 理 307 3. 撤 销 权 限 要 撤 销 以 前 给 当 前 数 据 库 内 的 用 户 授 予 或 拒 绝 的 权 限, 可 通 过 REVOKE 语 句 来 完 成 下 面 就 撤 销 语 句 权 限 和 撤 销 对 象 权 限 分 别 加 以 介 绍 (1) 撤 销 语 句 权 限 的 语 法 格 式 如 下 : REVOKE { ALL statement [,...n]} FROM security_account [,...n] (2) 撤 销 对 象 权 限 的 语 法 格 式 如 下 : REVOKE [ GRANT OPTION FOR] {ALL [ PRIVILEGES ] permission[,...n]} { [(column [,...n])] ON {table view} ON {table view} [ ( column [,...n])] ON {stored_procedure extended_procedure} ON {user_defined_function} } { TO FROM} security_account [,...n] [ CASCADE] [ AS { group role}] 例 12.22 撤 销 授 予 用 户 账 户 stud_user 的 CREA T E T ABLE 权 限 REVOKE CREATE T ABLE FROM stud_user 例 12.23 撤 销 授 予 多 个 用 户 账 户 的 多 个 权 限 REVOKE CREATE TABLE,CREATE DEFAULT FROM stud_user, stud_manager, teach_user 可 以 说,SQ L Server 提 供 了 非 常 灵 活 的 授 权 机 制 数 据 库 管 理 员 拥 有 对 数 据 库 中 所 有 对 象 的 所 有 权 限, 并 可 以 根 据 应 用 的 需 要 将 不 同 的 权 限 授 予 不 同 的 用 户 用 户 对 自 己 建 立 的 表 和 视 图 拥 有 全 部 的 操 作 权 限, 并 且 可 以 用 GRA N T 语 句 把 其 中 某 些 权 限 授 予 其 他 用 户 被 授 权 的 用 户 如 果 有 继 续 授 权 的 许 可, 还 可 以 把 获 得 的 权 限 再 授 予 其 他 用 户 所 有 授 予 出 去 的 权 力 在 必 要 时 又 都 可 以 用 REVOKE 语 句 撤 销 REVOKE 操 作 只 适 用 于 当 前 数 据 库 内 的 权 限 实 训 1. 实 训 目 的 (1) 理 解 SQ L Server 身 份 验 证 模 式 (2) 学 会 创 建 和 管 理 登 录 账 户 和 用 户 账 户 (3) 学 会 创 建 和 管 理 服 务 器 角 色 和 数 据 库 角 色
308 SQL Server 数 据 库 应 用 技 术 (4) 学 会 授 予 拒 绝 或 撤 销 权 限 的 方 法 2. 实 训 的 知 识 准 备 SQ L Server 两 种 验 证 模 式 : Window s 验 证 模 式, 混 合 验 证 模 式 SQ L Server 账 号 有 两 种 : 一 种 是 登 录 服 务 器 的 登 录 账 号, 另 外 一 种 是 使 用 数 据 库 的 用 户 账 号 登 录 账 号 能 登 录 到 SQ L Server 的 账 号, 属 于 服 务 器 的 层 面, 它 本 身 并 不 能 让 用 户 访 问 服 务 器 中 的 数 据 库, 而 登 录 者 要 使 用 服 务 器 中 的 数 据 库 时, 必 须 要 有 用 户 账 号 才 能 够 存 取 数 据 库 在 SQ L Server 中, 权 限 可 分 为 系 统 权 限 和 对 象 权 限 系 统 权 限 由 数 据 库 管 理 员 授 予 其 他 用 户, 是 指 数 据 库 用 户 能 够 对 数 据 库 系 统 进 行 某 种 特 定 的 操 作 的 权 力 例 如 创 建 一 个 数 据 表 CREA TE T ABLE ; 对 象 权 限 由 创 建 基 本 表 视 图 等 数 据 库 对 象 的 用 户 授 予 其 他 用 户, 是 指 数 据 库 用 户 在 指 定 的 数 据 库 对 象 上 进 行 某 种 特 定 的 操 作 的 权 力 如 查 询 SELEC T 插 入 INSER T 修 改 U PDA T E 和 删 除 DELE T E 等 操 作 通 过 授 权 给 用 户 来 指 定 用 户 可 以 访 问 的 数 据 库 对 象 的 权 限 给 用 户 授 予 不 同 类 型 的 权 限, 在 必 要 时, 可 以 收 回 授 权 这 样, 用 户 能 够 进 行 的 数 据 库 操 作 以 及 所 操 作 的 数 据 限 定 在 指 定 的 范 围 内, 禁 止 用 户 超 越 权 限 对 数 据 库 进 行 非 法 的 操 作, 从 而 保 证 数 据 库 的 安 全 性 角 色 是 多 种 权 限 的 集 合, 可 以 把 角 色 授 予 用 户 或 其 他 角 色 当 要 为 某 一 用 户 同 时 授 予 或 收 回 多 项 权 限 时, 则 可 以 把 这 些 权 限 定 义 为 一 个 角 色, 对 此 角 色 进 行 操 作 这 样 就 避 免 了 许 多 重 复 性 的 工 作, 简 化 了 管 理 数 据 库 用 户 权 限 的 工 作 3. 实 训 内 容 和 步 骤 (1) 创 建 登 录 账 户 1 使 用 企 业 管 理 器 创 建 通 过 SQ L Server 身 份 验 证 模 式 的 登 录, 其 中 登 录 名 称 为 stud_login1, 密 码 为 computer1, 默 认 数 据 库 为 student, 其 他 保 持 默 认 值 2 使 用 企 业 管 理 器 创 建 通 过 Windows 身 份 验 证 模 式 的 登 录 提 示 : 首 先 在 Window s 2000 下 创 建 用 户 名 称 为 stud_login2, 密 码 为 computer2 的 用 户, 然 后 在 企 业 管 理 器 中 将 Windo ws 2000 用 户 添 加 到 SQ L Server 登 录 中 3 使 用 系 统 存 储 过 程 sp_addlogin 创 建 登 录, 其 登 录 名 称 为 stud_ login3, 密 码 为 computer3, 默 认 数 据 库 为 student 在 查 询 分 析 器 窗 口 中 输 入 和 执 行 语 句, 并 在 企 业 管 理 器 中 显 示 其 结 果 4 使 用 企 业 管 理 器 删 除 登 录 账 户 stud_login1 stud_login2 5 使 用 系 统 存 储 过 程 sp_droplogin 从 SQ L Server 中 删 除 登 录 账 户 stud_login3 在 查 询 分 析 器 窗 口 中 输 入 和 执 行 语 句, 并 在 企 业 管 理 器 中 显 示 其 结 果 (2) 创 建 和 管 理 数 据 库 用 户 和 角 色 1 创 建 登 录 名 为 stud_user1, 密 码 为 computer, 默 认 数 据 库 为 student, 并 能 连 接 到 student 数 据 库 的 用 户 EXEC sp_addlogin stud_user1, computer, student USE student EXEC sp_grantdbaccess stud_user1, stud_user1
第 12 章 SQL Server 2000 的 安 全 管 理 309 2 使 用 企 业 管 理 器 先 创 建 数 据 库 角 色 ( 标 准 角 色 ), 新 角 色 名 称 为 stud_role1 ; 然 后 将 角 色 成 员 stud_user1 添 加 到 标 准 角 色 中, 最 后 在 企 业 管 理 器 中 删 除 数 据 库 角 色 stud_ role1 3 使 用 系 统 存 储 过 程 sp_addrole 添 加 名 为 stud_role2 的 标 准 角 色 到 student 数 据 库 然 后, 使 用 系 统 存 储 过 程 sp_ droprole 删 除 student 数 据 库 中 名 为 stud_ role2 的 角 色 4 使 用 系 统 存 储 过 程 sp_addapprole 创 建 名 为 stud_ role3 的 应 用 程 序 角 色, 授 权 stud_role3 具 有 stud_grade 表 的 SELEC T 权 限, 以 stud_user1 身 份 连 接 另 一 查 询 分 析 器, 在 新 的 查 询 分 析 器 输 入 和 执 行 SELEC T 语 句, 激 活 应 用 程 序 角 色 stud_role3 后, 重 新 执 行 SELEC T 语 句 5 创 建 一 个 应 用 程 序 角 色 stud_role, 此 角 色 能 够 访 问 student 数 据 库, 并 具 有 读 取 修 改 数 据 表 的 权 限 (3) 管 理 权 限 1 把 查 询 表 stud_grade 的 权 限 授 给 用 户 stud_user1 GRANT SELECT ON stud_grade TO stud_user1 2 把 对 表 stud_grade 的 全 部 操 作 权 限 授 予 用 户 stud_user1 GRANT ALL PRIVILEGES ON stud_grade TO stud_user1 3 把 对 表 stud_grade 的 查 询 权 限 授 予 所 有 用 户 GRANT SELECT ON stud_grade TO public 4 把 查 询 表 stud_grade 和 修 改 学 生 学 号 的 权 限 授 给 用 户 stud_user1 GRANT UPDATE(stud_id), SELECT ON stud_grade TO stud_user1 5 把 对 表 stud_grade 的 INSER T 权 限 授 予 用 户 stud_user1, 并 允 许 将 此 权 限 再 授 予 其 他 用 户 GRANT INSERT ON stud_grade TO stud_user1 WIT H GRANT OPTION 例 如,stud_user1 可 以 将 此 权 限 授 予 stud_user2 GRANT INSERT ON stud_grade TO stud_user2 WIT H GRANT OPTION 同 样,stud_user2 还 可 以 将 此 权 限 授 予 stud_user3 GRANT INSERT ON stud_grade TO stud_user3 6 DBA 把 在 数 据 库 student 中 建 立 表 的 权 限 授 予 用 户 stud_user1 GRANT CREATE T ABLE TO stud_user1 7 把 用 户 stud_user4 修 改 学 生 学 号 的 权 限 撤 销 REVOKE UPDATE(stud_id) ON stud_grade FROM stud_user1 8 撤 销 所 有 用 户 对 表 stud_grade 的 查 询 权 限
310 SQL Server 数 据 库 应 用 技 术 REVOKE SELECT ON stud_grade FROM public 9 把 用 户 stud_user1 对 stud_grade 表 的 INSER T 权 限 撤 销 REVOKE INSERT ON stud_grade FROM stud_user1 CASCADE 10 自 行 练 习 : 针 对 student 数 据 库 中 教 师 基 本 信 息 表 teacher_info, 综 合 使 用 用 户 角 色 和 权 限 的 功 能, 以 达 到 能 够 防 止 非 授 权 用 户 对 数 据 库 中 数 据 表 teacher_info 进 行 存 取 操 作 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) SQ L Server 提 供 了 几 种 身 份 验 证 模 式? 如 何 设 置 身 份 验 证 模 式? (2) 在 SQ L Server 中, 如 何 添 加 一 个 登 录 账 户? 有 几 种 方 法? (3) 创 建 一 个 用 户 的 基 本 要 素 是 什 么? 如 何 修 改 与 删 除 一 个 用 户? (4) SQ L Server 的 权 限 分 为 哪 几 种 不 同 类 型? 如 何 变 更 登 录 账 户 和 用 户 之 间 的 关 系? (5) 概 述 SQ L Server 中 的 系 统 权 限 如 何 授 予 查 看 和 撤 销 系 统 权 限? 何 为 对 象 级 权 限? 如 何 授 予 和 撤 销 对 象 权 限? 从 何 处 可 以 查 询 到 对 象 权 限? (6) 什 么 是 角 色? 服 务 器 角 色 和 数 据 库 角 色 的 区 别 是 什 么? 如 何 将 一 个 表 的 操 作 权 限 简 便 地 授 予 所 有 用 户? 建 立 角 色 的 要 点 是 什 么? 将 没 有 任 何 权 限 的 角 色 授 予 用 户 会 起 何 作 用? 可 从 哪 个 字 典 中 查 阅 到 角 色 的 权 限? 简 述 角 色 的 优 缺 点 (7) SQ L Server 的 安 全 账 户 分 为 哪 两 级? 分 别 存 放 在 哪 两 个 系 统 表 中? (8) 要 想 给 一 个 用 户 账 户 授 予 创 建 表 的 权 限, 应 如 何 操 作? 2. 按 照 题 目 要 求 完 成 下 列 任 务, 并 在 机 器 进 行 测 试 (1) 完 成 下 列 创 建 用 户 的 操 作 1 为 用 户 stud_login1 创 建 一 个 SQ L Server 登 录 名, 不 指 定 密 码 或 默 认 数 据 库 EXEC sp_addlogin stud_ login 1 2 为 用 户 stud_login2 创 建 一 个 SQ L Server 登 录, 并 指 定 密 码 123456 以 及 名 为 student 的 默 认 数 据 库 EXEC sp_addlogin stud_login2, 123456, student 3 使 Window s 用 户 computer\stud_admin 得 以 连 接 到 SQ L Server EXEC sp_grantlogin computer\stud_admin 4 使 用 现 有 的 登 录 stud_login1, 将 用 户 stud_user 添 加 到 当 前 数 据 库 中 现 有 的 stud_ role 角 色 中 EXEC sp_adduser stud_login1, stud_user, stud_role
第 12 章 SQL Server 2000 的 安 全 管 理 311 5 创 建 一 个 名 字 为 stud_user2 的 用 户 账 户, 并 与 登 录 账 户 stud_login1 链 接, 其 权 限 仅 可 以 访 问 student 数 据 库, 但 是 此 用 户 没 有 操 作 数 据 库 的 其 他 任 何 权 限 (2) 对 已 创 建 的 用 户 (stud_user) 进 行 如 下 操 作 1 授 予 在 student 数 据 库 上 创 建 表 的 权 限 2 授 予 用 户 stud_user 对 表 stud_info 的 查 询 和 修 改 权 限 3 将 用 户 stud_user 添 加 到 当 前 数 据 库 中 db_ow ner 角 色 中 4 查 看 用 户 stud_user 的 有 效 权 限 5 撤 销 用 户 stud_user 的 所 有 权 限 (3) 完 成 下 列 有 关 角 色 的 操 作 1 创 建 一 个 名 为 stud_role 的 角 色, 并 能 够 访 问 数 据 库, 具 有 读 取 修 改 表 的 权 限 2 在 指 定 数 据 库 student 中 建 立 一 个 应 用 程 序 角 色 app_stud_role 3 将 对 stud_info 表 的 查 询 插 入 权 限 授 予 stud_role 角 色 4 将 所 创 建 的 角 色 赋 予 用 户 stud_user, 以 此 达 到 操 作 数 据 库 student 的 目 的 5 查 看 stud_role 角 色 的 权 限 信 息 6 撤 销 stud_role 角 色 的 所 有 权 限 (4) 请 说 明 下 列 语 句 的 功 用 1 GRANT CREATE DAT ABASE,CREATE T ABLE TO stud_user,teach_user,[computer\stud_admin] 2 GRANT SELECT ON stud_info TO public GRANT INSERT,UPDATE,DELETE ON authors TO stud_user,teach_user 3 DENY CREATE DA T ABASE,CREATE T ABLE TO stud_user,teach_user,[computer\stud_admin] 4 DENY SELECT,INSERT,UPDA TE,DELETE ON stud_grade TO stud_user,teach_user,tom 5 REVOKE CREATE T ABLE,CREA TE DEFAULT FROM stud_user,teach_user,[computer\stud_admin] 6 EXEC sp_helprotect
第 13 章 备 份 与 还 原 任 何 系 统 都 不 可 避 免 会 出 现 各 种 形 式 的 故 障, 而 某 些 故 障 可 能 会 导 致 数 据 库 灾 难 性 的 损 坏, 所 以 做 好 数 据 库 的 备 份 工 作 极 为 重 要 备 份 可 以 创 建 在 磁 盘 磁 带 等 备 份 设 备 上, 与 备 份 对 应 的 是 还 原 本 章 将 着 重 讨 论 数 据 库 备 份 与 还 原 的 相 关 问 题 13.1 备 份 与 还 原 的 概 述 13.1.1 备 份 与 还 原 概 念 1. 数 据 库 备 份 备 份 是 在 某 种 介 质 上 ( 磁 带 磁 盘 等 ) 存 储 数 据 库 ( 或 者 其 中 一 部 分 ) 的 复 制 对 SQ L Server 数 据 库 或 事 务 日 志 进 行 备 份, 就 是 记 录 在 进 行 备 份 这 一 操 作 时 数 据 库 中 所 有 数 据 的 状 态, 以 便 在 数 据 库 遭 到 破 坏 时 能 够 及 时 地 将 其 还 原 执 行 备 份 操 作 必 须 拥 有 对 数 据 库 备 份 的 权 限 许 可,SQ L Server 只 允 许 系 统 管 理 员 数 据 库 所 有 者 和 数 据 库 备 份 执 行 者 备 份 数 据 库 数 据 库 备 份 前, 需 要 对 备 份 内 容 备 份 频 率 以 及 数 据 备 份 存 储 介 质 进 行 计 划 (1) 备 份 内 容 备 份 内 容 主 要 包 括 : 系 统 数 据 库 用 户 数 据 库 和 事 务 日 志 1 系 统 数 据 库 记 录 了 SQ L Server 系 统 配 置 参 数 用 户 资 料 以 及 所 有 用 户 数 据 库 等 重 要 信 息, 主 要 包 括 master msdb 和 model 数 据 库 2 用 户 数 据 库 中 存 储 了 用 户 的 数 据 由 于 用 户 数 据 库 具 有 很 强 的 区 别 性, 即 每 个 用 户 数 据 库 之 间 的 数 据 一 般 都 有 很 大 差 异, 所 以 对 用 户 数 据 库 的 备 份 尤 为 重 要 3 事 务 日 志 记 录 了 用 户 对 数 据 的 各 种 操 作, 平 时 系 统 会 自 动 管 理 和 维 护 所 有 的 数 据 库 事 务 日 志 相 比 数 据 库 备 份, 事 务 日 志 备 份 所 需 要 的 时 间 较 少, 但 是 还 原 需 要 的 时 间 较 长 (2) 备 份 频 率 数 据 库 备 份 频 率 一 般 取 决 于 修 改 数 据 库 的 频 繁 程 度 以 及 一 旦 出 现 意 外 丢 失 的 工 作 量 的 大 小, 还 有 发 生 意 外 丢 失 数 据 的 可 能 性 大 小 一 般 来 说, 在 正 常 使 用 阶 段, 对 系 统 数 据 库 的 修 改 不 会 十 分 频 繁, 所 以 对 系 统 数 据 库
第 13 章 备 份 与 还 原 313 的 备 份 也 不 需 要 十 分 频 繁, 只 要 在 执 行 某 些 语 句 或 存 储 过 程 导 致 SQ L Server 对 系 统 数 据 库 进 行 了 修 改 的 时 候 备 份 当 在 用 户 数 据 库 中 执 行 了 加 入 数 据 创 建 索 引 等 操 作 时, 应 该 对 用 户 数 据 库 进 行 备 份 此 外 如 果 清 除 了 事 务 日 志, 也 应 该 备 份 数 据 库 (3) 备 份 存 储 介 质 常 用 的 备 份 存 储 介 质 包 括 硬 盘 磁 带 和 命 名 管 道 等 备 份 应 该 按 照 需 要 经 常 进 行, 并 进 行 有 效 的 数 据 管 理 SQ L Server 备 份 可 以 在 数 据 库 使 用 时 进 行, 但 是 一 般 在 非 高 峰 活 动 时 备 份 效 率 更 高 注 意 : 备 份 是 一 种 十 分 耗 费 时 间 和 资 源 的 操 作, 不 能 频 繁 操 作 应 该 根 据 数 据 库 使 用 情 况 确 定 一 个 适 当 的 备 份 周 期 2. 数 据 库 还 原 备 份 可 以 防 止 数 据 库 遭 受 破 坏 介 质 失 效 或 用 户 错 误 备 份 是 还 原 数 据 库 最 容 易 和 最 能 防 止 意 外 的 有 效 方 法 没 有 备 份, 所 有 的 数 据 都 可 能 会 丢 失, 而 且 将 造 成 不 可 挽 回 的 损 失, 这 时 就 不 得 不 从 源 头 重 建 数 据 ; 有 了 备 份, 万 一 数 据 库 被 损 坏, 就 可 以 使 用 备 份 来 还 原 数 据 库 还 原 数 据 库 是 一 个 装 载 数 据 库 的 备 份, 然 后 应 用 事 务 日 志 重 建 的 过 程 应 用 事 务 日 志 之 后, 数 据 库 就 会 回 到 最 后 事 务 日 志 务 份 之 前 的 状 态 在 数 据 库 备 份 之 前, 应 该 检 查 数 据 库 中 数 据 的 一 致 性, 这 样 才 能 保 证 顺 利 地 还 原 数 据 库 备 份 在 数 据 库 的 还 原 过 程 中, 用 户 不 能 进 入 数 据 库, 当 数 据 库 被 还 原 后, 数 据 库 中 的 所 有 数 据 都 被 替 换 掉 如 果 数 据 库 做 过 完 全 备 份 和 事 务 日 志 备 份, 那 么 还 原 它 是 很 容 易 的 倘 若 保 持 着 连 续 的 事 务 日 志, 就 能 快 速 地 重 新 构 造 和 建 立 数 据 库 在 还 原 一 个 失 效 的 数 据 库 之 前, 调 查 失 效 背 后 的 原 因 是 很 重 要 的 如 果 数 据 库 的 损 坏 是 由 介 质 错 误 引 起 的, 那 么 就 需 要 替 换 失 败 的 介 质 倘 若 是 由 于 用 户 的 问 题 而 引 起 的, 那 么 就 需 要 针 对 发 生 的 问 题 和 今 后 如 何 避 免 采 取 相 应 的 对 策 还 原 数 据 库 是 一 个 装 载 最 近 备 份 的 数 据 库 和 应 用 事 务 日 志 来 重 建 数 据 库 到 失 效 点 的 过 程 定 点 还 原 可 以 把 数 据 库 还 原 到 一 个 固 定 时 间 点, 这 种 选 项 仅 适 用 于 事 务 日 志 备 份 当 还 原 事 务 日 志 备 份 时, 必 须 按 照 它 们 建 造 的 顺 序 还 原 13.1.2 备 份 与 还 原 方 式 1. 数 据 库 备 份 方 式 SQ L Server 2000 对 所 要 备 份 内 容 的 选 项 设 置, 提 供 了 四 种 不 同 的 方 式 : (1) 数 据 库 完 全 备 份 数 据 库 完 全 备 份 (Database 唱 complete) 是 整 个 数 据 库 的 一 个 复 制 该 备 份 复 制 在 一 个 文 件 里 (2) 差 异 备 份 或 称 增 量 备 份 数 据 库 增 量 备 份 (Database 唱 differential) 包 含 了 自 上 次 完 全 数 据 库 备 份 以 来 数 据 库 中 所 有 变 化 的 复 制 (3) 事 务 日 志 备 份 事 务 日 志 备 份 ( T ransaction log) 包 含 事 务 日 志 的 复 制, 它 包 括 数 据 库 里 所 发 生 的 每 个 数 据 改 动 前 后 的 映 像
314 SQL Server 数 据 库 应 用 技 术 (4) 数 据 库 文 件 和 文 件 组 备 份 数 据 库 文 件 和 文 件 组 备 份 (File and filegroup) 是 针 对 某 一 个 文 件 或 文 件 组 的 复 制 2. 数 据 库 还 原 方 式 还 原 方 式 依 赖 于 数 据 库 备 份 的 方 式 不 同 而 有 所 变 化 通 常, 首 先 还 原 最 近 的 数 据 库 完 全 备 份, 然 后 还 原 事 务 日 志 备 份 或 增 量 备 份 (1) 完 全 还 原 方 式 完 全 还 原 方 式 使 用 数 据 库 备 份 和 事 务 日 志 备 份 将 数 据 库 还 原 到 故 障 点 或 特 定 即 时 点 为 保 证 这 种 还 原 程 度, 包 括 大 容 量 操 作 ( 如 SELEC T IN T O CREA T E INDEX 和 大 容 量 装 载 数 据 ) 在 内 的 所 有 操 作 都 将 完 整 地 记 入 日 志 由 于 还 原 到 任 意 即 时 点, 这 样 数 据 文 件 的 丢 失 和 损 坏 不 会 导 致 工 作 损 失 但 是 如 果 事 务 日 志 ( 此 项 十 分 重 要 ) 损 坏, 则 必 须 重 新 做 最 新 的 日 志 备 份 后 进 行 的 修 改 (2) 简 单 还 原 方 式 简 单 还 原 方 式 将 数 据 库 还 原 到 上 次 备 份 处, 但 是 无 法 将 数 据 库 还 原 到 故 障 点 或 指 定 的 即 时 点 常 用 于 还 原 最 新 的 数 据 库 完 全 备 份 和 差 异 备 份 这 种 方 式 允 许 高 性 能 大 容 量 复 制 操 作, 以 及 可 以 回 收 日 志 空 间, 但 是 必 须 重 组 最 新 的 数 据 库 或 者 差 异 备 份 后 的 更 改 (3) 大 容 量 日 志 记 录 还 原 方 式 大 容 量 日 志 记 录 还 原 方 式 为 某 些 大 规 模 或 大 容 量 复 制 操 作 提 供 最 佳 性 能 和 最 少 的 日 志 使 用 空 间 与 完 全 还 原 方 式 类 似, 必 须 十 分 注 意 保 护 事 务 日 志 记 录 当 日 志 备 份 包 含 大 容 量 更 改 时, 大 容 量 日 志 记 录 还 原 方 式 只 允 许 数 据 库 还 原 到 事 务 日 志 备 份 的 结 尾 处 不 支 持 即 时 点 还 原 这 种 方 式 节 省 日 志 空 间, 使 用 最 小 日 志 空 间 但 是 如 果 日 志 损 坏 或 者 日 志 备 份 后 发 生 了 大 容 量 操 作, 则 必 须 重 做 自 上 次 备 份 后 所 做 的 更 改 13.2 数 据 库 的 备 份 13.2.1 备 份 设 备 在 进 行 备 份 以 前 必 须 创 建 或 指 定 备 份 设 备 备 份 设 备 是 用 来 存 储 数 据 库 事 务 日 志 或 文 件 和 文 件 组 备 份 的 存 储 介 质, 可 以 是 硬 盘 磁 带 或 管 道 备 份 设 备 在 硬 盘 中 是 以 文 件 的 方 式 存 储 的, 与 常 规 操 作 系 统 文 件 一 样 引 用 磁 盘 备 份 设 备 与 引 用 任 何 其 他 操 作 系 统 文 件 一 样 可 以 在 服 务 器 的 本 地 磁 盘 上 或 共 享 网 络 资 源 的 远 程 磁 盘 上 定 义 磁 盘 备 份 设 备, 磁 盘 备 份 设 备 根 据 需 要 可 大 可 小 最 大 的 文 件 大 小 相 当 于 磁 盘 上 可 用 的 闲 置 空 间 如 果 在 网 络 上 将 文 件 备 份 到 远 程 计 算 机 上 的 磁 盘, 使 用 命 名 规 则 的 名 称, 以 \\Servername\Sharename\Path\File 格 式 指 定 文 件 的 位 置 提 示 : 建 议 不 要 将 数 据 库 或 事 务 日 志 备 份 到 数 据 库 所 在 的 同 一 物 理 磁 盘 上 的 文 件 中 如 果 包 含 数 据 库 的 磁 盘 设 备 发 生 故 障, 由 于 备 份 位 于 同 一 发 生 故 障 的 磁 盘 上, 因 此 无 法 还 原 数 据 库 SQ L Server 使 用 物 理 设 备 名 称 或 逻 辑 设 备 名 称 标 识 备 份 设 备 物 理 备 份 设 备 是 操 作 系 统 用 来 标 识 备 份 设 备 的 名 称, 如 d : \backup\student.bak 逻 辑 备 份 设 备 是 用 来 标
第 13 章 备 份 与 还 原 315 识 物 理 备 份 设 备 的 别 名 或 公 用 名 称 逻 辑 设 备 名 称 永 久 地 存 储 在 SQ L Server 内 的 系 统 表 中 使 用 逻 辑 备 份 设 备 的 优 点 是 引 用 它 比 引 用 物 理 设 备 名 称 简 单 例 如, 逻 辑 设 备 名 称 可 以 是 stud_backup, 而 物 理 设 备 名 称 则 是 d : \backup\student.bak 通 常, 备 份 或 还 原 数 据 库 时, 可 以 交 替 使 用 物 理 或 逻 辑 备 份 设 备 名 称 1. 创 建 备 份 设 备 创 建 备 份 时, 必 须 选 择 存 放 备 份 数 据 的 备 份 设 备 在 SQ L Server 2000 中, 可 以 将 数 据 库 事 务 日 志 文 件 和 文 件 组 备 份 到 磁 盘 和 磁 带 设 备 上 创 建 备 份 设 备 有 以 下 两 种 方 法 : (1) 使 用 SQ L Server 企 业 管 理 器 创 建 备 份 设 备 使 用 企 业 管 理 器 创 建 备 份 设 备 的 步 骤 如 下 : 在 企 业 管 理 器 中 展 开 服 务 器 组, 展 开 指 定 的 服 务 器, 展 开 管 理 文 件 夹, 右 击 备 份, 在 弹 出 的 快 捷 菜 单 中 选 择 新 建 备 份 设 备 选 项, 打 开 备 份 设 备 属 性 新 设 备 对 话 框, 如 图 13 唱 1 所 示 在 名 称 文 本 框 中 输 入 逻 辑 设 备 的 名 称, 在 下 面 选 择 磁 带 或 者 磁 盘 备 份 设 备, 并 设 置 物 理 位 置 当 使 用 磁 盘 时,SQ L Server 允 许 将 本 地 主 机 硬 盘 和 远 程 主 机 上 的 硬 盘 作 为 备 份 设 备, 备 份 设 备 在 硬 盘 中 是 以 文 件 的 方 式 存 储 的 完 成 后, 单 击 确 定 按 钮 即 可 (2) 使 用 系 统 存 储 过 程 创 建 备 份 设 备 图 13 唱 1 备 份 设 备 属 性 对 话 框 系 统 存 储 过 程 sp_addumpdevice 用 来 创 建 永 久 备 份 设 备, 所 创 建 的 备 份 设 备 的 类 型 和 名 称 记 录 在 数 据 库 master 的 sysdevices 系 统 表 中 ; 未 经 sp_addumpdevice 创 建 的 备 份 设 备 为 临 时 设 备 在 SQ L Server 中, 使 用 sp_addumpdevice 语 句 创 建 备 份 设 备 的 语 法 形 式 如 下 : sp_addumpdevice [ @ devtype = ] device_type, [ @ logicalname = ] logical_name, [ @ physicalname = ] physical_name 其 中,[ @ devtype = ] device_type 为 备 份 设 备 的 类 型, 例 如,Disk( 硬 盘 ) Pipe( 命 名 管 道 ) Tape( 磁 带 ) ;[ @ logicalname = ] logical_name 为 备 份 设 备 的 逻 辑 名 称, 该 逻 辑 名 称 用 于 BACK U P 和 RES T ORE 语 句 中 ;[ @ physicalname = ] physical_name 为 备 份 设 备
316 SQL Server 数 据 库 应 用 技 术 的 物 理 名 称 物 理 名 称 必 须 遵 循 操 作 系 统 文 件 名 称 的 规 则 或 者 网 络 设 备 的 通 用 命 名 规 则, 并 且 必 须 使 用 完 整 的 路 径 例 13.1 在 磁 盘 上 创 建 一 个 备 份 设 备, 在 查 询 分 析 器 输 入 下 列 命 令 USE master EXEC sp_addumpdevice disk, teacher_backup, C :\Program Files\ Microsoft SQL Server\ MSSQL\BACKUP\teacher_backup.bak 2. 删 除 备 份 设 备 (1) 使 用 企 业 管 理 器 删 除 设 备 删 除 备 份 设 备 与 创 建 的 过 程 类 似, 启 动 企 业 管 理 器 选 择 使 用 的 服 务 器 选 择 管 理 文 件 夹 中 的 备 份 选 项, 在 右 边 的 窗 格 显 示 备 份 设 备 名 称 右 击 需 要 删 除 的 备 份 设 备 在 弹 出 的 快 捷 菜 单 中 选 择 删 除 选 项 在 确 认 对 话 框 单 击 是, 即 可 删 除 备 份 设 备 (2) 使 用 sp_dropdevice 删 除 设 备 使 用 sp_dropdevice 语 句 来 删 除 备 份 设 备 的 语 法 如 下 : sp_dropdevice [ @ logicalname = ] logical_name [,[ @ delfile = ] delfile ] 其 中,delfile 是 欲 删 除 数 据 库 备 份 的 操 作 系 统 中 的 物 理 文 件 例 13.2 删 除 上 面 创 建 的 备 份 设 备 EXEC sp_dropdevice teacher_backup 13.2.2 使 用 企 业 管 理 器 进 行 备 份 (1) 启 动 企 业 管 理 器, 登 录 到 指 定 的 数 据 库 服 务 器, 打 开 数 据 库 文 件 夹, 右 击 所 要 进 行 备 份 的 数 据 库 图 标, 在 弹 出 的 快 捷 菜 单 中 选 择 所 有 任 务, 再 选 择 备 份 数 据 库 (2) 出 现 SQ L Server 备 份 对 话 框, 对 话 框 中 有 两 个 标 签 页, 即 常 规 和 选 项 标 签 页, 如 图 13 唱 2 所 示 (3) 在 常 规 标 签 页 中, 选 择 欲 备 份 数 据 库 的 名 称 备 份 的 名 称 描 述 信 息 备 份 的 类 型 备 份 的 介 质 备 份 的 执 行 时 间 其 中, 数 据 库 完 全 数 据 库 差 异 事 务 日 志 以 及 文 件 和 文 件 组, 分 别 表 示 完 全 备 份 增 量 备 份 事 务 日 志 和 文 件 及 文 件 组 的 备 份 (4) 在 目 的 组 可 以 设 置 备 份 设 备 名 称 添 加 按 钮 可 以 添 加 备 份 设 备 ; 删 除 按 钮 可 以 表 示 删 除 备 份 设 备 ; 内 容 按 钮 可 以 显 示 有 关 备 份 设 备 的 信 息 单 击 目 的 选 项 组 中 的 添 加 按 钮, 打 开 选 择 备 份 目 的 对 话 框, 在 此 对 话 框 中 可 以 选 择 备 份 设 图 13 唱 2 SQL Server 备 份 的 对 话 框 备, 或 者 设 置 一 个 文 件 名 称 来 备 份 数 据 库
第 13 章 备 份 与 还 原 317 例 如, 选 择 前 面 创 建 的 备 份 设 备 stud_ backup 设 置 完 成 后, 单 击 确 定 按 钮, 返 回 到 SQ L Server 备 份 对 话 框 (5) 在 重 写 组 中 可 以 选 择 是 否 保 存 备 份 设 备 中 原 有 的 备 份 如 果 需 要 保 留, 选 择 追 加 到 媒 体 项 ; 如 果 覆 盖 以 前 的 备 份, 则 选 择 重 写 现 有 媒 体 项 (6) 如 果 要 设 置 自 动 备 份 的 时 间, 可 选 择 调 度 复 选 框, 其 默 认 设 置 为 每 1 周 在 星 期 日 发 生, 在 0 :00 :00 可 以 单 击 后 面 带 有 3 个 省 略 号 的 按 钮 来 设 置 调 度 时 间, 此 时 会 打 开 编 辑 调 度 对 话 框 在 名 称 文 本 框 中 可 以 输 入 调 度 的 名 称, 在 调 度 类 型 迭 项 组 中 可 以 迭 择 调 度 类 型, 并 设 置 调 度 时 间 设 置 完 成 后, 单 击 确 定 按 钮, 返 回 SQ L Server 备 份 对 话 框 (7) 选 择 备 份 对 话 框 的 选 项 标 签 页, 进 入 其 对 话 框 在 选 项 组 有 5 个 复 选 框, 自 上 而 下 分 别 表 示 : 系 统 在 备 份 完 成 后 对 备 份 数 据 进 行 检 验 ; 在 备 份 完 成 后 磁 带 自 动 卸 带, 该 复 选 项 只 对 磁 带 介 质 有 效 ; 在 备 份 前 清 除 事 务 日 志 中 的 不 活 动 日 志 内 容 ; 在 备 份 前 检 查 备 份 介 质 集 的 名 称 和 有 效 日 期, 选 中 该 选 项 后, 可 以 在 文 本 框 中 输 入 要 检 查 的 备 份 介 质 集 名 称 ; 设 置 备 份 集 的 失 效 日 期 在 媒 体 集 标 签 组 中, 可 以 设 置 或 更 改 介 质 的 卷 标 如 果 选 定 初 始 化 并 标 识 媒 体 复 选 框, 表 示 初 始 化 介 质, 并 设 置 卷 标, 选 中 后 可 以 输 入 介 质 集 名 称 和 介 质 集 描 述 (8) 最 后, 在 SQ L Server 备 份 对 话 框 中, 单 击 确 定 按 钮, 即 可 开 始 备 份 13.2.3 使 用 向 导 进 行 备 份 图 13 唱 3 至 13 唱 10 是 使 用 向 导 进 行 备 份 的 操 作 过 程 读 者 可 以 按 照 向 导 的 提 示 一 步 一 步 地 完 成 备 份 的 设 置 (1) 在 企 业 管 理 器 中 展 开 服 务 器 组, 选 定 指 定 的 服 务 器 选 择 主 菜 单 的 工 具 菜 单 中 的 向 导 选 项, 打 开 如 图 13 唱 3 所 示 的 选 择 向 导 对 话 框 图 13 唱 3 选 择 向 导
318 SQL Server 数 据 库 应 用 技 术 (2) 展 开 管 理, 选 择 其 中 的 备 份 向 导 选 项 单 击 确 定 按 钮, 启 动 如 图 13 唱 4 所 示 的 创 建 数 据 库 备 份 向 导 图 13 唱 4 欢 迎 使 用 向 导 对 话 框 (3) 在 欢 迎 使 用 向 导 对 话 框 中, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 5 所 示 的 选 择 要 备 份 的 数 据 库 对 话 框 图 13 唱 5 选 择 要 备 份 的 数 据 库 对 话 框 (4) 在 数 据 库 下 拉 式 列 表 中 选 择 需 要 备 份 的 数 据 库, 选 择 完 毕 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 6 所 示 的 输 入 备 份 名 称 和 描 述 信 息 对 话 框
第 13 章 备 份 与 还 原 319 图 13 唱 6 输 入 备 份 名 称 和 描 述 信 息 对 话 框 (5) 键 入 备 份 名 称 和 描 述 信 息 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 7 所 示 的 选 择 备 份 类 型 对 话 框 图 13 唱 7 选 择 备 份 类 型 对 话 框 (6) 选 择 好 备 份 类 型 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 8 所 示 的 选 择 设 置 备 份 设 备 和 属 性 对 话 框 (7) 设 置 好 备 份 设 备 和 属 性 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 9 所 示 的 备 份 验 证 和 调 度 对 话 框
320 SQL Server 数 据 库 应 用 技 术 图 13 唱 8 设 置 备 份 设 备 和 属 性 对 话 框 图 13 唱 9 备 份 验 证 和 调 度 对 话 框 (8) 设 置 好 验 证 和 调 度 的 相 关 信 息 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 10 所 示 的 确 认 执 行 备 份 操 作 对 话 框 (9) 在 确 认 执 行 备 份 操 作 对 话 框 中, 显 示 了 备 份 设 置 信 息 摘 要 如 果 没 有 什 么 问 题, 单 击 完 成 按 钮, 就 可 以 开 始 创 建 备 份 了 13.2.4 使 用 查 询 分 析 器 进 行 备 份 使 用 T ransact 唱 SQ L 语 句 的 BACK U P 语 句 可 以 将 整 个 数 据 库 文 件 及 文 件 组 和 事 务
第 13 章 备 份 与 还 原 321 图 13 唱 10 确 认 执 行 备 份 操 作 对 话 框 日 志 备 份 到 存 储 介 质 上 ( 软 盘 硬 盘 磁 带 等 ) 1. 数 据 库 备 份 (1) 使 用 BACK U P 语 句 备 份 数 据 库 的 语 法 形 式 BACKUP DATABASE {database_name @ database_name_var} TO < backup_device > [,...n] [WITH [DESCMPTION = { text @ text_varable}] [[,]DIFFERBNTIAL] [[,]INIT NOINIT] [[,]MEDIANAME = {media_name @ media_name_variable}] [[,]NAME = {backup_set_name @ backup_set_name_var}] ] (2) 参 数 说 明 1 BACK U P DA T ABASE, 指 定 一 个 数 据 库 的 完 全 备 份 2 {database_name @ database_name_var} 为 欲 备 份 数 据 库 的 文 件 名 或 备 份 数 据 库 的 变 量 名 3 < backup_device >, 指 定 备 份 操 作 时 要 使 用 的 逻 辑 或 物 理 备 份 设 备 可 以 是 以 下 两 种 情 况 :{logical_backup_device_name} { @ logical_backup_device_name_var} 或 者 {DISK TAPE } = physical_ backup_ device_ name @ physical_ backup_ device_ name_var 第 一 种 情 况 表 示 指 定 由 sp_addumpdevice 创 建 的 备 份 设 备 的 逻 辑 名 称, 数 据 库 将 备 份 到 该 设 备 中 第 二 种 情 况 表 示 指 定 备 份 设 备 的 物 理 名 称 和 设 备 类 型, 在 执 行 BACK U P 语 句 之 前 不 必 存 在 指 定 的 物 理 设 备 4 DESCRIP TION = { text @ text_variable}, 备 份 描 述 文 本, 最 长 可 以 有 255 个
322 SQL Server 数 据 库 应 用 技 术 字 符 5 DIFFEREN TIA L, 说 明 以 差 异 备 份 的 方 式 进 行 备 份 数 据 库 差 异 备 份 一 般 会 比 完 整 备 份 占 用 更 少 的 空 间 6 INI T 表 示 重 写 所 有 备 份 以 下 两 种 情 况 除 外 : 设 备 中 的 所 有 数 据 仍 在 有 效 期 内 ;BACK U P 语 句 给 出 的 备 份 名 称 与 该 设 备 的 名 称 不 匹 配 NOINI T 表 示 本 次 备 份 迫 加 到 介 质 中 的 现 有 数 据 后, 而 不 覆 盖 原 有 的 备 份 数 据 N OINI T 是 默 认 设 置 7 M EDIA N A M E = {media_name @ media_name_variable}, 说 明 备 份 介 质 名 称, 最 多 为 128 个 字 符 假 如 指 定 了 MEDIA N A ME, 则 它 必 须 与 以 前 指 定 的 介 质 名 称 相 匹 配, 该 介 质 名 称 已 存 在 于 备 份 卷 中 假 如 没 有 指 定 M EDIA N A M E, 将 不 会 对 介 质 名 称 进 行 匹 配 检 查 8 N A M E = {backup_set_name @ backup_set_name_var}, 指 定 备 份 的 名 称, 最 长 为 128 个 字 符 (3) 简 单 例 子 例 13.3 首 先 创 建 一 个 备 份, 然 后 对 student 数 据 库 做 一 次 完 全 备 份 USE master GO EXEC sp_addumpdevice disk, student_bp, c :\program files\ Microsoft SQL Server\ MSSQL\BACKUP\student_bp.bak BACKUP DAT ABASE student TO student_bp 2. 文 件 及 文 件 组 备 份 (1) 使 用 BACK U P 备 份 数 据 文 件 及 文 件 组 语 法 形 式 BACKUP DATABASE{database_name @ database_name_var} < file_or_filegroup > [,...n] TO < backup_device > [,...n] [WITH [DESCRIPTION = { text @ text variable}]] [[,]DIFFERENTIAL] [[,]{INIT NOINIT}] [[,]MEDIANAME = {media name @ media_name_variable}] [[,]NAME = {backup_set_name @ backup_set_name_var} ] (2) 参 数 说 明 < file_or_filegroup > 指 定 包 含 在 数 据 库 备 份 中 的 文 件 或 文 件 组 的 逻 辑 名, 可 以 指 定 多 个 文 件 或 文 件 组 例 如,file = {logical_file_name @ logica_file_name_var} 给 一 个 或 多 个 包 含 在 数 据 库 备 份 中 的 文 件 命 名 ;filegroup = {logical_filegroup_name @ logical_ fi1egroup_name_var} 给 一 个 或 多 个 包 含 在 数 据 库 备 份 中 的 文 件 组 命 名 注 意 : 必 须 通 过 使 用 BACK U P LOG 提 供 事 务 日 志 的 单 独 备 份, 才 能 使 用 文 件 和 文 件 组 备 份 来 还 原 数 据 库 如 果 还 原 方 式 为 简 单 还 原 方 式, 则 不 允 许 文 件 和 文 件 组 备 份
第 13 章 备 份 与 还 原 323 3. 备 份 事 务 日 志 (1) 使 用 BACK U P 语 句 备 份 事 务 日 志 的 语 法 形 式 BACKUP LOG {database_name @ database_name_var} TO < backup_device > [,...n] [WITH [BLOCKSIZE = {blocksize @ blocksize_variable}] [[,]DESCMPTION = { text @ text_varable}] [[,]FORMAT NOFORMAT] [[,]INIT NOINIT] [[,]MEDIANAME = {media_name @ media_name_variable}] [[,]NAME = {backup_set_name @ backup_set_name_var}] [[,]NO_TRUNCATE] [[,]{NORECOVERY STANDBY = undo_file_name}] ] (2) 参 数 说 明 1 NORECOVERY : 备 份 日 志 尾 部 并 使 数 据 库 处 于 正 在 还 原 的 状 态 只 与 BACK U P LOG 一 起 使 用 2 S T A NDBY = undo_f11e_name : 备 份 日 志 尾 部 并 使 数 据 库 处 于 只 读 或 备 用 模 式 撤 销 文 件 名 指 定 了 容 纳 回 滚 更 改 的 存 储, 如 果 随 后 应 用 RES T ORE LOG 操 作, 则 必 须 撤 销 这 些 回 滚 更 改 该 参 数 只 与 BACK U P LOG 一 起 使 用 3 LOG : 指 定 只 备 份 事 务 日 志 该 日 志 是 从 上 一 次 成 功 执 行 了 的 LOG 备 份 到 当 前 日 志 的 末 尾 一 旦 备 份 日 志, 可 能 会 截 断 复 制 或 活 动 事 务 不 再 需 要 的 空 间 4 NO_LOG T RLINCA T E_ON LY : 说 明 不 作 日 志 备 份, 只 删 除 无 效 的 日 志 部 分, 并 且 截 断 日 志 该 选 项 会 释 放 空 间 5 NO_TRU NCA T E : 允 许 在 数 据 库 不 可 访 问 的 情 况 下 也 备 份 日 志 注 意 : 使 用 NO_LOG 或 T RU NCA T E_ON LY 备 份 日 志 后, 记 录 在 日 志 中 的 更 改 不 可 还 原 为 了 还 原, 请 立 即 执 行 BACK U P DA T ABASE (3) 简 单 例 子 例 13.4 备 份 数 据 库 student 和 事 务 日 志 USE master GO EXEC sp_addumpdevice disk, student_bp_log, c :\Program Files\ Microsoft SQL Server\ MSSQL\BACKUP\student_bp_log.bak BACKUP DATABASE student TO student_bp 唱 备 份 整 个 student 数 据 库 BACKUP LOG student TO student_bp_log 唱 备 份 student 数 据 库 的 事 务 日 志 例 13.4 首 先 创 建 了 日 志 备 份 设 备, 然 后 在 完 全 备 份 student 数 据 库 的 基 础 上, 将 事 务 日 志 备 份 到 称 为 student_bp_log 的 备 份 设 备 上 用 户 可 以 通 过 事 务 日 志 备 份 来 记 录 数 据 库 的 变 化 不 过, 必 须 在 执 行 了 完 全 备 份 且 数 据 库 有 了 事 务 日 志 之 后, 才 能 进 行 事 务 日 志 的 备 份
324 SQL Server 数 据 库 应 用 技 术 13.3 数 据 库 的 还 原 数 据 库 备 份 后, 一 旦 系 统 发 生 崩 溃 或 者 执 行 了 数 据 库 的 误 操 作, 就 可 以 从 备 份 文 件 中 还 原 数 据 库 数 据 库 还 原 是 指 将 数 据 库 备 份 加 载 到 系 统 中 的 过 程 系 统 在 还 原 数 据 库 的 过 程 中, 自 动 执 行 安 全 性 检 查 重 建 数 据 库 结 构 以 及 完 整 数 据 库 内 容 13.3.1 使 用 企 业 管 理 器 还 原 数 据 库 使 用 SQ L Server 企 业 管 理 器 还 原 数 据 库 的 主 要 步 骤 如 下 : (1) 打 开 服 务 器 组, 然 后 展 开 服 务 器 (2) 打 开 数 据 库 文 件 夹, 右 击 需 要 进 行 备 份 的 数 据 库, 在 弹 出 的 快 捷 菜 单 中 选 择 所 有 任 务, 选 择 还 原 数 据 库 项, 进 入 还 原 数 据 库 备 份 对 话 框 的 常 规 标 签 页 (3) 在 还 原 为 数 据 库 中 可 以 选 择 需 要 还 原 的 数 据 库 (4) 在 还 原 组 中 有 3 个 单 选 按 钮, 可 以 选 择 还 原 方 法 : 瞯 数 据 库 选 择 该 选 项 时, 显 示 如 图 13 唱 11 所 示 的 对 话 框 在 其 中 可 以 选 择 需 要 显 示 的 指 定 数 据 库 的 备 份 集 以 及 首 先 需 要 还 原 的 数 据 库 备 份 图 13 唱 11 数 据 库 还 原 方 式 对 话 框 瞯 文 件 组 或 文 件 选 择 该 选 项 时, 显 示 如 图 13 唱 12 所 示 的 对 话 框 在 对 话 框 下 面 的 列 表 中 列 出 了 对 指 定 数 据 库 备 份 集 中 备 份 文 件 或 文 件 组 瞯 设 备 选 择 该 选 项 时, 显 示 如 图 13 唱 13 所 示 的 对 话 框, 在 设 备 栏 中 可 以 选 择 数 据 库 所 使 用 的 备 份 设 备 如 果 选 择 还 原 备 份 集 单 选 按 钮, 则 可 以 选 择 还 原 类 型 ( 还 原 数 据 库 完 全 备 份 还 原 增 量 备 份 还 原 日 志 备 份 或 还 原 文 件 及 文 件 组 ) ; 如 果 选 择 读 取 备 份 集 信 息 并 添 加 到 历 史
第 13 章 备 份 与 还 原 325 图 13 唱 12 文 件 组 或 文 件 还 原 方 式 对 话 框 图 13 唱 13 从 设 备 还 原 的 对 话 框 备 份 记 录 单 选 按 钮, 表 示 读 取 备 份 集 信 息 并 添 加 备 份 历 史 记 录 (5) 选 择 选 项 标 签 页, 进 入 如 图 13 唱 14 所 示 对 话 框, 其 中 上 面 三 个 复 选 按 钮 分 别 表 示 : 在 还 原 每 个 备 份 后 均 退 出 磁 带 ; 在 还 原 每 个 备 份 前 进 行 提 示 ; 在 现 有 数 据 库 上 强 制 还 原
326 SQL Server 数 据 库 应 用 技 术 图 13 唱 14 还 原 选 项 设 置 对 话 框 在 列 表 框 中 可 以 指 定 要 还 原 的 数 据 库 文 件 名 称 另 外, 还 可 以 指 定 还 原 完 成 后 的 状 态 13.3.2 使 用 查 询 分 析 器 还 原 数 据 库 在 查 询 分 析 器 中 使 用 RES T ORE 命 令, 可 以 将 数 据 库 备 份 或 者 事 务 处 理 日 志 备 份 由 存 储 介 质 还 原 到 SQ L Server 系 统 中 RES T ORE 与 BACK U P 语 句 相 对 应,RES T ORE 语 句 也 有 三 种 形 式, 分 别 用 于 还 原 数 据 库 完 全 备 份 还 原 文 件 及 文 件 组 备 份 和 还 原 事 务 日 志 备 份 1. 还 原 数 据 库 备 份 (1) 使 用 RES T ORE 语 句 还 原 数 据 库 备 份 的 语 法 形 式 RESTORE DATABASE{database_name @ database_name_var} [FROM < backup_device > [,...n]] [WITH [FILE = file_number] [MEDIANAME = {media_name @ media_name_variable}] [[,]MOVE logical_file_name TO operating_system_system_name ][,...n] [[,]{NORECOVERY RECOVERY STANDBY = undo_file_name}] [[,]REPLACE] [[,]RESTART] ] (2) 参 数 说 明 : 1 RES T ORE DA T ABASE : 指 定 要 还 原 一 个 数 据 库 的 完 全 备 份 2 {database_name @ database_name_var} 还 原 数 据 库 文 件 名 或 变 量 名
第 13 章 备 份 与 还 原 327 3 FRO M < backup_device > 指 定 从 备 份 设 备 中 还 原,backup_device 为 还 原 操 作 时 要 使 用 的 逻 辑 或 物 理 备 份 设 备 可 以 是 以 下 两 种 情 况 : {logical_backup_device_name} { @ logical_backup_device_name_var} 或 者 {DISK TAPE } = physical_ backup_ device_ name @ physical_ backup_ device_ name_var 第 一 种 情 况 表 示 指 定 由 sp_addumpdevice 创 建 的 备 份 设 备 的 逻 辑 名 称, 数 据 库 将 备 份 到 该 设 备 中 第 二 种 情 况 表 示 指 定 备 份 设 备 的 物 理 名 称 和 设 备 类 型 4 FILE = file_number 标 识 要 处 理 的 备 份 集, 用 户 可 以 在 备 份 集 中 指 定 一 个 备 份 还 原 默 认 为 < backup_device > 上 的 第 一 个 备 份 集 5 M EDIA N A M E = {media_name @ media_name_ variable} 说 明 介 质 名 称 如 果 指 定 了 M EDIA N A M E, 则 它 必 须 与 备 份 卷 上 的 介 质 名 称 相 匹 配, 否 则 还 原 操 作 将 终 止 如 果 没 有 指 定 M EDIA N A ME, 将 不 对 介 质 名 称 进 行 匹 配 验 证 6 M OVE logical_file_name T O operating_system_system_name, 说 明 将 备 份 数 据 库 还 原 到 与 备 份 时 不 同 的 另 一 位 置, 即 将 logical_file_name 移 到 operating_system_file_ name 默 认 情 况 下,logical_file_name 将 还 原 到 其 原 始 位 置 如 果 使 用 RES T ORE 语 句 将 数 据 库 复 制 到 相 同 或 不 同 的 服 务 器 上, 则 可 能 需 要 使 用 M OVE 选 项 重 新 定 位 数 据 库 文 件, 以 避 免 与 现 有 文 件 冲 突 可 以 在 不 同 的 M OVE 语 句 中 指 定 数 据 库 内 的 每 个 逻 辑 文 件 7 N ORECOVERY RECOVERY S T A NDBY = undo _ file _ name 中, NORECOVERY 说 明 还 原 操 作 不 回 滚 任 何 未 提 交 的 事 务 ;RECOVERY 说 明 执 行 还 原 操 作 后 回 滚 未 提 交 的 事 务 ;S T A NDBY = undo_file_name 指 定 撤 销 文 件 名, 从 而 可 以 取 消 还 原 效 果 8 REPL ACE 表 明 如 果 已 经 存 在 另 一 个 具 有 相 同 名 称 的 数 据 库, 则 首 先 删 除 现 有 的 数 据 库, 然 后 创 建 指 定 的 数 据 库 及 其 相 关 文 件 如 果 没 有 指 定 REPLACE 选 项, 则 将 进 行 安 全 检 查 以 防 止 意 外 重 写 其 他 数 据 库 9 RES T AR T 指 定 SQ L Server 重 新 启 动 被 中 断 的 还 原 操 作 (3) 简 单 例 子 例 13.5 从 stud_backup 备 份 设 备 中 还 原 数 据 库 student RESTORE DAT ABASE student FROM stud_backup 例 13.6 还 原 数 据 库 的 完 全 备 份 和 差 异 备 份 RESTORE DAT ABASE student FROM stud_backup WIT H NORECOVERY RESTORE DAT ABASE student FROM stud_backup WIT H FILE = 2 例 13.6 中, 第 一 个 RES T ORE 还 原 数 据 库 的 完 全 备 份, 第 二 个 RES T ORE 还 原 数 据 库 的 差 异 备 份
328 SQL Server 数 据 库 应 用 技 术 例 13.7 使 用 RES T AR T 参 数 重 新 启 动 还 原 操 作 RESTORE DAT ABASE student FROM stud_backup RESTORE DAT ABASE student FROM stud_backup WIT H REST ART 例 13.7 中, 如 果 在 执 行 第 一 个 RES T ORE 语 句 进 行 的 还 原 操 作 时, 突 然 因 为 某 些 原 因 而 中 断, 可 以 使 用 第 二 个 带 有 RES T AR T 参 数 的 RES T ORE 语 句, 从 中 断 点 重 新 启 动 还 原 的 操 作 例 13.8 还 原 数 据 库 并 移 动 文 件 RESTORE DAT ABASE student FROM student_bp WIT H NORECOVERY, MOVE student TO c :\ Mydata\student.mdf RESTORE LOG student FROM student_bg_log WIT H RECOVERY, MOVE student TO c :\ Mydata\student.ldf 此 例 还 原 数 据 库 的 完 全 备 份 和 事 务 日 志, 并 将 所 还 原 的 数 据 库 备 份 和 事 务 日 志 移 动 到 c :\M ydata 文 件 夹 中 2. 还 原 数 据 文 件 及 文 件 组 备 份 (1) 使 用 RES T ORE 语 句 还 原 数 据 文 件 及 文 件 组 备 份 的 语 法 为 : RESTORE DATABASE{databas_name @ database_name_var} < file_or_file group > [,...n] [FROM < backup_device > [,...n]] [WITH [MEDIANAME = {mediapassword @ media_name_variable}] [[,]MOVE logical_file_name TO operating_system_file_name ] [,...n] [[,]NORECOVERY] [[,]REPLACE] [[,]RESTART] ] (2) 参 数 说 明 < file_or_filegroup > 指 定 包 括 在 要 还 原 的 数 据 库 中 的 逻 辑 文 件 或 文 件 组 的 名 称, 可 以 指 定 多 个 文 件 或 文 件 组 其 中 : file = {logical_file_name @ logical_file_name_var} 为 命 名 一 个 或 更 多 包 括 在 要 还 原 的 数 据 库 中 的 文 件 ;filegroup = {logical_filegmup_name @ logical_filegroup_name_var}, 命 名 一 个 或 更 多 包 括 在 欲 还 原 的 数 据 库 中 的 文 件 组 (3) 简 单 例 子
第 13 章 备 份 与 还 原 329 例 13.9 还 原 指 定 文 件 及 文 件 组 的 备 份 RESTORE DAT ABASE student FILE = student_data1, FILE = student_data2, FILEGROUP = new_student FROM student_bp WIT H NORECOVERY 例 13.9 还 原 了 一 个 包 含 两 个 文 件 一 个 文 件 组 的 数 据 库 3. 还 原 事 务 日 志 备 份 (1) RES T ORE LOG 语 句 的 语 法 形 式 RESTORE LOG{database_name @ database_name_var} [FROM < backup_device > [,...n]] [WITH [MOVE logical_file_name TO operating_systemfle_name ][,...n] [[,]MEDIANAME = {media_name @ media_name_variable}] [[,]{NORECOVERY RECOVERY STANDBY = undo_file_name}] [[,]RESTART] [[,]STOPAT = {date_time @ date_time_var} [,]STOPATMARK = mark_name [AFTER datetime] [,]STOPBEFOREMARK = mark_name [AFTER datetime] ] ] (2) 参 数 说 明 1 RES T ORE LOG 指 定 还 原 数 据 库 的 事 务 日 志 备 份 SQ L Server 检 查 已 备 份 的 事 务 日 志, 确 保 按 照 正 确 的 序 列 将 事 务 还 原 到 数 据 库 若 要 应 用 多 个 事 务 日 志, 则 要 在 除 最 后 一 个 以 外 的 所 有 还 原 操 作 中 使 用 NORECOVERY 选 项 2 S T OPA T = date_time @ date_time_var, 指 定 只 还 原 数 据 库 在 指 定 的 日 期 和 时 间 之 间 的 内 容 3 S T OPA T W ARK = mark_name [AF T ER datetime], 表 示 还 原 到 指 定 的 标 记, 包 括 包 含 该 标 记 的 事 务 如 果 省 略 AF TER datetime, 还 原 操 作 将 在 含 有 指 定 名 称 的 第 一 个 标 记 处 停 止 如 果 指 定 AF T ER datetime, 还 原 操 作 将 在 含 有 在 datatime 时 或 datatime 之 后 的 指 定 名 称 的 第 一 个 标 记 处 停 止 4 S T OPBEFORE M ARK = mark_name [AF T ER datetime], 表 示 还 原 到 指 定 的 标 记, 但 不 包 括 包 含 该 标 记 的 事 务 (3) 简 单 例 子 例 13.10 将 事 务 日 志 还 原 到 标 记 处 BEGIN TRANSACTION stud_update WIT H MARK Updace grade values GO USE student GO UPDATE stud_grade
330 SQL Server 数 据 库 应 用 技 术 SET grade = ROUND(SQRT(grade) 倡 10,0) WHERE course_id LIKE % 06 GO COM MIT TRANSACTION stud_update GO USE master GO RESTORE DAT ABASE student FROM stud_backup WIT H FILE = 3, NORECOVERY GO RESTORE LOG student FROM stud_backup WIT H FILE = 4, STOPAT MARK = stud_update 例 13.10 将 事 务 日 志 还 原 到 名 为 stud_update 的 标 记 处 实 训 1. 实 训 目 的 (1) 了 解 备 份 设 备 的 作 用 (2) 学 会 数 据 库 还 原 与 备 份 的 操 作 方 法 2. 实 训 的 知 识 准 备 充 分 理 解 各 种 不 同 数 据 库 备 份 方 法 ( 完 全 备 份 增 量 备 份 事 务 日 志 备 份 文 件 和 文 件 组 备 份 的 差 异 ) 的 异 同 点, 根 据 不 同 实 际 情 况 制 定 相 应 的 备 份 与 还 原 策 略 了 解 备 份 设 备 的 创 建 方 法, 以 及 使 用 企 业 管 理 器 或 者 查 询 分 析 器 来 备 份 与 还 原 数 据 库, 通 过 实 际 操 作 学 会 数 据 库 备 份 与 还 原 的 管 理 技 巧 3. 实 训 内 容 和 步 骤 (1) 创 建 备 份 设 备 USE master EXEC sp_addumpdevice disk, stud_bp, c :\Program Files\ Microsoft SQL Server\ MSSQL\BACKUP\stud_bp.bat EXEC sp_addumpdevice disk, stud_bp_log, c :\Program Files\ Microsoft SQL Server\ MSSQL\BACKUP\stud_bp_log.bat (2) 完 全 备 份 student 数 据 库 USE master BACKUP DAT ABASE student TO stud_bp BACKUP LOG student TO stud_bp_log
第 13 章 备 份 与 还 原 331 自 行 练 习 : 分 别 使 用 企 业 管 理 器 备 份 向 导 查 询 分 析 器 为 数 据 库 student 做 一 次 完 全 数 据 库 备 份 (3) 数 据 库 student 建 立 完 全 备 份 后, 在 数 据 库 student 中 新 建 两 个 数 据 表 (staffroom_info,classroom_info), 然 后 利 用 企 业 管 理 器 先 后 进 行 差 异 备 份 ; 接 着 向 数 据 表 (staffroom_info,classroom_info) 中 输 入 数 据, 再 利 用 企 业 管 理 器 先 后 进 行 两 次 日 志 备 份 (4) 查 看 有 关 备 份 的 信 息 在 查 询 分 析 器 中 执 行 下 列 命 令 : RESTORE headeronly FROM stud_bp 运 行 结 果 将 显 示 指 定 设 备 文 件 的 名 称 备 份 类 型 (1 完 全 备 份 ;2 日 志 备 份 ;5 差 异 备 份 ) 以 及 备 份 开 始 和 停 止 的 日 期 / 时 间 大 小 等 信 息 还 可 以 查 看 stud_bp 中 原 数 据 库 和 事 务 日 志 的 文 件 信 息, 如 下 所 示 RESTORE filelistonly FROM stud_bp (5) 在 前 面 的 实 训 中, 已 经 为 数 据 库 student 建 立 一 次 完 全 备 份 两 次 增 量 备 份 和 两 次 事 务 日 志 备 份, 现 在 要 求 删 除 student 数 据 库, 然 后 再 分 别 将 其 还 原 例 如 : 在 查 询 分 析 器 中 执 行 下 列 命 令, 将 从 备 份 设 备 stud_bp 中 还 原 数 据 库 student 的 完 全 备 份 RESTORE DAT ABASE student FROM stud_bp RESTORE LOG student FROM stud_bp_log 自 行 练 习 : 使 用 企 业 管 理 器 或 者 查 询 分 析 器 还 原 数 据 库 student 的 完 全 数 据 库 备 份 (6) 在 企 业 管 理 器 或 者 查 询 分 析 器 中, 还 原 数 据 库 第 一 次 和 第 二 次 的 差 异 备 份, 以 及 第 一 次 和 第 二 次 的 日 志 备 份 例 如 : 在 查 询 分 析 器 中 执 行 下 列 命 令, 从 备 份 设 备 stud_bp_ log 中 还 原 数 据 库 student 的 第 一 次 和 第 二 次 的 日 志 备 份 RESTORE LOG student FROM stud_bp_log WIT H FILE = 1, NORECOVERY GO RESTORE LOG student FROM stud_bp_log WIT H FILE = 2, RECOVERY GO 自 行 练 习 : 从 备 份 设 备 stud_bp 中 还 原 数 据 库 student 的 第 一 次 和 第 二 次 的 差 异 备 份 (7) 采 用 系 统 存 储 过 程 分 离 和 附 加 数 据 库 EXEC sp_detach_db @ dbname = student 唱 从 服 务 器 分 离 student 数 据 库 EXEC sp_attach_db @ dbname = N student, @ filename1 = N c :\Program Files\ Microsoft SQL Server\ MSSQL\Data\student_Data.mdf, @ filename2 = N c :\Program Files\ Microsoft SQL Server\ MSSQL\Data\student_log.ldf 这 种 方 法 应 该 说 是 有 很 高 的 成 功 率 的, 不 过 student 数 据 库 附 加 到 服 务 器 后, 数 据 库 成 为 只 读 的 如 果 只 有 mdf 没 有 ldf 文 件 的 话, 建 议 使 用 系 统 存 储 过 程 sp_attach_single_ file, 将 只 有 一 个 数 据 文 件 的 数 据 库 附 加 到 当 前 服 务 器
332 SQL Server 数 据 库 应 用 技 术 EXEC sp_detach_db @ dbname = student EXEC sp_attach_single_file_db @ dbname = student, @ physname = c :\Program Files\ Microsoft SQL Server\ MSSQL\Data\student_Data.mdf 这 个 方 法 本 来 是 用 来 对 sp_deatach 的 操 作 的 反 操 作, 不 过 直 接 使 用 也 还 是 可 以 成 功 的 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) 什 么 是 备 份 设 备? 如 何 创 建 备 份 设 备? (2) 事 务 日 志 文 件 的 作 用 是 什 么? 请 使 用 T ransact 唱 SQ L 语 句 写 出 事 务 日 志 备 份 的 命 令 形 式 (3) SQ L Server 数 据 库 备 份 有 几 种 方 法? 试 比 较 各 种 不 同 数 据 库 备 份 方 法 的 异 同 点? (4) 什 么 是 事 务 日 志 备 份? (5) 什 么 是 增 量 备 份? (6) 在 哪 种 情 况 下, 只 做 完 全 数 据 库 备 份 是 一 个 好 主 意? (7) 还 原 数 据 库 的 意 思 是 什 么? (8) 当 还 原 数 据 库 的 时 候, 用 户 可 以 使 用 这 些 正 在 还 原 的 数 据 库 吗? (9) 当 你 还 原 事 务 日 志 时, 最 主 要 的 限 制 是 什 么? (10) SQ L Server 中 数 据 库 3 种 还 原 方 法 有 什 么 区 别? 2. 按 照 题 目 要 求 选 择 最 合 适 的 内 容 填 空 (1) 需 要 在 磁 盘 上 创 建 一 个 备 份 设 备, 其 逻 辑 名 称 设 为 teacher_bp, 物 理 名 称 设 为 c :\sql server\backup\teacher_bp.bat, 请 写 出 其 命 令 (2) 接 上 题, 如 果 欲 删 除 上 面 创 建 的 备 份 设 备, 请 写 出 其 命 令 (3) 在 SQ L Server, 有 专 门 的 管 理 员 负 责 数 据 库 的 备 份 工 作 能 够 备 份 数 据 的 角 色 有 (4) BACK U P 命 令 中 的 选 项 NO_ T RU NCA T E 的 作 用 是 (5) 当 数 据 库 被 频 繁 修 改, 同 时 用 户 期 望 数 据 库 所 需 的 还 原 时 间 最 少 时, 最 好 使 用, 而 不 使 用 (6) 如 果 欲 将 数 据 库 还 原 到 另 外 的 物 理 位 置 ( 改 变 恢 复 路 径 ), 应 该 在 使 用 RES T ORE DA T ABASE 命 令 时 添 加 选 项, 才 能 使 还 原 的 时 候 移 动 数 据 库 (7) 将 一 个 数 据 库 挂 接 文 件 到 SQ L Server 上 面 系 统 存 储 过 程 为 (8) 在 服 务 器 之 间 移 动 数 据 库 的 两 个 系 统 存 储 过 程 是
第 14 章 SQL Server 编 程 接 口 桌 面 ( 计 算 机 与 用 户 交 互 的 图 形 化 界 面 ) 程 序 设 计 的 基 本 方 法, 通 常 使 用 程 序 设 计 语 言 作 为 前 台, 与 后 台 的 数 据 库 进 行 链 接, 通 过 桌 面 用 户 调 用 包 括 数 据 库 在 内 的 各 种 资 源, 完 成 管 理 信 息 系 统 的 应 用 本 章 将 讨 论 通 过 ODBC 或 ADO 访 问 SQ L Server 数 据 库, 以 及 通 过 Visual Basic PowerBuilder C++ Builder 6 程 序 设 计 语 言 对 数 据 库 中 的 数 据 对 象 进 行 操 作 处 理 14.1 通 过 ODBC 访 问 SQL Server 数 据 库 14.1.1 ODBC 的 概 述 ODBC(Open Database Connectivity) 是 一 种 强 大 而 灵 活 的 数 据 库 访 问 标 准, 通 过 一 组 标 准 的 函 数 调 用 (API) 来 实 现 数 据 库 访 问 的 ODBC 虽 然 可 以 使 用 一 个 ODBC 应 用 程 序 来 访 问 本 地 PC 数 据 库 上 的 数 据, 但 是 它 主 要 用 于 访 问 在 多 操 作 系 统 平 台 上 的 数 据 库 ODBC API 是 独 立 于 数 据 库 的, 表 面 上 它 是 由 一 组 函 数 调 用 组 成 的, 但 是 ODBC 的 核 心 是 SQ L ODBC 函 数 的 主 要 功 能 便 是 将 SQ L 语 句 发 送 到 目 标 数 据 库 中, 然 后 处 理 这 些 SQ L 语 句 产 生 的 结 果 1.ODBC 组 件 ODBC 使 用 的 分 层 体 系 结 构 包 括 : ODBC 应 用 程 序 驱 动 程 序 管 理 器 ODBC 驱 动 程 序 和 数 据 源 为 了 有 助 于 理 解 应 用 程 序 如 何 关 联 ODBC 体 系 结 构, 下 面 对 它 们 分 别 加 以 介 绍 : (1) ODBC 应 用 程 序 ODBC 应 用 程 序 是 一 种 使 用 Visual Basic Visual C++ 或 者 其 他 PC 开 发 平 台 编 写 的, 类 似 于 Word Excel 或 者 Visual Basic 等 的 应 用 程 序 该 应 用 程 序 与 ODBC 驱 动 程 序 管 理 器 (ODBC32.DLL) 进 行 静 态 或 动 态 链 接, 且 调 用 由 ODBC 驱 动 程 序 管 理 器 提 供 的 ODBC API 函 数 (2) ODBC 驱 动 程 序 管 理 器 因 为 ODBC 应 用 程 序 不 能 够 直 接 调 用 ODBC 驱 动 程 序, 只 可 以 调 用 包 含 在 ODBC 驱 动 程 序 管 理 器 中 的 函 数, 而 ODBC 驱 动 程 序 管 理 器 可 以 调 用 相 应 的 ODBC 驱 动 程 序 这
334 SQL Server 数 据 库 应 用 技 术 样, 就 保 证 了 ODBC 函 数 无 论 是 连 接 到 SQ L Server 数 据 库, 还 是 其 他 某 个 数 据 库 平 台, 都 总 是 按 照 同 一 种 方 式 进 行 调 用 驱 动 程 序 管 理 器 负 责 把 相 应 的 ODBC 驱 动 程 序 加 载 到 内 存 中, 并 将 随 后 的 请 求 传 送 给 正 确 的 ODBC 驱 动 程 序 在 该 加 载 过 程 中,ODBC 驱 动 程 序 管 理 器 会 建 立 一 个 指 向 ODBC 驱 动 程 序 中 函 数 的 指 针 表, 并 且 使 用 一 个 称 为 连 接 句 柄 的 标 识 符 来 确 认 加 载 的 各 个 函 数 指 针 (3) ODBC 驱 动 程 序 ODBC 驱 动 程 序 负 责 把 SQ L 请 求 发 送 到 关 系 数 据 库 管 理 系 统 (RDBM S) 中, 且 把 发 送 结 果 返 回 给 ODBC 驱 动 程 序 管 理 器, 然 后, 由 驱 动 程 序 管 理 器 把 这 些 请 求 传 送 给 客 户 端 应 用 程 序 每 一 种 兼 容 ODBC 的 数 据 库 都 有 其 各 自 的 ODBC 驱 动 程 序, 且 该 驱 动 程 序 只 能 与 该 数 据 库 本 身 进 行 通 信, 不 能 用 它 访 问 其 他 的 数 据 库 譬 如,SQ L Server ODBC 驱 动 程 序 只 能 访 问 SQ L Server 数 据 库, 不 能 用 来 访 问 Oracle 数 据 库 ; 而 Oracle ODBC 驱 动 程 序 则 只 能 访 问 Oracle 数 据 库, 却 不 能 用 来 访 问 SQ L Server 数 据 库 (4) 数 据 源 顾 名 思 义, 数 据 源 就 是 要 访 问 的 数 据 库 如 果 要 访 问 一 个 数 据 库, 必 须 首 先 定 义 一 个 数 据 源 一 般 地, 可 使 用 ODBC 数 据 源 管 理 器 对 话 框 来 创 建 数 据 源, 然 后, 使 用 用 户 创 建 的 名 称 关 联 一 个 目 的 关 系 型 数 据 库 和 ODBC 驱 动 程 序, 以 便 用 户 使 用 有 意 义 的 数 据 源 名 称 来 访 问 数 据 库 当 ODBC 应 用 程 序 第 一 次 连 接 到 一 个 目 标 数 据 库 时, 它 会 把 数 据 源 名 称 传 送 到 ODBC 驱 动 程 序 管 理 器 中, 然 后, 驱 动 程 序 管 理 器 使 用 数 据 源 来 确 定 要 加 载 哪 一 个 ODBC 驱 动 程 序 通 过 ODBC, 用 户 可 以 选 择 希 望 创 建 的 数 据 源 类 型 : 用 户 DSN 系 统 DSN 或 文 件 DSN 系 统 DSN 允 许 所 有 的 用 户 登 录 到 特 定 的 服 务 器 上 去 访 问 数 据 库, 可 以 用 于 系 统 中 的 全 部 用 户, 如 果 要 定 义 的 数 据 源 是 要 面 向 所 有 用 户 的, 则 应 选 择 系 统 DSN 选 项 而 用 户 DSN 使 用 适 当 的 安 全 身 份 验 证 来 限 制 数 据 库 到 特 定 用 户 的 连 接, 对 于 每 个 用 户 来 说, 它 都 是 惟 一 的 文 件 DSN 用 于 从 文 本 文 件 中 获 取 数 据, 提 供 了 对 多 用 户 的 访 问 2. 配 置 ODBC 数 据 源 在 使 用 ODBC 之 前, 必 须 安 装 一 个 ODBC 驱 动 程 序, 然 后 再 配 置 一 个 数 据 源 数 据 库 驱 动 程 序 使 用 Data Source Name (DSN) 来 定 位 特 定 的 ODBC 兼 容 数 据 库, 将 信 息 从 应 用 程 序 传 递 给 数 据 库 典 型 情 况 下,DSN 通 常 包 含 数 据 库 配 置 用 户 安 全 性 和 定 位 信 息, 且 可 以 获 取 Window s N T 注 册 表 项 中 或 文 本 文 件 的 表 格 (1) ODBC 数 据 源 名 数 据 源 名 是 为 所 要 访 问 数 据 库 指 定 的 名 字 通 常 情 况 下, 如 果 要 连 接 到 一 个 数 据 库 上, 则 必 须 发 送 一 组 参 数 来 获 得 该 连 接 在 每 次 要 连 接 一 个 数 据 库 时, 反 复 地 发 送 这 些 信 息 很 麻 烦, 因 为 这 些 信 息 是 永 远 不 改 变 的 因 此 DSN 的 创 建 最 适 合 解 决 这 个 问 题 通 过 使 用 DSN, 可 以 把 所 有 的 信 息 都 存 放 在 一 个 地 方, 通 常 可 以 给 该 信 息 起 一 个 名 字 (Data Source Name, 数 据 源 名 ) 然 后, 只 要 想 连 接 数 据 库, 不 用 再 去 一 遍 一 遍 地 说 明 它 们, 只 需 使 用 DSN 就 可 以 了, 它 会 自 动 获 得 所 有 的 信 息 下 面 分 别 介 绍 如 何 配 置 各 种 不 同 的 数
第 14 章 SQL Server 编 程 接 口 335 据 源 在 Windo ws 操 作 平 台 下, 最 常 见 的 数 据 库 访 问 方 法 是 通 过 ODBC( 开 放 数 据 库 连 接 ), 它 是 访 问 数 据 库 的 一 种 通 用 方 法, 可 以 在 ODBC 数 据 源 管 理 器 中 建 立 与 各 种 数 据 库 连 接 的 数 据 源, 以 后 各 种 编 程 语 言 就 可 以 通 过 这 个 数 据 源 访 问 数 据 库 (2) SQ L Server 数 据 库 系 统 DSN 的 配 置 方 法 打 开 ODBC 数 据 源 管 理 器 的 方 法 如 下 : 选 择 我 的 电 脑 控 制 面 板 管 理 工 具 数 据 源 (ODBC) 命 令, 出 现 ODBC 数 据 源 管 理 器, 然 后 就 可 以 添 加 删 除 配 置 各 种 连 接 后 台 数 据 库 的 ODBC 数 据 源 了 1 选 择 系 统 DSN 标 签 页, 单 击 添 加 按 钮, 如 图 14 唱 1 所 示 图 14 唱 1 创 建 新 数 据 源 2 在 随 后 弹 出 的 如 图 14 唱 2 所 示 的 创 建 新 数 据 源 界 面 中, 在 选 择 您 想 为 其 安 装 数 据 源 的 驱 动 程 序 (S) 的 下 拉 列 表 框 里, 选 择 SQ L Server, 这 是 微 软 公 司 为 SQ L Server 数 据 库 提 供 的 标 准 ODBC 接 口 驱 动 程 序, 单 击 完 成 按 钮, 进 入 下 一 步 图 14 唱 2 选 择 数 据 源 的 驱 动 程 序 SQL Server
336 SQL Server 数 据 库 应 用 技 术 3 出 现 如 图 14 唱 3 所 示 的 创 建 到 SQ L Server 的 新 数 据 源 设 置 界 面, 在 数 据 源 名 称 文 本 框 里 输 入 sqlserverlink, 在 数 据 源 描 述 文 本 框 里 输 入 SQ L Server 连 接, 在 您 想 连 接 哪 一 个 SQ L Server 服 务 器? 文 本 框 里 输 入 127.0.0.1 这 里 127.0.0.1 的 服 务 器 名 是 指 本 地 服 务 器, 当 然 也 可 以 是 远 程 SQ L Server 服 务 器 名 或 IP 地 址 单 击 下 一 步 按 钮, 弹 出 一 个 如 图 14 唱 4 的 对 话 框 图 14 唱 3 数 据 源 设 置 : 名 称 描 述 服 务 器 图 14 唱 4 数 据 源 设 置 : 选 择 验 证 登 录 ID 的 方 式 这 时,SQ L Server 将 确 定 应 该 如 何 验 证 登 录 ID 的 真 伪 选 择 使 用 用 户 输 入 登 录 ID 和 密 码 的 SQ L Server 验 证, 选 择 验 证 登 录 ID 的 方 式 如 图 14 唱 4 所 示, 可 以 根 据 需 要 选 择 不 同 的 选 项, 键 入 运 行 SQ L 服 务 程 序 的 服 务 器 的 名 称 ( 如 果 在 上 一 步 时 选 择 的 是 通 过 IP 地 址 连 接 服 务 器, 请 选 择 客 户 端 配 置 选 项, 调 出 配 置 对 话 框 ) 登 录 ID 和 密 码 单 击 下 一 步 按 钮, 弹 出 一 个 如 图 14 唱 5 的 对 话 框 在 该 对 话 框 中, 可 根 据 需 要 更 改 默 认 数 据 库 的 名 称, 或 者 添 加 附 加 数 据 库 文 件 名 等 例 如, 在 改 变 默 认 的 数 据 库 为 的
第 14 章 SQL Server 编 程 接 口 337 复 选 框 中 打 钩, 并 选 择 student 数 据 库, 然 后 单 击 下 一 步 按 钮, 打 开 如 图 14 唱 6 所 示 的 对 话 框 图 14 唱 5 数 据 源 设 置 : 默 认 数 据 库 附 加 数 据 库 图 14 唱 6 数 据 源 设 置 : 语 言 加 密 翻 译 等 单 击 完 成 按 钮, 打 开 ODBC Microsoft SQ L Server 安 装 对 话 框, 如 图 14 唱 7 所 示 该 对 话 框 中 将 会 显 示 新 创 建 的 ODBC 数 据 源 的 配 置 情 况 单 击 确 定 按 钮, 完 成 配 置 SQ L Server 数 据 源 的 操 作 单 击 测 试 数 据 源 按 钮 如 果 DSN 创 建 成 功, 则 测 试 结 果 对 话 框 将 会 显 示 测 试 成 功 的 消 息, 如 图 14 唱 8 所 示 否 则, 将 会 显 示 测 试 失 败 信 息 以 及 失 败 的 原 因, 可 返 回 前 面 的 步 骤 进 行 修 改 4 在 图 14 唱 9 的 系 统 DSN 标 签 页 中 出 现 了 刚 才 已 建 立 好 的 数 据 源 (sqlserverlink), 单 击 确 定 按 钮, 即 完 成 DSN 配 置 的 所 有 步 骤 注 意 : 在 配 置 ODBC 数 据 源 以 前, 请 确 定 数 据 库 已 建 立 完 成, 如 果 是 配 置 SQ L Server 数 据 源 的 话 还 得 确 定 SQ L Server 在 运 行 状 态
338 SQL Server 数 据 库 应 用 技 术 图 14 唱 7 ODBC Microsoft SQL Server 安 装 图 14 唱 8 SQL Server ODBC 数 据 源 测 试 14.1.2 通 过 Excel 访 问 SQL Server 数 据 库 日 常 的 工 作 中, 可 能 遇 到 要 将 Excel 文 件 中 的 数 据 和 SQ L Server 数 据 库 中 的 数 据 互 倒 的 问 题, 实 现 对 实 时 数 据 的 操 作 如 将 SQ L Server 信 息 系 统 中 的 数 据 倒 出 来, 并 在 此 基 础 上 利 用 Excel 对 其 进 行 分 析 整 理 下 面 就 将 介 绍 利 用 ODBC 将 SQ L Server 数 据 倒 入 到 Excel 文 件 中 的 有 关 方 法 利 用 ODBC 实 现 动 态 数 据 交 换 的 前 提 条 件 很 简 单, 只 需 先 在 本 机 安 装 微 软 Office 中 的 Excel, 然 后 根 据 需 要 运 行 编 写 的 SQ L 文 件 下 面 就 一 步 一 步 来 说 明 : (1) 首 先 配 置 ODBC 数 据 源 在 控 制 面 板 中, 选 ODBC 数 据 源, 添 加 选 安 装 ODBC FOR SQ L Server 在 给 定 数 据 源 名 称 和 描 述 时, 用 户 可 自 定 义, 用 户 名 称 和 服 务 器 则 需 根 据 在 SQ L Server 数 据 库 中 设 置 好 的 数 据 库 名 来 设 置 例 如 : 数 据 源 名 称 为
第 14 章 SQL Server 编 程 接 口 339 图 14 唱 9 建 立 好 的 数 据 源 sqlserverlink, 描 述 为 SQ L Server 连 接, 用 户 名 称 为 sa, 密 码 为 空 (2) 打 开 Excel, 在 数 据 菜 单 下, 选 获 取 外 部 数 据, 单 击 新 建 数 据 库 查 询 出 现 选 择 数 据 源 对 话 框 如 图 14 唱 10 所 示 图 14 唱 10 Excel 的 数 据 菜 单 (3) 在 如 图 14 唱 11 所 示 的 选 择 数 据 源 对 话 框 中, 选 择 前 面 已 设 置 好 的 数 据 源
340 SQL Server 数 据 库 应 用 技 术 sqlserverlink 然 后 单 击 确 定 按 钮 进 入 SQ L Server 登 录 对 话 框 图 14 唱 11 选 择 数 据 源 对 话 框 (4) 在 如 图 14 唱 12 所 示 的 SQ L Server 登 录 对 话 框 中, 输 入 登 录 ID, 密 码, 然 后 单 击 确 定 按 钮 屏 蔽 提 示 正 在 与 数 据 源 进 行 连 接 图 14 唱 12 SQL Server 登 录 对 话 框 (5) 在 如 图 14 唱 13 所 示 查 询 向 导 唱 选 择 列 对 话 框 中, 需 要 选 择 查 询 结 果 所 需 包 含 的 表 和 数 据 列, 当 选 定 了 某 个 表 中 的 数 据 列 之 后, 查 询 结 果 中 的 列 的 文 本 框 中 将 出 现 所 选 中 的 数 据 列, 同 时, 还 可 以 单 击 预 览 按 钮, 将 对 应 数 据 列 的 数 值 出 现 在 预 览 选 定 列 中 的 数 据 文 本 框 中 图 14 唱 13 查 询 向 导 唱 选 择 列 在 查 询 向 导 唱 选 择 列 对 话 框 中, 拖 动 滚 动 选 择 查 询 结 果 所 需 包 含 的 表 为 teacher_ info, 选 择 查 询 结 果 所 需 包 含 的 数 据 列 为 teacher _ id name gender age tech _ title telephone salary course_id, 选 择 一 列 名 则 单 击 > 按 钮 一 次 单 击 下 一 步 按 钮, 进 入
第 14 章 SQL Server 编 程 接 口 341 查 询 向 导 _ 筛 选 数 据 对 话 框 (6) 在 如 图 14 唱 14 所 示 查 询 向 导 唱 筛 选 数 据 对 话 框 中, 可 以 筛 选 数 据 以 指 定 查 询 结 果 所 包 含 的 行, 如 果 不 需 要 筛 选 数 据, 就 直 接 单 击 下 一 步 按 钮, 进 入 查 询 向 导 唱 排 序 顺 序 对 话 框 图 14 唱 14 查 询 向 导 唱 筛 选 数 据 (7) 在 如 图 14 唱 15 所 示 查 询 向 导 唱 排 序 顺 序 对 话 框 中, 可 以 指 定 数 据 的 排 序 方 式, 即 对 主 要 关 键 字 次 要 关 键 字 等 进 行 升 序 或 降 序 排 列 如 果 没 有 对 数 据 排 序 的 需 求, 就 直 接 单 击 下 一 步 按 钮, 进 入 查 询 向 导 唱 完 成 对 话 框 图 14 唱 15 查 询 向 导 唱 排 序 顺 序 (8) 在 如 图 14 唱 16 所 示 查 询 向 导 唱 完 成 对 话 框 中, 可 以 确 定 是 将 数 据 返 回 Excel, 还 是 在 Microsoft Query 中 查 看 数 据 或 编 辑 查 询, 或 者 从 该 查 询 创 建 OLAP 多 维 数 据 集, 也 可 以 将 其 查 询 保 存 起 来 当 选 择 将 数 据 返 回 Excel 时, 单 击 完 成 按 钮 后, 即 可 在 Excel 工 作 表 中 确 定 数 据 的 放 置 位 置 (9) 如 图 14 唱 17 所 示 的 导 入 数 据 对 话 框 中 主 要 是 用 于 确 定 数 据 的 放 置 位 置 单 击 编 辑 查 询 按 钮, 即 可 返 回 查 询 向 导 唱 选 择 列 单 击 确 定 按 钮, 即 可 从 SQ L Server 中 将 teacher_info 中 的 数 据 导 入 到 Excel 表 (10) 执 行 该 段 查 询, 即 可 在 Excel 表 中 见 到 满 足 条 件 的 记 录 已 全 部 倒 出 来, 第 一 行 为 记 录 中 的 列 名, 如 图 14 唱 18 所 示 然 后 可 利 用 Excel 强 大 的 编 辑 功 能, 对 这 些 数 据 进 行
342 SQL Server 数 据 库 应 用 技 术 图 14 唱 16 查 询 向 导 唱 完 成 图 14 唱 17 导 入 数 据 图 14 唱 18 Excel 的 工 作 表
第 14 章 SQL Server 编 程 接 口 343 分 析 修 改, 相 当 方 便 最 后 将 文 件 保 存 起 来 就 可 以 了 (11) 如 果 在 查 询 向 导 唱 完 成 对 话 框 中 选 择 在 Microsoft Query 中 查 看 数 据 或 编 辑 查 询, 则 出 现 如 图 14 唱 19 所 示 Microsoft Query 窗 口 此 时, 完 全 可 能 根 据 实 际 需 要 选 择 需 倒 出 的 数 据, 写 入 SQ L 语 句 例 如 : SELEC T teacher_id, name, age, tech_ title, telephone, salary FRO M teacher_info 要 重 新 执 行 该 文 件, 只 需 在 Microsoft Query 窗 口 中 选 择 打 开 该 查 询 并 执 行, 即 可 得 到 实 时 的 数 据 图 14 唱 19 Microsoft Query 窗 口 14.1.3 通 过 Visual Basic 访 问 SQL Server 数 据 库 Visual Basic 6.0 + SQ L Server 2000 数 据 库 应 用 是 基 于 C/S 模 式 的 应 用, 其 典 型 的 应 用 开 发 环 境 如 下 : (1) 在 数 据 库 服 务 器 上 安 装 SQ L Server 数 据 库 (2) 在 应 用 客 户 机 上 需 要 安 装 连 接 端 和 利 用 Visual Basic 开 发 后 的 可 执 行 程 序 (3) 在 开 发 机 上 需 要 安 装 Visual Basic 和 SQ L Server 管 理 端 Visual Basic 在 可 视 化 设 计 领 域 有 着 非 常 广 泛 的 应 用, 它 界 面 友 好, 功 能 强 大, 并 且 还 提 供 了 数 据 库 管 理 器 数 据 控 件 远 程 数 据 控 件 以 及 数 据 访 问 对 象 等 众 多 功 能 强 大 的 工 具 有 了 这 些 工 具 的 帮 助, 开 发 一 个 数 据 库 应 用 程 序 将 变 得 更 加 轻 松 容 易 下 面 介 绍 Visual Basic 6.0 如 何 通 过 ODBC 连 接 到 SQ L Server 数 据 库 上 1. 利 用 Visual Basic 6.0 可 视 化 数 据 管 理 器 访 问 数 据 库 (1) 在 Visual Basic 6.0 的 菜 单 栏 选 择 外 挂 程 序 可 视 化 数 据 管 理 器 菜 单 命 令, 如 图 14 唱 20 所 示 (2) 出 现 如 图 14 唱 21 所 示 的 VisData 界 面, 在 菜 单 栏 选 择 文 件 打 开 数 据 库
344 SQL Server 数 据 库 应 用 技 术 图 14 唱 20 选 择 可 视 化 数 据 管 理 器 图 14 唱 21 打 开 ODBC 数 据 源 犗 犇 犅 犆 菜 单 命 令 (3) 出 现 如 图 14 唱 22 所 示 的 ODBC 登 录 界 面, 在 DSN(D) : 文 本 框 里 选 择 已 建 立 好 的 数 据 源 sqlserverlink, 在 UID(U) : 文 本 框 里 输 入 sa, 在 密 码 (P) : 文 本 框 里 默 认 为
第 14 章 SQL Server 编 程 接 口 345 空, 在 数 据 库 文 本 框 里 输 入 student, 最 后 单 击 确 定 按 钮, 即 完 成 了 Visual Basic 6.0 与 SQ L Server 数 据 库 的 连 接 图 14 唱 22 登 录 ODBC 数 据 源 (4) 接 着, 出 现 如 图 14 唱 23 所 示 的 VisData :sqlserverlink.student 界 面, 在 数 据 库 窗 口 选 择 某 一 个 表, 则 弹 出 对 应 表 的 编 辑 窗 口 图 14 唱 23 在 VisData 界 面 中 编 辑 SQL Server 数 据 表 2. 利 用 Visual Basic 控 件 开 发 数 据 库 应 用 程 序 下 面 通 过 对 教 师 信 息 表 (teacher_info) 的 记 录 进 行 定 位 操 作 的 实 例 来 编 写 Visual Basic 程 序 (1) 进 入 Visual Basic 6.0, 在 菜 单 栏 选 择 文 件 新 建 工 程 菜 单 命 令, 出 现 如 图 14 唱 24 所 示 界 面, 选 中 新 建 工 程 的 类 型 为 标 准 EXE, 单 击 打 开 按 钮 (2) 出 现 如 图 14 唱 25 所 示 界 面 在 表 单 的 属 性 窗 口 里, 设 置 名 称 为 SQ L
346 SQL Server 数 据 库 应 用 技 术 ServerSample, Caption 属 性 为 学 生 基 本 信 息, 存 盘 保 存 表 单 文 件 和 工 程 文 件 图 14 唱 24 选 择 新 建 工 程 图 14 唱 25 设 置 表 单 属 性 (3) 在 菜 单 栏 里 选 择 工 程 部 件 菜 单 命 令, 将 需 要 的 数 据 库 控 件 添 加 进 来, 如 图 14 唱 26 所 示 (4) 出 现 如 图 14 唱 27 所 示 的 部 件 对 话 框, 选 中 控 件 标 签 页, 在 下 拉 列 表 框 里 单 击 选 中 Microsoft ADO Data Control 6.0(OLEDB), 单 击 确 定 按 钮
第 14 章 SQL Server 编 程 接 口 347 图 14 唱 26 选 择 添 加 部 件 图 14 唱 27 选 择 添 加 控 件 (5) 单 击 选 中 General 工 具 箱 里 出 现 的 ADODC 控 件, 在 表 单 任 意 位 置 按 住 鼠 标 左 键 拖 动 出 一 个 区 域, 出 现 ADODC 控 件, 在 该 控 件 上 右 击, 在 出 现 的 快 捷 菜 单 里 选 择 ADODC 属 性 菜 单 命 令, 如 图 14 唱 28 所 示 (6) 出 现 如 图 14 唱 29 所 示 的 属 性 页 对 话 框, 在 通 用 标 签 页 里 有 3 种 指 定 数 据 库 的 方 式 选 择 使 用 ODBC 数 据 资 源 名 称 单 选 按 钮, 在 下 拉 列 表 框 里 选 择 建 立 好 名 为 sqlserverlink 的 数 据 源
348 SQL Server 数 据 库 应 用 技 术 图 14 唱 28 选 择 修 改 ADODC 控 件 的 属 性 图 14 唱 29 ADODC 属 性 页 的 通 用 标 签 页 (7) 如 图 14 唱 30 所 示 为 ADODC 控 件 属 性 页 的 身 份 验 证 标 签 页, 在 用 户 名 称 文 本 框 里 输 入 sa, 在 密 码 文 本 框 中 默 认 为 空 (8) 如 图 14 唱 31 所 示 为 ADODC 控 件 属 性 页 的 记 录 源 标 签 页, 在 命 令 类 型 下 拉 列 表 框 里 有 4 种 选 项, 选 中 2 唱 adcmdtable, 与 数 据 库 连 接, 连 接 成 功 后 在 表 或 存 储 过 程 名 称 下 拉 列 表 框 里 出 现 该 用 户 下 的 数 据 表, 选 中 stud_info, 设 置 完 毕 后 单 击 确 定 按 钮 (9) 在 Visible 的 下 拉 列 表 框 里 选 择 False, 这 样 在 设 计 时 该 控 件 是 可 见 的, 但 在 运 行 时 是 不 可 见 的
第 14 章 SQL Server 编 程 接 口 349 图 14 唱 30 ADODC 属 性 页 的 身 份 验 证 标 签 页 图 14 唱 31 ADODC 属 性 页 的 记 录 源 标 签 页 (10) 单 击 选 中 General 工 具 箱 中 的 TextBox 控 件, 在 表 单 任 意 位 置 按 住 鼠 标 左 键 拖 动 出 一 个 区 域, 出 现 TextBox 控 件, 在 该 控 件 上 单 击, 在 出 现 的 快 捷 菜 单 里 选 择 属 性 窗 口 菜 单 命 令, 弹 出 如 图 14 唱 32 所 示 的 属 性 窗 口 在 名 称 文 本 框 里 修 改 为 txt Name, 这 个 控 件 将 用 于 显 示 和 输 入 teacher_info 数 据 表 中 的 name 宇 段, 在 Datasource 下 拉 列 表 框 里 选 择 ADODC1, 就 是 刚 才 建 立 的 ADODC 数 据 库 控 件 的 名 称 ; 在 DataField 下 拉 列 表 框 里 选 择 name, 对 应 的 是 teacher_info 数 据 表 的 name 字 段, 将 text 文 本 框 里 显 示 的 内 容 去 掉 (11 ) 按 照 同 样 的 方 法 依 次 添 加 名 为 txtgender 的 TextBox 控 件, 在 属 性 窗 口 的 DataField 下 拉 列 表 框 里 选 择 gender ; 添 加 名 为 txtaddress 的 TextBox 控 件, 在 属 性 窗 口 图 14 唱 32 设 置 ADODC 属 性 的 DataField 下 拉 列 表 框 里 选 Address ; 添 加 名 为 txt Mark 的 TextBox 控 件, 在 属 性 窗 口 的 DataField 下 拉 列 表 框 里 选 mark ; 添 加 Lable 控 件, 设 计 好
350 SQL Server 数 据 库 应 用 技 术 的 界 面 如 图 14 唱 33 所 示 图 14 唱 33 设 计 好 的 标 签 和 文 本 框 控 件 (12) 单 击 选 中 General 工 具 箱 里 的 CommandButton 控 件, 在 表 单 任 意 位 置 按 住 鼠 标 左 键 拖 动 出 一 个 区 域, 出 现 CommandButton 控 件, 在 该 控 件 上 单 击, 在 出 现 的 快 捷 菜 单 里 选 择 属 性 窗 口 菜 单 命 令, 在 名 称 文 本 框 里 输 入 CmdFirst, 在 Caption 文 本 框 里 输 入 首 记 录 图 14 唱 34 输 入 命 令 按 钮 的 操 作 代 码 (13) 双 击 名 为 CmdFirst 命 令 按 钮, 出 现 如 图 14 唱 34 所 示 的 界 面, 在 表 单 对 象 下 拉 列 表 框 里 是 所 有 的 表 单 对 象, 在 命 令 方 式 下 拉 列 表 框 里 是 所 有 的 能 够 在 对 象 上 进 行 的 操 作 方 法 添 加 如 下 程 序 代 码 : Private Sub CmdFirst Click() Adodcl.Recordset.MoveFirst End Sub (14) 按 照 同 样 的 方 法 添 加 名 为 CmdPrevios 的 CommandButton 控 件, 其 属 性 窗 口 中
第 14 章 SQL Server 编 程 接 口 351 的 名 称 文 本 框 里 输 入 CmdPrevios, 在 Caption 文 本 框 里 输 入 上 一 条, 其 对 应 的 过 程 代 码 如 下 : Private Sub CmdPrevios Click() Adodc1.Recordset.MovePrevious If Adodc1.Recordset.BOF Then Adodc1.RecordSet.MoveFirst End if End Sub (15) 按 照 同 样 的 方 法 添 加 名 为 CmdNext 的 CommandButton 控 件, 其 属 性 窗 口 中 的 名 称 文 本 框 里 输 入 CmdNext, 在 Caption 文 本 框 里 输 入 下 一 条, 其 对 应 的 过 程 代 码 如 下 : Private Sub CmdNext Click() Adodcl.Recordset.MoveNext If Adodcl.Recordset.EOF Then Adodcl.Recordset.MoveLast End if End Sub (16) 按 照 同 样 的 方 法 添 加 名 为 CmdLast 的 CommandButton 控 件, 其 属 性 窗 口 中 的 名 称 文 本 框 里 输 入 CmdLast, 在 Caption 文 本 框 里 输 入 尾 记 录, 其 对 应 的 过 程 代 码 如 下 : Private Sub CmdLast Click() Adodc1.Recordset.MoveLast End Sub (17) 按 照 同 样 的 方 法 添 加 名 为 CmdExit 的 CommandButton 控 件, 其 属 性 窗 口 中 的 名 称 文 本 框 里 输 入 CmdExit, 在 Capion 文 本 框 里 输 入 退 出, 其 对 应 的 过 程 代 码 如 下 : Private Sub CmdExit Click() Unload Me End Sub 完 全 设 计 好 的 界 面 如 图 14 唱 35 所 示 单 击 窗 口 中 的 运 行 按 钮 就 可 以 执 行 该 实 例 了 14.1.4 通 过 PowerBuilder 访 问 SQL Server 数 据 库 下 面 介 绍 在 Po werbuilder 中 如 何 连 接 SQ L Server 数 据 库, 具 体 步 骤 如 下 : 1 启 动 PB, 进 入 初 始 界 面, 单 击 DB Profile 图 标, 将 调 出 Database Profiles 界 面, 如 图 14 唱 36 所 示 2 在 图 14 唱 36 所 示 的 数 据 库 配 置 文 件 界 面 中, 列 举 了 PB 8.0 所 支 持 的 数 据 库 接 口 驱 动, 它 们 提 供 了 对 Informix.v9x Microsoft SQ L Server Oracle 8.x Sybase ASE 等 的 专 用 数 据 库 驱 动, 选 择 Installed Database Interfaces 下 的 ODB ODBC, 单 击 鼠 标 右 键,
352 SQL Server 数 据 库 应 用 技 术 图 14 唱 35 添 加 命 令 按 钮 控 件 后 的 设 计 界 面 图 14 唱 36 Database Profiles 界 面 在 随 后 弹 出 的 快 捷 菜 单 里, 选 择 New Profile 菜 单 命 令, 将 弹 出 ODBC 配 置 界 面 3 选 择 设 置 界 面 中 的 Connection 标 签 页, 并 在 Profile Name 文 本 框 里 输 入 SQ L ServerODBC, 在 Data Source 对 应 的 下 拉 列 表 框 中, 选 择 sqlserverlink, 在 U ser ID 文
第 14 章 SQL Server 编 程 接 口 353 本 框 中, 输 入 sa, 在 Passw ord 文 本 框 中, 设 置 为 空, 其 他 按 照 默 认 设 置 即 可, 如 图 14 唱 37 所 示 图 14 唱 37 Connection 标 签 页 4 选 择 设 置 界 面 中 的 System 标 签 页 ( 如 图 14 唱 38 所 示 ), 可 以 设 置 在 PB 中 显 示 的 数 据 库 目 标, 一 般 按 照 默 认 值 即 可 图 14 唱 38 System 标 签 页
354 SQL Server 数 据 库 应 用 技 术 5 选 择 图 14 唱 39 所 示 的 preview 标 签 页, 在 Database Connection Syntax 文 本 框 中, 显 示 了 配 置 文 件 的 语 法 单 击 OK 按 钮, 即 完 成 了 PB 与 SQ L Server 数 据 库 的 连 接 另 外, 可 以 单 击 Test Connection 按 钮 进 行 测 试, 如 果 选 择 的 SQ L Server 服 务 器 正 常 工 作 的 话, 会 出 现 一 个 显 示 是 否 能 够 正 常 连 接 的 对 话 框, 里 面 会 显 示 有 关 的 测 试 信 息 图 14 唱 39 Preview 标 签 页 6 设 置 好 的 ODBC 数 据 库 连 接 如 图 14 唱 40 所 示, 在 SQ L ServerODBC 上, 用 鼠 标 右 键 单 击, 在 随 后 弹 出 的 快 捷 菜 单 里, 可 以 选 择 Connect Delete 和 Export Profile(s) 执 行 连 接 删 除 和 输 出 配 置 等 功 能, 完 成 后 单 击 Close 按 钮 图 14 唱 40 ODBC 数 据 库 连 接 设 置 与 操 作 7 在 PB 的 主 界 面 中, 单 击 Database 图 标, 将 能 够 在 PB 中 执 行 对 数 据 库 的 管 理 功 能, 并 弹 出 数 据 库 配 置 界 面, 如 图 14 唱 41 所 示
第 14 章 SQL Server 编 程 接 口 355 图 14 唱 41 与 后 台 数 据 库 进 行 连 接 8 在 Database Connection 窗 口 里, 双 击 Installed Database Interfaces 下 的 ODB ODBC 展 开 符 号, 将 可 以 看 见 刚 才 已 建 立 的 SQ L ServerODBC 配 置, 再 右 击 SQ L ServerODBC, 出 现 快 捷 菜 单 选 择 connect, 将 与 后 台 数 据 库 进 行 连 接 成 功 进 行 连 接 后, 可 以 选 择 已 建 立 的 数 据 表, 并 对 其 进 行 相 应 的 操 作, 如 图 14 唱 42 所 示 图 14 唱 42 对 在 SQL Server 中 已 建 立 的 数 据 表 进 行 操 作
356 SQL Server 数 据 库 应 用 技 术 14.2 使 用 ADO 操 作 数 据 库 中 的 数 据 14.2.1 ActiveX 数 据 对 象 (ADO) 用 ADO 访 问 数 据 库 更 类 似 于 编 写 数 据 库 应 用 程 序,ADO 把 绝 大 部 分 的 数 据 库 操 作 封 装 在 七 个 对 象 中, 编 程 调 用 这 些 对 象 执 行 相 应 的 数 据 库 操 作 ADO 建 立 了 访 问 数 据 库 的 脚 本 编 写 模 型, 它 不 仅 支 持 任 何 大 型 数 据 库 的 核 心 功 能, 而 且 支 持 许 多 数 据 库 所 专 有 的 特 性 ADO 使 用 本 机 数 据 源, 通 过 ODBC 访 问 数 据 库 这 些 数 据 库 可 以 是 关 系 型 数 据 库 文 本 型 数 据 库 层 次 型 数 据 库 或 者 任 何 支 持 ODBC 的 数 据 库 ADO 的 主 要 优 点 是 易 用 高 速 占 用 内 存 和 磁 盘 空 间 少, 所 以 非 常 适 合 于 作 为 服 务 器 端 的 数 据 库 访 问 技 术 相 对 于 访 问 数 据 库 的 CGI 程 序 而 言, 它 是 多 线 程 的, 在 出 现 大 量 并 发 请 求 时, 也 同 样 可 以 保 持 服 务 器 的 运 行 效 率, 并 且 通 过 连 接 池 (Connection Pool) 技 术 以 及 对 数 据 库 连 接 资 源 的 完 全 控 制, 提 供 与 远 程 数 据 库 的 高 效 连 接 与 访 问, 同 时 它 还 支 持 事 务 处 理 ( T ransaction), 以 开 发 高 效 率 高 可 靠 性 的 数 据 库 应 用 程 序 正 是 因 为 使 用 ADO 需 要 编 写 脚 本 程 序, 所 以 ADO 能 够 实 现 更 复 杂 更 灵 活 的 数 据 库 访 问 逻 辑 目 前,ADO 包 括 Command Connection Recordset 等 七 个 对 象 和 一 个 动 态 的 Properties 集 合, 绝 大 部 分 的 数 据 库 访 问 任 务 都 可 以 通 过 它 们 的 组 合 来 完 成 ADO 具 体 的 七 个 对 象 为 : 瞯 Command : 定 义 对 数 据 源 进 行 操 作 的 命 令 ; 瞯 Connection : 建 立 一 个 数 据 源 的 连 接 ; 瞯 Error : 提 供 数 据 访 问 错 误 的 细 节 ; 瞯 Field : 表 示 一 般 数 据 类 型 的 字 段 ; 瞯 Parameter : 表 示 Command 对 象 的 参 数 ; 瞯 Property : 表 示 由 数 据 源 定 义 ADO 对 象 的 动 态 特 性 ; 瞯 Recordset : 数 据 库 命 令 结 果 集 对 象 灵 活 运 用 上 述 对 象 的 属 性 方 法 可 以 达 到 许 多 很 好 的 效 果 但 通 过 ADO 访 问 数 据 库 通 常 经 过 下 列 步 骤 1 创 建 数 据 库 源 名, 即 创 建 和 配 置 ODBC 数 据 源 2 创 建 数 据 库 链 接 如 果 要 访 问 数 据, 必 须 首 先 创 建 与 数 据 库 的 链 接, 其 语 法 如 下 : Set Conn = Server CreateObject ( ADOBD.CONNECTION ) 这 条 语 句 创 建 了 链 接 对 象 Conn, 接 下 来 : Conn.Open dsn_name, username, password 这 条 语 句 打 开 链 接, 用 到 了 DSN, 这 里 DSN 名 为 dsn_name 其 后 的 两 个 参 数 分 别 是 访 问 数 据 库 的 用 户 名 和 口 令, 为 可 选 参 数 例 如, 对 DSN 为 sqlserverlink 的 SQ L Server 数 据 库 链 接 的 设 置 代 码 可 以 写 为 :
第 14 章 SQL Server 编 程 接 口 357 Set Conn = Server CreateObject ( ADOBD.CONNECTION ) Conn.Open sqlserverlink, sa, passwd // 创 建 与 数 据 库 的 链 接 // 创 建 链 接 对 象 其 中, sa 为 访 问 SQ L Server 数 据 库 的 账 号, passwd 为 该 账 号 的 访 问 口 令, 具 体 的 内 容 创 建 数 据 库 时 的 设 定 也 可 以 不 对 系 统 设 置 DSN, 这 一 段 代 码 可 以 写 为 : Dim Conn As New ADODB.Connection Conn.ConnectionString = DRIVER = {SQL Server} ; & _ SERVER = & ServerName & ;UID = & UserName & ; PWD = & Password & ;DATABASE = & DatabaseName & Conn.Open // 定 义 ADO 数 据 库 对 象 // 连 接 数 据 串 // 连 接 数 据 库 注 意 : ServerName 为 服 务 器 名 ;UserName 为 用 户 名 ;Passw ord 为 用 户 口 令 ; DatabaseName 为 要 登 录 的 数 据 库 名, 可 以 为 空 Set Conn = New ADODB.Connection // 创 建 与 数 据 库 的 链 接, 下 句 创 建 链 接 对 象 Conn.Open DRIVER = {SQL Server} ;SERVER = pszhang ;UID = Sa ;PWD = ;DATABASE = student 其 中, 驱 动 程 序 DRIVER 名 称 为 SQ L Server, 服 务 器 Server 名 称 为 pszhang, 数 据 库 DA T ABASE 名 称 为 student 3 创 建 数 据 对 象 RecordSet 保 存 的 是 数 据 库 命 令 结 果 集, 并 标 有 一 个 当 前 记 录 以 下 是 创 建 方 法 : Set RecordSet = Conn.Execute(SqlStr) 这 条 语 句 创 建 并 打 开 了 对 象 RecordSet, 其 中 Conn 是 先 前 创 建 的 链 接 对 象,SqlStr 是 一 个 串, 代 表 一 条 标 准 的 SQ L 语 句, 例 如 : SqlStr = SELECT 倡 FROM stud_info Set RecordSet = Conn.Execute (SqlStr) 这 条 语 句 执 行 后, 对 象 RecordSet 中 就 保 存 了 表 stud_info 中 的 所 有 记 录 4 操 作 数 据 库 Execute 方 法 的 参 数 是 一 个 标 准 的 SQ L 语 句 串, 所 以 可 以 利 用 它 方 便 地 执 行 数 据 插 入 修 改 删 除 等 操 作, 例 如 : SqlStr = DELETE FROM stud_info Conn.Execute (SqlStr) // 执 行 删 除 操 作 SqlStr = UPDATE stud_info SET mark = 563 WHERE stud_id = 0401020201 Conn.Execute (SqlStr) // 执 行 修 改 操 作 5 关 闭 数 据 对 象 和 链 接 在 使 用 了 ADO 对 象 之 后, 一 定 要 记 住 关 闭 它, 因 为 它 使 用 了 服 务 器 的 资 源, 如 果 不 释 放 的 话 将 导 致 服 务 器 资 源 浪 费 并 影 响 服 务 器 性 能 通 过 调 用 方 法 close 实 现 关 闭, 然
358 SQL Server 数 据 库 应 用 技 术 后 再 释 放 它, 例 如 : Conn.close 14.2.2 在 Visual Basic 中 用 ADO 访 问 数 据 库 例 14.1 在 VB 中 建 立 与 SQ L Server 数 据 库 的 连 接, 返 回 学 生 信 息 表 中 所 有 的 记 录, 并 把 结 果 显 示 在 一 个 列 表 框 中 启 动 VB 6.0, 新 建 一 个 VB 工 程, 在 菜 单 工 程 部 件 里 选 Microsoft ADO Data Control 6.0( OLEDB) 在 Form1 上 添 加 ADO 控 件 和 ListBox 控 件, 在 Form _ Load 过 程 中 添 加 如 下 代 码 : Dim cn As New ADODB.Connection Dim rs As ADODB.Recordset Dim strcnn As String Dim strsql As String strcnn = DRIVER = { SQL Server} ;SERVER = pszhang ;UID = Sa ;PWD = ;DATABASE = student Set cn = New ADODB.Connection cn.open strcnn strsql = select 倡 from stud_info Set rs = New ADODB.Recordset rs.cursortype = adopenstatic rs.cursorlocation = aduseclient Set rs = cn.execute(strsql) Do While rs.eof = False List1.AddItem rs(0) & & rs(1) rs.movenext Loop Set rs = Nothing Set cn = Nothing 例 14.2 在 VB 中 使 用 Command 对 象, 执 行 一 个 存 储 过 程 stud_proc3, 该 存 储 过 程 将 按 照 性 别 统 计 人 数 即 输 入 性 别 之 后, 返 回 对 应 性 别 的 学 生 人 数, 并 把 结 果 显 示 在 ListBox1 中, 存 储 过 程 如 下 : CREATE PROCEDURE stud_proc3 @ in_sex CHAR(2) AS BEGIN IF @ in_sex = 男 SELECT 倡 FROM stud_info WHERE gender = 男 ; ELSE END GO SELECT 倡 FROM stud_info WHERE gender = 女 在 VB 中 定 义 一 个 Command 对 象, 然 后 调 用 Execute 方 法 执 行 存 储 过 程 如 下 :
第 14 章 SQL Server 编 程 接 口 359 Dim rs As ADODB.Recordset Dim strcnn As String Dim strsql As String strcnn = DRIVER = { SQL Server} ;SERVER = student Set cn = New ADODB.Connection cn.open strcnn Dim cm As New ADODB.Command cm.activeconnection = cn cm.commandtext = EXEC stud_proc3 男 cm.commandtype = adcmdstoredproc cm.commandtimeout = 15 Set rs = cm.execute(1,1,1) List1.Clear Do While rs.eof = False List1.AddItem rs(0) & & rs(1) rs.movenext Loop pszhang ;UID = Sa ;PWD = ;DATABASE = 也 可 以 改 用 Parameter 对 象 来 完 成 对 存 储 过 程 的 调 用, 在 CommandText 属 性 中, 只 需 要 指 定 存 储 过 程 的 名 称, 而 用 Parameter 对 象 来 存 放 该 存 储 过 程 的 输 入 参 数 Dim cm As New ADODB.Command Dim rs As ADODB.Recordset Dim prm As ADODB.Parameter Dim strcnn As String Dim strsql As String strcnn = DRIVER = { SQL Server} ;SERVER = pszhang ;UID = sa ;PWD = ;DATABASE = student Set cn = New ADODB.Connection cn.open strcnn cm.activeconnection = cn cm.commandtext = stud_proc3 Set prm = cm.createparameter( in_sex,adchar,adparaminput,100, 男 ) cm.parameters.append prm cm.commandtype = adcmdstoredproc cm.commandtimeout = 15 Set rs = cm.execute List1.Clear Do While rs.eof = False List1.AddItem rs(0) & & rs(1) rs.movenext Loop
360 SQL Server 数 据 库 应 用 技 术 例 14.3 在 VB 中 建 立 与 SQ L Server 数 据 库 的 连 接, 返 回 学 生 信 息 表 中 所 有 的 记 录, 并 把 结 果 显 示 在 一 个 列 表 框 中 启 动 VB 6.0, 新 建 一 个 VB 工 程, 在 菜 单 工 程 部 件 里 选 Microsoft FlexGrid Control 6.0 在 Form1 上 添 加 一 个 M SFlexGrid 控 件, 在 Form_Load 过 程 中 添 加 如 下 代 码 : Dim Cmd As New ADODB.Command Dim rs As ADODB.Recordset Dim grid As MSFlexGrid With Cmd.ActiveConnection = DSN = sqlserverlink ;UID = sa ;PWD = ;.CommandText = SELECT 倡 FROM stud_grade WHERE stud_id =?.CreateParameter Firstchar, adchar, adparaminput,4, B.Parameters(0).Value = 0401010634 End With Set rs = Cmd.Execute Set grid = MSFlexGrid1 DisplayForwardGrid rs, grid rs.close 本 例 中, Command 对 象 用 来 保 存 ADODB. Recordset 返 回 的 结 果 集 ; ActiveConnection 属 性 所 设 置 的 活 动 的 ADODB.Connection 对 象 的 具 体 内 容 是 DSN = sqlserverlink ;UID = sa ; PWD = ; ;CommandText = SELEC T 倡 FRO M stud_ grade w here stud_id =? 中 的 问 号 是 一 个 参 数 标 记, 该 参 数 的 属 性 是 由 CreateParameter 定 义 ; CreateParameter 语 句 带 有 四 个 参 数, 第 一 个 参 数 (Firstchar) 表 示 该 参 数 的 名 称, 第 二 个 参 数 (adchar) 表 示 该 参 数 包 含 字 符 数 据, 第 三 个 参 数 (adparaminput) 表 示 只 用 于 输 入 的 参 数, 第 四 个 参 数 表 示 该 参 数 有 4 个 字 节 ;Parameters(0).Value = 0401010634 语 句 是 将 数 值 0401010634 赋 给 Parameters 对 象 的 Value 属 性 ;Cmd.Execute 语 句 功 能 是 用 Command 对 象 的 Execute 方 法 在 SQ L Server 上 运 行 Select 语 句 ; 执 行 Set rs = Cmd. Execute 语 句 后,Recordset 对 象 rs 中 是 SELEC T 倡 FRO M stud_ grade w here stud_ id = 0401010634 语 句 检 索 结 果 ; rs. Close 作 用 是 关 闭 Recordset 对 象 DisplayFor wardgrid 的 定 义 如 下 : Private Sub DisplayForwardGrid(rs As ADODB.Recordset, Grid1 As MSFlexGrid) Dim fld As ADODB.Field Grid1.Cols = rs.fields.count Grid1.Rows = 1 Grid1.Row = 0 Grid1.Col = 0 For Each fld In rs.fields Grid1.ColWidth(Grid1.Col) = TextWidth(String(fld.ActualSize + 4, a )) Grid1.ColAlignment(Grid1.Col) = 1 Grid1.Text = fld.name If Grid1.Col < rs.fields.count - 1 Then
第 14 章 SQL Server 编 程 接 口 361 Grid1.Col = Grid1.Col + 1 End If Next fld Do Until rs.eof Grid1.Rows = Grid1.Rows + 1 Grid1.Row = Grid1.Rows 唱 1 Grid1.Col = 0 For Each fld In rs.fields Grid1.Text = fld.value If Grid1.Col < rs.fields.count 唱 1 Then Grid1.Col = Grid1.Col + 1 End If Next fld rs.movenext Loop End Sub 例 14.4 利 用 ADO 访 问 数 据 库, 实 现 用 ADO Connection 对 象 执 行 动 态 的 SQ L 语 句 Private Sub Command2_Click() Dim cn As New ADODB.Connection Dim rs As ADODB.Recordset Dim grid As MSFlexGrid Dim ssql As String cn.connectionstring = DSN = sqlserverlink ;UID = sa ;PWD = ; cn.open ssql = DROP T ABLE specialty_code cn.execute ssql 用 ADO Connection 对 象 执 行 动 态 的 SQL 语 句 On Error GoTo ErrorHandler ssql = CREATE T ABLE specialty_ code( SPECcode char(6) not null,specname char(20), primary Key(Dep_ID)) cn.execute ssql Set grid = MSFlexGrid1 DisplayForwardGrid rs, grid Exit Sub ErrorHandler : DisplayADOError cn End Sub 本 例 中, 第 一 个 Cmd.Execute ssq L 语 句 功 能 是 用 Command 对 象 的 Execute 方 法 在 SQ L Server 上 删 除 specialty _ code 表 ; 第 二 个 Cmd.Execute ssq L 语 句 功 能 是 用 Command 对 象 的 Execute 方 法 在 SQ L Server 上 重 建 specialty_code 表 ;On Error Go T o
362 SQL Server 数 据 库 应 用 技 术 Error Handler 是 用 来 捕 捉 当 表 不 存 在 时 执 行 Drop Table specialty_code 语 句 生 成 的 错 误 ; 运 行 时, 如 果 遇 到 任 何 错 误, 则 转 入 Error Handler : 后 所 示 的 DisplayADOError cn 例 程 中 ;DisplayADOError cn 语 句 中 的 cn 参 数 是 实 参, 表 示 Connection 对 象 中 的 DSN = sqlserverlink ;UID = sa ;PWD = ; ; 在 DisplayADOError 例 程 中,er 被 声 明 为 ADODB. Error 对 象 ; 在 DisplayADOError 例 程 中, 循 环 条 件 Each er In cn.errors 表 示 在 ADODB.Error 集 合 中 遍 历 ; 消 息 框 中 Number 属 性 显 示 ADO 错 误 消 息 号,Source 属 性 显 示 产 生 错 误 的 源 对 象,Text 显 示 错 误 的 文 本 描 述 DisplayADOError 的 定 义 如 下 : Private Sub DisplayADOError(cn As ADODB.Connection) Dim er As ADODB.Error For Each er In cn.errors MsgBox Number : & er.number & vbcrlf & Source : & er.source & vbcrlf & Text : & er.description Next End Sub 例 14.5 利 用 ADO 访 问 数 据 库, 实 现 在 Recordset 对 象 中 增 加 行 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim grid As MSFlexGrid Dim i As Integer Dim mdirection As Integer Dim ssql As String cn.connectionstring = DSN = sqlserverlink ;UID = sa ;PWD = ; cn.open rs.activeconnection = cn rs.open SELECT deptcode, deptname FROM dept_code,cn,adopenkeyset,adlockoptimistic, adcmdtext For i = 1 To 50 rs.addnew rs! deptcode = i rs! deptname = dept_code & CStr(i) rs.update 在 Recordset 对 象 中 增 加 行 Next Set grid = MSFlexGrid1 mdirection = 1 DisplayKeysetGrid rs, grid, mdirection rs.close 本 例 中,Recordset 对 象 的 Open 方 法 的 第 一 个 参 数 是 一 个 定 义 结 果 集 的 SQ L 语 句, 其 结 果 集 是 由 dept_code 表 的 deptcode 和 deptname 两 个 列 组 成 ; 第 二 个 参 数 是 一 个 活 动 Connection 对 象 的 cn 名 称, 第 三 个 参 数 表 明 的 是 将 使 用 一 个 键 集 游 标, 第 四 个 参 数 表 明
第 14 章 SQL Server 编 程 接 口 363 的 是 使 用 乐 观 记 录 锁, 且 结 果 集 可 修 改 ; 循 环 体 中 rs.addnew 语 句 功 能 是 创 建 一 个 行 缓 冲 区, 该 缓 冲 区 包 含 新 数 据 行,rs! deptcode = i 语 句 中 的 感 叹 号 作 用 是 访 问 结 果 集 rs 中 名 为 deptcode 的 列,rs.Update 语 句 功 能 是 调 用 Update 方 法 在 Recordset 对 象 和 数 据 源 中 增 加 行 ;rs.close 作 用 是 关 闭 Recordset 对 象 例 14.6 利 用 ADO 访 问 数 据 库, 实 现 修 改 ADO Recordset 对 象 中 的 行 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Dim grid As MSFlexGrid Dim mdirection As Integer Dim stemp As String cn.connectionstring = DSN = sqlserverlink ;UID = sa ;PWD = ; cn.open rs.activeconnection = cn rs.open SELECT deptcode, deptname FROM dept_code,cn,adopenkeyset,adlockoptimistic, adcmdtext Do Until rs.eof stemp = Trim(rs! deptname) rs! deptname = Updated & stemp 修 改 ADO Recordset 对 象 中 的 行 rs.update rs.movenext Loop Set grid = MSFlexGrid1 mdirection = 1 DisplayKeysetGrid rs, grid, mdirection rs.close 本 例 中, 使 用 Recordset 对 象 的 Update 方 法 修 改 ADO 结 果 集 中 的 行,Recordset 对 象 的 Open 方 法 的 使 用 adopenkeyset 和 adlockoptimistic 表 示 使 用 一 个 可 修 改 的 键 集 游 标 和 乐 观 记 录 锁 ; 循 环 条 件 rs.eof 表 示 当 Recordset 对 象 的 EOF 属 性 为 T rue 时, 循 环 结 束, 循 环 体 中 deptname 的 值 被 设 置 为 文 字 Updated 和 当 前 列 值 连 接 的 结 果, M ovenext 方 法 将 使 游 标 定 位 到 下 一 行 ;DisplayKeysetGrid 例 程 的 功 能 支 持 向 前 或 向 后 滚 动 的 键 集 游 标,mDirection 是 一 个 实 际 参 数, 用 来 控 制 数 据 显 示 的 方 向 14.2.3 在 C++ Builder 中 用 ADO 访 问 数 据 库 C++ Builder + SQ L Server 数 据 库 应 用 是 基 于 C/S 模 式 的 应 用, 使 用 范 围 非 常 广 泛 其 典 型 的 应 用 开 发 环 境 如 下 : (1) 在 数 据 库 服 务 器 上 安 装 SQ L Server 数 据 库 (2) 在 应 用 客 户 机 上 需 要 安 装 连 接 端 BDE(Borland 公 司 的 数 据 库 引 擎 ) 和 利 用 C++ Builder 开 发 后 的 可 执 行 程 序 (3) 在 开 发 机 上 需 要 安 装 Borland C++ Builder 6 开 发 环 境 和 SQ L Server 管 理 端 下 面 介 绍 一 下 在 C++ Builder 6 中 利 用 ADO 连 接 到 后 台 的 SQ L Server 数 据 库 C++ Builder 6 提 供 了 对 BDE ODBC 等 多 种 数 据 库 驱 动 的 支 持 在 这 里 仅 介 绍 C++ Builder 6 是 怎 样 通 过 ADO 来 访 问 SQ L Server 数 据 库 的 具 体 步 骤 如 下 :
364 SQL Server 数 据 库 应 用 技 术 (1) 启 动 Borland C + + Builder 6, 系 统 自 动 创 建 一 个 新 的 应 用 程 序, 并 创 建 窗 体 Form1 在 C + + Builder 6 菜 单 栏 单 击 ADO 图 标, 添 加 ADO Connection 控 件 (ADOConnection1) 到 Form1 之 中, 将 出 现 如 图 14 唱 43 所 示 的 带 8 个 小 黑 块 的 正 方 形 图 标 图 14 唱 43 选 择 ADO 菜 单 命 令 (2) 双 击 ADOConnection1 正 方 形 图 标, 将 弹 出 如 图 14 唱 44 所 示 的 界 面 图 14 唱 44 Form1.ADOConnection1.ConnectionString (3) 单 击 Build, 弹 出 如 图 14 唱 45 所 示 的 界 面 选 中 Microsoft OLE DB Provider for SQ L Server 选 项, 单 击 下 一 步 按 钮, 进 入 配 置 数 据 库 连 接 参 数 标 签 页 (4) 弹 出 如 图 14 唱 46 所 示 的 界 面 在 输 入 服 务 器 名 称 文 本 框 里 输 入 连 接 服 务 器 的 名 称 ( 本 例 为 pszhang), 在 用 户 名 称 文 本 框 里 输 入 sa, 在 密 码 文 本 框 里 输 入 所 设 密 码 ( 本 例 为 空 ), 在 服 务 器 上 选 择 数 据 库 文 本 框 里 选 择 student 按 钮, 单 击 测 试 连 接 按
第 14 章 SQL Server 编 程 接 口 365 图 14 唱 45 选 择 数 据 库 驱 动 程 序 图 14 唱 46 配 置 数 据 库 连 接 参 数 钮 进 行 测 试, 如 果 选 择 的 SQ L Server 服 务 器 正 常 工 作 的 话, 会 出 现 一 个 显 示 测 试 连 接 成 功 的 对 话 框 即 完 成 C++ Builder 6 与 SQ L Server 数 据 库 的 连 接 (5) 在 窗 体 Form1 中 再 添 加 ADO Table 控 件 ( ADO Table1) DataSource 控 件
366 SQL Server 数 据 库 应 用 技 术 (DataSource1) DBGrid 控 件 (DBGrid1), 即 从 ADO 控 件 夹 下 选 择 ADO Table 控 件,Data Access 控 件 夹 下 选 择 Datasource 控 件,Data Controls 控 件 夹 下 选 择 DBGrid, 放 置 在 Form1 上 如 图 14 唱 47 所 示, 控 件 名 分 别 为 ADOConnection1 ADO Tablel Datasoure1 DBGrid1 图 14 唱 47 将 所 需 要 的 控 件 放 置 在 Form1 上 (6) 为 各 控 件 分 别 设 置 属 性 其 中 ADOConnection1 控 件 的 属 性 设 置 如 图 14 唱 48 所 示, 具 体 参 数 如 下 : ConnectionString 属 性 设 置 为 Provider = SQ LOLEDB.1 ;Persist Security Info = False ; User ID = sa ;Initial Catalog = student ;Data Source = pszhang ADO Table1 控 件 的 属 性 设 置 如 图 14 唱 49 和 14 唱 50 所 示, 具 体 参 数 如 下 : Connection 属 性 设 置 为 ADOConnection1 TableName 属 性 设 置 为 stud _ info Active 属 性 设 置 为 T rue Datasource1 控 件 的 属 性 设 置 如 图 14 唱 51 所 示, 具 体 参 数 如 下 : DataSet 属 性 设 置 为 ADO Table1 DBGrid1 控 件 的 属 性 设 置 如 图 14 唱 52 所 示, 具 体 参 数 如 下 : Datasource 属 性 设 置 为 Datasource1 ; (7) 单 击 工 具 条 中 的 RU N 图 标 或 单 击 F9 键 运 行 程 序, 出 现 如 图 14 唱 53 所 示 Database Login 检 验 窗 口 后, 验 证 有 效 后, 又 将 出 现 程 序 运 行 窗 口, 如 图 14 唱 54 所 示 图 14 唱 48 ConnectionString 图 14 唱 49 Connection
第 14 章 SQL Server 编 程 接 口 367 图 14 唱 50 TableName 设 置 图 14 唱 51 DataSet 设 置 图 14 唱 52 DataSource 设 置 图 14 唱 53 Database Login 检 验 图 14 唱 54 程 序 运 行 窗 口
368 SQL Server 数 据 库 应 用 技 术 实 训 1. 实 训 目 的 (1) 理 解 ODBC 的 作 用 (2) 学 会 创 建 和 配 置 ODBC 数 据 源 的 方 法 (3) 学 会 通 过 ODBC 访 问 数 据 库 的 方 法 (4) 学 会 使 用 ADO 访 问 数 据 库 方 法 2. 实 训 的 知 识 准 备 ODBC 是 一 种 重 要 的 数 据 库 访 问 应 用 程 序 接 口 数 据 源 名 称 是 连 接 数 据 库 驱 动 程 序 与 数 据 库 系 统 的 桥 梁, 它 为 ODBC 驱 动 程 序 指 定 数 据 库 服 务 器 名 称 以 及 用 户 的 连 接 参 数 等 选 项 可 以 使 用 ODBC 数 据 源 管 理 器 来 建 立 数 据 源 ADO 把 绝 大 部 分 的 数 据 库 操 作 封 装 在 七 个 对 象 中, 调 用 这 些 对 象 就 可 以 执 行 相 应 的 数 据 库 操 作 用 ADO 访 问 数 据 库 类 似 于 编 写 数 据 库 应 用 程 序, 它 包 括 ADO 数 据 控 件 的 使 用 ADO 对 象 的 属 性 及 其 应 用 ADO 数 据 控 件 连 接 数 据 库 使 用 ADO 浏 览 查 找 和 修 改 数 据 库 记 录 等 3. 实 训 内 容 和 步 骤 (1) 创 建 一 个 名 为 dns_student 的 数 据 源, 连 接 的 数 据 库 为 student (2) 在 SQ L Server 查 询 分 析 器 中, 使 用 SQ L 命 令 建 立 一 个 学 生 成 绩 表 stud_score 并 输 入 数 据, 然 后 倒 入 Excel 中 进 行 编 辑 和 修 改 (3) 在 Visual Basic 中 显 示 stud_info 数 据 表 中 的 所 有 记 录 (4) 在 PowerBuilder 中 显 示 stud_grade 数 据 表 中 的 所 有 记 录 (5) 在 C++ Builder 6 中 建 立 与 SQ L Server 数 据 的 连 接, 服 务 器 名 称 为 computer, 数 据 库 名 称 为 student,sa 用 户 无 密 码 要 求 返 回 teacher_info 数 据 表 中 的 所 有 记 录, 并 把 结 果 显 示 在 列 表 框 中 (6) 使 用 Java 语 言, 并 运 用 JDBC 技 术 向 课 程 信 息 表 (lesson_info) 中 插 入 一 行 记 录 (7) 使 用 ADO 在 Visual Basic 中 创 建 一 个 数 据 库, 并 在 该 数 据 库 中 创 建 一 个 表, 然 后 向 该 表 中 插 入 一 条 记 录 并 显 示 它 (8) 在 C++ Builder 6 中 显 示 teacher_info 数 据 表 中 的 所 有 记 录 课 后 作 业 1. 简 要 回 答 下 列 问 题 (1) ODBC 的 含 义 是 什 么? 它 包 含 哪 些 控 件? (2) 如 何 为 SQ L Server 数 据 库 配 置 ODBC 数 据 源? (3) 在 要 创 建 的 数 据 源 类 型 中, 系 统 数 据 源 和 用 户 数 据 源 有 何 不 同? (4) 在 配 置 SQ L Server 数 据 库 的 ODBC 数 据 源 时, 可 选 的 验 证 登 录 ID 的 方 式 有
第 14 章 SQL Server 编 程 接 口 369 几 种? 2. 按 照 题 目 要 求 完 成 下 列 任 务, 并 尽 量 在 机 器 进 行 调 试 (1) 假 设 在 名 为 myserver 的 服 务 器 上 不 存 在 数 据 源, 请 写 出 使 用 ADO 建 立 和 数 据 库 student 进 行 连 接 的 代 码 (2) 假 设 在 名 为 myserver 的 服 务 器 上 存 在 数 据 源 sqlserverlink, 请 写 出 使 用 ADO 建 立 和 上 述 数 据 源 的 连 接 的 代 码 (3) 请 说 明 下 列 程 序 片 段 的 功 能 Dim cn As New ADODB.Connection Dim cmd As New ADODB.Command Dim rs As New ADODB.Recordset cn.open Driver = {SQL Server} ;server = myserver ;uid = sa ;pwd = ;database = students With cmd.activeconnection = cn.commandtext = DELETE dept_code End With cmd.execute rs.open SELECT 倡 FROM dept_code,cn,,,adcmdtext rs.close (4) 请 说 明 下 列 程 序 片 段 的 功 能 Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset cn.connectionstring = DSN = sqlserverlink ; UID = sa ; PWD = ; cn.open rs.activeconnection = cn rs. Open SELECT deptcode, deptname FROM dept _ code, cn, adopenkeyset, adlockoptimistic, adcmdtext Do Until rs.eof rs.delete rs.movenext Loop rs.close (5) 请 为 下 列 程 序 片 段 中 每 个 语 句 进 行 功 能 注 释 Dim rs As NEW ADO.Recordset rs.activeconnction = cn rs.open SELECT 倡 FROM specialty_code,cn,adopenstatic,adlockpessimistic,adcmdunkown rs.close (6) 请 为 下 列 程 序 片 段 中 每 个 语 句 进 行 功 能 注 释
370 SQL Server 数 据 库 应 用 技 术 Dim cmd As New ADODB.Command cmd.commandtype = adcmdstoredproc cmd.commandtext = stud_proc cmd.execute (7) 设 置 Activeconnction 属 性 之 后, 使 用 Recordset 对 象 的 Open 方 法 打 开 一 个 游 标 这 个 Recordset 对 象 的 Open 方 法 可 带 5 个 可 选 的 参 数 请 说 明 下 列 程 序 片 段 的 Open 方 法 所 带 参 数 的 含 义 Dim rs As NEW ADO.Recordset rs.activeconnction = cn rs.open SELECT 倡 FROM stud_info,cn,adopenfowardonly,adlockreadonly,adcmdtext rs.close (8) 下 列 程 序 片 段 使 用 一 个 ADO Recordset 对 象, 该 对 象 欲 使 用 一 个 键 集 游 标 请 在 横 线 处 填 写 对 应 的 参 数 Dim rs As NEW ADO.Recordset rs.activeconnction = cn rs.source = SELECT 倡 FROM staffroom_info rs.open,, adlockreadonly rs.close 3. 选 择 合 适 的 内 容 填 空 (1) 一 个 数 据 源 是 指 一 个 指 定 连 接 的, 通 常 称 为 (2) Visual Basic 提 供 了 一 个 数 据 库 管 理 器 (Visual Data Manager), 利 用 它 很 方 便 地 访 问 远 程 服 务 器 上 的 数 据 库 但 在 访 问 远 程 数 据 库 之 前 需 要 在 ODBC 中 (3) ODBC 即, 其 实 质 上 是 一 种 数 据 库 引 擎 通 过 它 所 提 供 的 函 数, 可 以 访 问 数 据 库 中 的 数 据 它 的 优 点 是 能 (4) 在 ODBC 技 术 中, 数 据 源 分 为 三 类 (5) ADO 对 象 模 型 定 义 了 一 个 可 编 程 的 对 象 集 合, 它 支 持 部 件 对 象 模 型 和 数 据 源 (6) ADO 对 象 模 型 中 包 含 了 3 个 一 般 用 途 的 对 象 : 和 (7 ) ADO Data 控 件 使 用 ActiveX 数 据 对 象 ( ADO ) 来 快 速 和, 并 快 速 创 建 记 录 集, 然 后 将 数 据 通 过 提 供 给 用 户 (8) Visual Basic 的 内 部 控 件 中, 可 以 绑 定 ADO 数 据 控 件 的 主 要 有 (9) 添 加 数 据 窗 体 向 导 的 方 法 很 简 单 在 Visual Basic 菜 单 中 选 择 \ 命 令 打 开 对 话 框, 在 对 话 框 的 外 接 程 序 列 表 中 选 择 选 项 (10) DataGird 控 件 就 是, 可 以 将 它 作 为, 这 样 可 以 同 时 浏 览
第 14 章 SQL Server 编 程 接 口 371 或 修 改 多 个 记 录 的 数 据 4. 请 用 适 当 的 语 句 或 命 令 完 善 下 列 程 序 Dim cn As New ADODB.Connection Dim cmd As New ADODB.Command Dim sr, sq As String Dim i As Integer Dim Grid As MSFlexGrid Dim rs As New ADODB.Recordset sr = Driver = {SQL Server} ;server = pszhang ;uid = sa ;pwd = ;database = students sq = INSERT INTO dept_code Values(?,?) with cmd.activeconnection = cn.commandtext = sq.createparameter, adchar, adparaminput,25 End With For i = 1 To 50 cmd.parameters(0) = CStr(i) cmd.parameters(1) = dept_code & CStr(i) Next Set Grid = MSFlexGrid1 DisplayForwardGrid rs, Grid rs.close 5. 请 用 适 当 的 语 句 或 命 令 完 善 下 列 程 序 Dim cn As New ADODB.Cnnection Dim cmd As New ADODB.Command Dim sr, sq As String Dim i As Integer Dim Grid As MSFlexGrid Dim rs As New ADODB.Recordset sr = Driver = {SQL Server} ;server = pszhang ;uid = sa ;pwd = ;database = students With cmd.activeconnection = cn.commandtext = UPDA TE dept_code SET Dep_name =? WHERE Dep_ID =?.CreateParameter,adChar,adParamInput,25
372 SQL Server 数 据 库 应 用 技 术 End With For i = 0 To 50 cmd.parameters(0).valus = UPDATE dept_code & CStr(i) cmd.parameters(1).valus = CStr(i) Next Set Grid = MSFlexGrid1 DisplayForwardGrid rs, Grid rs.close
附 录 A 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 教 学 大 纲 学 分 3.5 学 时 数 64 适 用 专 业 计 算 机 应 用 信 息 管 理 软 件 开 发 计 算 机 网 络 等 先 行 课 程 计 算 机 科 学 导 论 VB 或 C 语 言 程 序 设 计 后 续 课 程 Java VC Web 技 术 与 应 用 Power Builder 应 用 与 开 发 C++ Builder 6 PHP + My SQL 网 络 数 据 库 开 发 技 术 等 1. 课 程 性 质 目 标 和 任 务 数 据 库 应 用 技 术 是 计 算 机 在 数 据 处 理 应 用 领 域 中 的 主 要 内 容 和 坚 实 基 础, 也 是 今 后 若 干 年 内 研 究 和 应 用 的 最 活 跃 的 分 支 之 一 因 此, 计 算 机 应 用 信 息 管 理 软 件 开 发 计 算 机 网 络 等 专 业 的 学 生, 特 别 是 以 应 用 为 目 标 的 学 生 都 必 须 学 习 和 具 备 数 据 库 原 理 与 应 用 的 知 识 本 课 程 的 主 要 任 务 是, 通 过 课 堂 教 学 和 实 习 操 作 使 学 生 较 全 面 地 掌 握 数 据 库 原 理 与 应 用 的 基 本 概 念 基 本 理 论 和 基 本 方 法, 初 步 具 备 使 用 数 据 库 应 用 技 术 解 决 实 际 问 题 的 能 力 2. 课 程 基 本 要 求 枟 SQ L Server 数 据 库 应 用 技 术 枠 属 于 计 算 机 应 用 信 息 管 理 软 件 开 发 计 算 机 网 络 等 专 业 的 专 业 基 础 课 通 过 此 课 程 的 学 习, 培 养 学 生 利 用 数 据 库 原 理 和 方 法 开 发 计 算 机 网 络 信 息 管 理 系 统 的 能 力 通 过 理 论 的 讲 授 和 实 践 的 训 练, 务 必 使 学 生 达 到 如 下 要 求 : (1) 注 重 理 论 联 系 实 际, 培 养 学 生 对 数 据 库 应 用 技 术 的 学 习 兴 趣, 重 点 掌 握 数 据 库 应 用 技 术 的 基 本 概 念 和 基 本 原 理 (2) 在 理 解 数 据 库 应 用 技 术 基 本 概 念 的 基 础 上, 通 过 实 践 操 作 训 练, 让 学 生 基 本 熟 悉 构 建 数 据 库 系 统 的 全 过 程 (3) 根 据 数 据 库 应 用 技 术 的 特 点, 要 求 学 生 能 运 用 数 据 库 知 识 在 数 据 库 系 统 环 境 下, 能 结 合 实 例 来 完 成 数 据 库 系 统 的 建 立 和 维 护 3. 教 学 条 件 (1) 能 够 方 便 边 讲 解 边 演 示 的 多 媒 体 教 师 (2) 开 发 一 些 多 媒 体 课 件 或 网 页 课 件, 为 课 堂 教 学 和 实 例 分 析 所 使 用 (3) 具 备 客 户 机 / 服 务 器 模 式 的 网 络 实 验 室 作 为 学 生 实 践 操 作 的 场 地 4. 课 程 教 学 内 容 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 将 从 数 据 库 的 基 础 知 识 到 SQ L Server 2000 的 使 用 和 管 理 进 行 全 面 地 介 绍 和 分 析 其 主 要 教 学 内 容 为 数 据 库 应 用 技 术 基 础 SQ L Server 2000 服 务 器 和 客 户 端 的 操 作 数 据 库 及 其 管 理 数 据 库 对 象 的 基 本 操 作 数 据 查 询 索 引 复 制 视 图 存 储 过 程 触 发 器 程 序 设 计 数 据 转 换 服 务 安 全 性 管 理 备 份 与 恢 复 ODBC 的 ADO 编 程 接 口 等
374 SQL Server 数 据 库 应 用 技 术 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 将 在 介 绍 SQ L Server 数 据 库 基 本 内 容 的 同 时, 通 过 学 生 管 理 信 息 系 统 的 实 例 将 数 据 库 基 本 原 理 和 应 用 技 术 整 合 5. 学 时 分 配 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 总 教 学 时 数 为 64 ~ 80 学 时, 其 中 : 理 论 教 学 为 44 学 时, 实 训 教 学 20 ~ 36 学 时 序 号 课 程 教 学 内 容 理 论 教 学 实 训 教 学 1 数 据 库 应 用 技 术 基 础 4 2 SQL Server 2000 服 务 器 和 客 户 端 2 3 数 据 库 及 其 管 理 4 2 ~ 4 4 数 据 库 中 表 的 基 本 操 作 4 2 ~ 4 5 索 引 及 其 应 用 2 2 6 数 据 查 询 4 2 ~ 4 7 数 据 复 制 3 2 8 视 图 及 其 应 用 2 1 ~ 2 9 存 储 过 程 与 触 发 器 4 2 ~ 4 10 SQL Server 2000 中 的 程 序 设 计 4 2 ~ 4 11 数 据 转 换 服 务 2 1 ~ 2 12 安 全 性 管 理 2 1 ~ 2 13 备 份 与 恢 复 3 1 ~ 2 14 编 程 接 口 4 2 ~ 4 6. 考 核 方 式 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 采 用 作 业 (10 % ) 平 时 考 核 (10 % ) 课 程 设 计 (30 % ) 期 末 考 试 (50 % ) 综 合 评 定 学 生 成 绩 7. 教 材 与 参 考 资 料 书 名 出 版 社 作 者 精 通 SQL Server 2000 数 据 库 管 理 与 开 发 人 民 邮 电 出 版 社 于 松 涛, 徐 振 成 等 编 著 SQL Server 2000 中 文 版 完 全 实 践 中 国 铁 道 出 版 社 章 立 民 编 著 SQL Server 2000 应 用 程 序 与 开 发 人 民 邮 电 出 版 社 李 赫 雄, 许 宏 泰 等 编 著 数 据 库 应 用 基 础 高 等 教 育 出 版 社 蒋 文 蓉, 肖 满 生 主 编 数 据 库 技 术 新 进 展 清 华 大 学 出 版 社 李 昭 原 编 著 数 据 库 系 统 及 应 用 高 等 教 育 出 版 社 崔 巍 编 著
附 录 A 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 教 学 大 纲 375 续 表 书 名 出 版 社 作 者 数 据 库 应 用 程 序 开 发 高 等 教 育 出 版 社 宋 贤 斌, 王 庆 岭 主 编 SQL Server 2000 数 据 库 及 应 用 高 等 教 育 出 版 社 徐 人 凤, 曾 建 华 编 数 据 库 技 术 及 其 在 网 络 中 的 应 用 清 华 大 学 出 版 社 王 育 平, 于 丽 杰, 韩 晓 军 编 著 SQL Server 2000 中 文 版 入 门 与 提 高 清 华 大 学 出 版 社 周 绪, 管 丽 娜, 白 海 波 编 著 快 速 学 习 SQL Server 2000 中 文 版 中 国 铁 道 出 版 社 卫 海 编 著 SQL Server 2000 简 明 教 程 清 华 大 学 出 版 社 黄 维 通 编 著 数 据 库 应 用 技 术 中 国 水 利 水 电 出 版 社 李 存 斌 主 编 SQL Server 2000 数 据 库 管 理 与 开 发 人 民 邮 电 出 版 社 于 松 涛, 徐 振 成 编 著 SQL Server 2000 实 用 教 程 电 子 工 业 出 版 社 郑 阿 奇 主 编 SQL Server 数 据 库 管 理 设 计 与 实 现 教 程 清 华 大 学 出 版 社 赵 杰, 李 涛, 朱 慧 编 著 数 据 库 技 术 及 应 用 高 等 教 育 出 版 社 王 行 言, 汤 荷 美, 黄 维 通 编 著 8. 课 程 说 明 为 加 强 学 生 的 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 实 践, 在 计 算 机 设 备 和 学 期 课 时 允 许 的 条 件 下, 可 以 安 排 一 周 实 习 操 作 训 练 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 实 训 是 在 完 成 了 理 论 教 学 和 课 内 实 训 之 后 安 排 的 实 践 训 练, 实 训 需 要 学 完 第 14 章 (ODBC 和 ADO) 编 程 接 口 的 基 本 内 容, 它 是 通 过 管 理 信 息 系 统 的 实 例 将 数 据 库 应 用 技 术 和 面 向 对 象 程 序 设 计 两 部 分 内 容 打 通 其 目 的 和 任 务 是 让 学 生 更 加 熟 练 地 掌 握 数 据 库 对 象 的 基 本 操 作 数 据 查 询 索 引 视 图 存 储 过 程 触 发 器 数 据 转 换 服 务 备 份 与 恢 复 等 内 容, 对 数 据 库 及 数 据 库 设 计 SQ L 语 言 的 运 用, 以 及 管 理 信 息 系 统 的 分 析 设 计 方 法 有 初 步 了 解, 对 管 理 信 息 系 统 项 目 的 组 织 策 划 资 源 管 理 团 队 精 神 也 有 一 定 的 认 识
附 录 B 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 实 训 大 纲 学 分 1 学 时 数 28 适 用 专 业 计 算 机 应 用 信 息 管 理 软 件 开 发 计 算 机 网 络 等 先 行 课 程 计 算 机 科 学 导 论 VB 或 C 语 言 程 序 设 计 后 续 课 程 Java VC Web 技 术 与 应 用 Power Builder 应 用 与 开 发 C++ Builder 6 PHP + My SQL 网 络 数 据 库 开 发 技 术 等 1. 实 训 课 程 性 质 和 任 务 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 实 训 是 在 完 成 了 理 论 教 学 和 课 内 实 训 之 后 安 排 的 综 合 实 训, 它 需 要 学 完 第 14 章 (ODBC 和 ADO) 编 程 接 口 的 基 本 内 容, 它 通 过 管 理 信 息 系 统 的 实 例 将 数 据 库 应 用 技 术 和 面 向 对 象 程 序 设 计 两 部 分 内 容 打 通 其 目 的 和 任 务 是 让 学 生 更 加 熟 练 地 掌 握 数 据 库 对 象 的 基 本 操 作 数 据 查 询 索 引 视 图 存 储 过 程 触 发 器 数 据 转 换 服 务 备 份 与 恢 复 等 内 容, 对 数 据 库 及 数 据 库 设 计 SQ L 语 言 的 运 用, 以 及 管 理 信 息 系 统 的 分 析 设 计 方 法 有 初 步 了 解, 对 管 理 信 息 系 统 项 目 的 组 织 策 划 资 源 管 理 团 队 精 神 也 有 一 定 的 认 识 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 实 训 任 务 主 要 按 照 面 向 对 象 程 序 设 计 和 数 据 库 应 用 技 术 两 门 课 程 的 教 学 内 容 来 进 行, 它 以 一 个 实 际 管 理 信 息 系 统 ( MIS) 的 开 发 过 程 为 背 景 来 实 施, 实 训 通 过 一 个 完 整 的 MIS 项 目 开 发, 提 高 学 生 的 应 用 开 发 能 力 及 实 际 编 程 能 力, 使 学 生 掌 握 数 据 库 系 统 的 基 本 概 念 原 理 和 应 用, 了 解 数 据 库 系 统 在 实 际 应 用 中 的 开 发 方 法 及 研 制 过 程, 为 今 后 从 事 管 理 信 息 系 统 的 研 究 开 发 应 用 提 供 必 要 的 知 识, 更 好 地 完 成 各 种 计 算 机 应 用 和 开 发 任 务 2. 实 训 基 本 要 求 实 训 采 用 分 组 方 式 进 行, 每 组 选 定 一 个 管 理 信 息 系 统 的 题 目, 组 内 可 以 进 行 讨 论, 互 相 学 习 提 高 每 个 组 员 具 体 做 一 个 模 块, 组 长 负 责 总 体 协 调 和 系 统 联 调 在 实 训 的 过 程 中, 要 求 组 长 带 领 组 员 深 入 现 有 系 统 进 行 深 入 调 查, 弄 清 用 户 需 求 同 时, 要 求 组 长 督 促 组 员 都 要 参 与 开 发 的 全 过 程, 并 鼓 励 组 员 选 择 MIS 系 统 中 除 基 本 功 能 外 的 其 他 功 能 或 者 使 用 特 别 方 法 实 现 的 功 能, 作 为 创 新 设 计 的 尝 试 每 个 题 目 功 能 都 可 以 参 见 附 录 部 分 的 人 事 管 理 系 统 功 能 模 块 图 实 训 要 求 将 前 台 的 桌 面 程 序 设 计 与 后 台 数 据 管 理 结 合 起 来, 完 成 管 理 信 息 系 统 的 项 目 内 容 的 设 计 编 程 以 及 调 试 运 行, 记 录 实 训 过 程 中 程 序 代 码 和 操 作 步 骤, 并 以 实 训 报 告 书 的 形 式 ( 包 括 体 会 和 收 获 ) 递 交 3. 实 训 教 学 条 件 (1) 先 行 已 开 设 可 视 化 程 序 设 计 课 程, 并 学 完 枟 SQ L Server 数 据 库 应 用 技 术 枠 第 14 章 (ODBC 和 ADO) 编 程 接 口 的 基 本 内 容
附 录 B 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 实 训 大 纲 377 (2) 具 备 客 户 机 / 服 务 器 模 式 的 网 络 实 验 室 作 为 学 生 实 训 操 作 的 场 地 (3) 网 络 实 验 室 要 求 有 专 用 服 务 器, 在 数 据 库 服 务 器 上 安 装 SQ L Server 2000 软 件, 在 应 用 客 户 机 上 安 装 Visual Basic 和 SQ L Server 管 理 端 4. 实 训 内 容 (1) 系 统 分 析 与 设 计 1 用 户 的 功 能 需 求 分 析, 要 深 入 到 用 户 和 现 有 的 实 际 系 统 中, 弄 清 楚 现 有 系 统 业 务 流 和 数 据 流 运 动 过 程 2 画 出 系 统 的 功 能 图 3 数 据 库 系 统 的 E 唱 R 图 需 求 分 析 时, 找 出 系 统 中 的 实 体 及 实 体 间 的 关 系, 定 义 实 体 的 必 要 属 性 类 型 域, 分 析 实 体 间 的 关 系, 码 及 外 码 ; 画 出 E 唱 R 图, 并 将 E 唱 R 关 系 图 按 转 换 规 则 转 换 成 关 系 模 式, 进 行 优 化 ; 同 时 实 现 关 系 及 关 系 间 的 数 据 的 有 效 性 及 完 整 性 约 束 (2) 管 理 信 息 系 统 的 开 发 与 调 试 1 数 据 库 的 建 立 : 建 立 各 种 数 据 库 表, 表 的 主 键 外 键 及 关 联 等 2 管 理 信 息 系 统 界 面 的 规 划 3 根 据 管 理 信 息 系 统 功 能 模 块 设 计, 查 询 要 方 便, 界 面 要 友 好 4 编 写 各 功 能 模 块 的 程 序 代 码 5 程 序 的 调 试 与 联 接 包 括 Visual Basic 程 序 的 调 试 方 法 函 数 事 件 的 调 用, 以 及 创 建 和 配 置 ODBC 数 据 源, 通 过 ODBC 或 使 用 ADO 访 问 数 据 库 (3) Visual Basic 应 用 程 序 的 内 容 1 熟 悉 Visual Basic 开 发 环 境 2 熟 悉 Visual Basic 程 序 设 计 语 言 的 语 法 过 程 函 数 内 置 对 象 的 使 用 3 掌 握 Visual Basic 控 件 的 使 用 4 掌 握 通 过 ODBC 或 ADO 访 问 数 据 库 的 方 法 5 熟 悉 数 据 库 管 理 器 数 据 控 件 远 程 数 据 控 件 以 及 数 据 访 问 对 象 等 工 具 5. 实 训 学 时 分 配 序 号 实 训 内 容 教 学 时 数 讲 课 实 验 合 计 1 管 理 信 息 系 统 需 求 分 析 数 据 库 的 设 计 与 优 化 1 4 5 2 应 用 程 序 界 面 的 规 划 系 统 的 设 计 1 4 5 3 编 写 Visual Basic 代 码 并 调 试 1 4 5 4 编 写 SQL 代 码 程 序 调 试 1 4 5 5 ODBC 或 ADO 数 据 库 连 接 和 程 序 联 调, 演 示 与 答 辩 2 6 8 合 计 6 22 28
378 SQL Server 数 据 库 应 用 技 术 6. 实 训 成 果 将 数 据 库 应 用 技 术 和 面 向 对 象 程 序 设 计 结 合 起 来 进 行 实 训, 可 以 使 学 生 从 系 统 的 需 求 分 析 开 始, 经 历 数 据 库 的 设 计 优 化, 到 功 能 规 划 窗 体 设 计 界 面 设 计 报 表 设 计 编 码 调 试 等 整 个 开 发 过 程, 使 学 生 对 MIS 整 个 开 发 过 程 有 一 个 较 全 面 的 认 识 提 高 学 生 的 知 识 综 合 应 用 能 力, 体 验 学 习 成 果, 激 发 学 生 后 续 课 程 学 习 兴 趣 成 果 形 式 包 括 实 训 报 告 书 开 发 的 管 理 信 息 系 统 源 代 码 以 及 使 用 说 明 文 档 其 中 实 训 报 告 书 应 说 明 具 体 数 据 库 设 计 调 试 运 行 输 出 结 果 操 作 步 骤 遇 到 的 关 键 问 题 及 解 决 办 法 实 训 启 示 与 感 想 等 7. 实 训 考 核 实 训 考 核 是 检 查 学 生 的 实 训 成 果, 检 测 学 生 对 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 知 识 的 理 解 程 度, 以 及 应 用 数 据 库 进 行 数 据 管 理 的 能 力 为 了 确 保 检 验 的 真 实 性, 实 训 结 束 前 要 进 行 答 辩 和 演 示, 并 将 实 训 报 告 书 管 理 信 息 系 统 源 代 码 和 使 用 说 明 文 档, 交 到 服 务 器 上 的 共 享 文 件 夹 中, 实 训 指 导 老 师 根 据 以 上 内 容 来 评 定 成 绩, 实 训 成 绩 参 考 下 列 公 式 计 算 实 训 成 绩 = 管 理 信 息 系 统 源 代 码 和 使 用 说 明 文 档 0.6 + 答 辩 和 演 示 0.2 + 实 训 报 告 书 0.2 8. 大 纲 说 明 (1) 实 训 是 在 课 堂 学 习 以 及 相 关 先 行 课 程 学 习 后 的 基 础 上 安 排 的 实 训, 要 求 学 生 已 具 备 一 定 的 程 序 设 计 和 业 务 流 程 的 应 用 基 础 (2) 实 训 内 容 要 求 以 一 个 管 理 信 息 系 统 ( 例 如, 学 生 成 绩 管 理 系 统 人 事 管 理 系 统 物 流 管 理 系 统 等 ) 为 题 材 进 行 实 际 开 发 才 有 意 义, 才 能 锻 炼 学 生 在 开 发 管 理 信 息 系 统 的 过 程 中 所 需 的 综 合 能 力 和 培 养 学 生 团 队 精 神 和 团 队 协 作 的 能 力 (3) 实 训 完 成 后, 必 须 测 试 系 统 功 能 和 书 写 实 训 报 告, 并 进 行 演 示 和 答 辩 9. 附 录 (1) 人 事 管 理 系 统 人 事 管 理 系 统 应 有 数 据 录 入 数 据 校 验 数 据 修 改 数 据 浏 览 各 种 模 糊 查 询 ; 可 以 选 择 增 加 打 印 功 能, 如 附 图 1 所 示 (2) 学 校 教 材 管 理 系 统 功 能 要 求 : 本 系 统 能 对 学 校 所 有 班 级 的 教 材 进 行 征 订, 对 教 材 的 入 库 出 库 进 行 管 理, 能 进 行 各 种 条 件 的 查 询 打 印, 还 应 具 有 教 材 库 存 预 警 机 制 ( 教 材 库 存 不 够 用 或 教 材 征 订 过 剩, 都 能 给 予 提 示 ) 基 本 要 求 : 学 生 可 以 首 先 到 学 校 教 材 科 进 行 需 求 调 查, 然 后 画 出 教 材 管 理 系 统 数 据 流 图 功 能 流 程 图 数 据 库 的 设 计 再 进 行 程 序 设 计 调 试, 以 达 到 本 系 统 的 功 能 要 求 (3) 高 校 学 生 成 绩 管 理 系 统 功 能 要 求 : 学 生 成 绩 管 理 是 教 学 管 理 的 一 个 重 要 环 节, 本 系 统 能 够 进 行 学 生 成 绩 登 记 成 绩 的 更 正 成 绩 的 查 询 成 绩 的 汇 总 及 排 序, 对 已 毕 业 学 生 成 绩 能 存 入 历 史 库 中, 对 于 保 存 一 定 年 限 的 成 绩 能 进 行 清 除 要 求 有 良 好 的 界 面, 具 有 良 好 实 用 性
附 录 B 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 实 训 大 纲 379 附 图 1 基 本 要 求 : 学 生 可 以 先 到 所 在 的 系 与 有 关 老 师 联 系, 进 行 需 求 调 查, 然 后 画 出 成 绩 管 理 系 统 数 据 流 图, 功 能 流 程 图, 数 据 库 的 设 计 再 进 行 程 序 设 计 调 试, 以 达 到 本 系 统 的 功 能 要 求
参 考 文 献 1 蒋 文 蓉, 肖 满 生 主 编. 数 据 库 应 用 基 础. 北 京 : 高 等 教 育 出 版 社,2004 2 宋 贤 斌, 王 庆 岭 主 编. 数 据 库 应 用 程 序 开 发. 北 京 : 高 等 教 育 出 版 社,2004 3 徐 人 凤, 曾 建 华 编. SQL Server 2000 数 据 库 及 应 用. 北 京 : 高 等 教 育 出 版 社,2004 4 王 育 平, 于 丽 杰, 韩 晓 军 编 著. 数 据 库 技 术 及 其 在 网 络 中 的 应 用. 北 京 : 清 华 大 学 出 版 社,2004 5 Silberschatz 等 著, 杨 冬 青 等 译. 数 据 库 系 统 概 念 化. 北 京 : 机 械 工 业 出 版 社,2003 6 Abraham Silberschatz,Henry F. Korth,S. Sudarshan 著, 杨 冬 青, 唐 世 渭 等 译. 数 据 库 系 统 概 念. 北 京 : 机 械 工 业 出 版 社.2000 7 崔 巍 编 著. 数 据 库 系 统 及 应 用. 北 京 : 高 等 教 育 出 版 社,1999 8 Hector Garcia 唱 Molina,Jeffrey D. Ullman,Jennifer Widom 著, 杨 冬 青, 唐 世 渭, 徐 其 钧 等 译. 数 据 库 系 统 实 现. 北 京 : 机 械 工 业 出 版 社,2001 9 萨 师 煊, 王 珊 编 著. 数 据 库 系 统 概 论 ( 第 3 版 ). 北 京 : 高 等 教 育 出 版 社,2001 10 周 绪, 管 丽 娜, 白 海 波 编 著. SQL Server 2000 中 文 版 入 门 与 提 高. 北 京 : 清 华 大 学 出 版 社,2001 11 卫 海 编 著. 快 速 学 习 SQL Server 2000 中 文 版. 北 京 : 中 国 铁 道 出 版 社,2001 12 黄 维 通 编 著. SQL Server 2000 简 明 教 程. 北 京 : 清 华 大 学 出 版 社,2002 13 李 存 斌 主 编. 数 据 库 应 用 技 术. 北 京 : 中 国 水 利 水 电 出 版 社,2001 14 于 松 涛, 徐 振 成 编 著. SQL Server 2000 数 据 库 管 理 与 开 发. 北 京 : 人 民 邮 电 出 版 社,2001 15 郑 阿 奇 主 编. SQL Server 2000 实 用 教 程. 北 京 : 电 子 工 业 出 版 社,2002 16 章 立 民 主 编. SQL Server 2000 中 文 版 完 全 实 战. 北 京 : 中 国 铁 道 出 版 社,2001 17 王 行 言, 汤 荷 美, 黄 维 通 编 著. 数 据 库 技 术 及 应 用. 北 京 : 高 等 教 育 出 版 社,2004 18 赵 杰, 李 涛, 朱 慧 编 著. SQL Server 数 据 库 管 理 设 计 与 实 现 教 程. 北 京 : 清 华 大 学 出 版 社,2004