WQ.s92
|
|
|
- 尾 范
- 9 years ago
- Views:
Transcription
1 21 世 纪 高 职 高 专 规 划 教 材 网 络 专 业 系 列 SQL Server 数 据 库 应 用 技 术 张 蒲 生 何 升 编 著 清 华 大 学 出 版 社 北 京
2 内 容 简 介 本 书 根 据 高 等 职 业 技 术 教 育 和 教 学 特 点, 结 合 教 学 改 革 和 应 用 实 践 编 写 而 成 在 介 绍 SQL Server 数 据 库 基 本 内 容 的 同 时, 通 过 学 生 管 理 系 统 开 发 的 实 例 将 数 据 库 基 本 原 理 和 应 用 技 术 整 合 内 容 包 括 : 数 据 库 应 用 技 术 基 础 SQL Server 2000 服 务 器 和 客 户 端 的 操 作 数 据 库 及 其 管 理 数 据 库 对 象 的 基 本 操 作 数 据 查 询 索 引 视 图 复 制 存 储 过 程 触 发 器 程 序 设 计 数 据 转 换 服 务 安 全 性 管 理 备 份 与 恢 复 ODBC 和 ADO 编 程 接 口 等 本 书 内 容 广 泛 翔 实, 适 用 对 象 广 且 实 用 性 强, 既 可 作 为 高 职 高 专 学 生 数 据 库 课 程 的 教 材, 又 可 作 为 相 关 专 业 和 使 用 SQL Server 进 行 应 用 开 发 的 人 员 的 参 考 资 料 或 培 训 教 材 版 权 所 有, 翻 印 必 究 举 报 电 话 :010 唱 本 书 封 面 贴 有 清 华 大 学 出 版 社 防 伪 标 签, 无 标 签 者 不 得 销 售 本 书 防 伪 标 签 采 用 特 殊 防 伪 技 术, 用 户 可 通 过 在 图 案 表 面 涂 抹 清 水, 图 案 消 失, 水 干 后 图 案 复 现 ; 或 将 表 面 膜 揭 下, 放 在 白 纸 上 用 彩 笔 涂 抹, 图 案 在 白 纸 上 再 现 的 方 法 识 别 真 伪 图 书 在 版 编 目 (CIP) 数 据 SQL Server 数 据 库 应 用 技 术 / 张 蒲 生, 何 升 编 著. 北 京 : 清 华 大 学 出 版 社, (21 世 纪 高 职 高 专 规 划 教 材. 网 络 专 业 系 列 ) ISBN 7 唱 302 唱 唱 8 Ⅰ.S Ⅱ. 1 张 2 何 Ⅲ. 关 系 数 据 库 - 数 据 库 管 理 系 统,SQL Server - 高 等 学 校 : 技 术 学 校 - 教 材 Ⅳ. TP 中 国 版 本 图 书 馆 CIP 数 据 核 字 (2005) 第 号 出 版 者 : 清 华 大 学 出 版 社 地 址 : 北 京 清 华 大 学 学 研 大 厦 http :// 邮 编 : 社 总 机 :010 唱 客 户 服 务 :010 唱 责 任 编 辑 : 曾 妍 印 刷 者 : 北 京 市 清 华 园 胶 印 厂 装 订 者 : 三 河 市 金 元 装 订 厂 发 行 者 : 新 华 书 店 总 店 北 京 发 行 所 开 本 : 印 张 :24.75 字 数 :567 千 字 版 次 :2005 年 8 月 第 1 版 2005 年 8 月 第 1 次 印 刷 书 号 :ISBN 7 唱 302 唱 唱 8/TP 7434 印 数 :1 ~ 5000 定 价 :30.00 元
3 出 版 说 明 高 职 高 专 教 育 是 我 国 高 等 教 育 的 重 要 组 成 部 分, 担 负 着 为 国 家 培 养 并 输 送 生 产 建 设 管 理 服 务 第 一 线 高 素 质 技 术 应 用 型 人 才 的 重 任 进 入 21 世 纪 后, 高 职 高 专 教 育 的 改 革 和 发 展 呈 现 出 前 所 未 有 的 发 展 势 头, 学 生 规 模 已 占 我 国 高 等 教 育 的 半 壁 江 山, 成 为 我 国 高 等 教 育 的 一 支 重 要 的 生 力 军 ; 办 学 理 念 上, 以 就 业 为 导 向 成 为 高 等 职 业 教 育 改 革 与 发 展 的 主 旋 律 近 两 年 来, 教 育 部 召 开 了 三 次 产 学 研 交 流 会, 并 启 动 四 个 专 业 的 国 家 技 能 型 紧 缺 人 才 培 养 项 目, 同 时 成 立 了 35 所 示 范 性 软 件 职 业 技 术 学 院, 进 行 两 年 制 教 学 改 革 试 点 这 些 举 措 都 表 明 国 家 正 在 推 动 高 职 高 专 教 育 进 行 深 层 次 的 重 大 改 革, 向 培 养 生 产 服 务 第 一 线 真 正 需 要 的 应 用 型 人 才 的 方 向 发 展 为 了 顺 应 当 前 我 国 高 职 高 专 教 育 的 发 展 形 势, 配 合 高 职 高 专 院 校 的 教 学 改 革 和 教 材 建 设, 进 一 步 提 高 我 国 高 职 高 专 教 育 教 材 质 量, 在 教 育 部 的 指 导 下, 清 华 大 学 出 版 社 组 织 出 版 21 世 纪 高 职 高 专 规 划 教 材 为 推 动 规 划 教 材 的 建 设, 清 华 大 学 出 版 社 组 织 并 成 立 高 职 高 专 教 育 教 材 编 审 委 员 会, 旨 在 对 清 华 版 的 全 国 性 高 职 高 专 教 材 及 教 材 选 题 进 行 评 审, 并 向 清 华 大 学 出 版 社 推 荐 各 院 校 办 学 特 色 鲜 明 内 容 质 量 优 秀 的 教 材 选 题 教 材 选 题 由 个 人 或 各 院 校 推 荐, 经 编 审 委 员 会 认 真 评 审, 最 后 由 清 华 大 学 出 版 社 出 版 编 审 委 员 会 的 成 员 皆 来 源 于 教 改 成 效 大 办 学 特 色 鲜 明 师 资 实 力 强 的 高 职 高 专 院 校 普 通 高 校 以 及 著 名 企 业, 教 材 的 编 写 者 和 审 定 者 都 是 从 事 高 职 高 专 教 育 第 一 线 的 骨 干 教 师 和 专 家 编 审 委 员 会 根 据 教 育 部 最 新 文 件 政 策, 规 划 教 材 体 系, 比 如 部 分 专 业 的 两 年 制 教 材 ; 以 就 业 为 导 向, 以 专 业 技 能 体 系 为 主, 突 出 人 才 培 养 的 实 践 性 应 用 性 的 原 则, 重 新 组 织 系 列 课 程 的 教 材 结 构, 整 合 课 程 体 系 ; 按 照 教 育 部 制 定 的 高 职 高 专 教 育 基 础 课 程 教 学 基 本 要 求, 教 材 的 基 础 理 论 以 必 要 够 用 为 度, 突 出 基 础 理 论 的 应 用 和 实 践 技 能 的 培 养 本 套 规 划 教 材 的 编 写 原 则 如 下 : (1) 根 据 岗 位 群 设 置 教 材 系 列, 并 成 立 系 列 教 材 编 审 委 员 会 ; (2) 由 编 审 委 员 会 规 划 教 材 评 审 教 材 ; (3) 重 点 课 程 进 行 立 体 化 建 设, 突 出 案 例 式 教 学 体 系, 加 强 实 训 教 材 的 出 版, 完 善 教 学 服 务 体 系 ; (4) 教 材 编 写 者 由 具 有 丰 富 教 学 经 验 和 多 年 实 践 经 历 的 教 师 共 同 组 成, 建 立 双 师 型 编 者 体 系
4 Ⅱ SQL Server 数 据 库 应 用 技 术 本 套 规 划 教 材 涵 盖 了 公 共 基 础 课 计 算 机 电 子 信 息 机 械 经 济 管 理 以 及 服 务 等 大 类 的 主 要 课 程, 包 括 专 业 基 础 课 和 专 业 主 干 课 目 前 已 经 规 划 的 教 材 系 列 名 称 如 下 : 公 共 基 础 课 公 共 基 础 课 系 列 计 算 机 类 计 算 机 基 础 教 育 系 列 计 算 机 专 业 基 础 系 列 计 算 机 应 用 系 列 网 络 专 业 系 列 软 件 专 业 系 列 电 子 商 务 专 业 系 列 电 子 信 息 类 电 子 信 息 基 础 系 列 微 电 子 技 术 系 列 通 信 技 术 系 列 电 气 自 动 化 应 用 电 子 技 术 系 列 机 械 类 机 械 基 础 系 列 机 械 设 计 与 制 造 专 业 系 列 数 控 技 术 系 列 模 具 设 计 与 制 造 系 列 经 济 管 理 类 经 济 管 理 基 础 系 列 市 场 营 销 系 列 财 务 会 计 系 列 企 业 管 理 系 列 物 流 管 理 系 列 财 政 金 融 系 列 服 务 类 旅 游 系 列 艺 术 设 计 系 列 本 套 规 划 教 材 的 系 列 名 称 根 据 学 科 基 础 和 岗 位 群 方 向 设 置, 为 各 高 职 高 专 院 校 提 供 自 助 餐 形 式 的 教 材 各 院 校 在 选 择 课 程 需 要 的 教 材 时, 专 业 课 程 可 以 根 据 岗 位 群 选 择 系 列 ; 专 业 基 础 课 程 可 以 根 据 学 科 方 向 选 择 各 类 的 基 础 课 系 列 例 如, 数 控 技 术 方 向 的 专 业 课 程 可 以 在 数 控 技 术 系 列 选 择 ; 数 控 技 术 专 业 需 要 的 基 础 课 程, 属 于 计 算 机 类 课 程 的 可 以 在 计 算 机 基 础 教 育 系 列 和 计 算 机 应 用 系 列 选 择, 属 于 机 械 类 课 程 的 可 以 在 机 械 基 础 系 列 选 择, 属 于 电 子 信 息 类 课 程 的 可 以 在 电 子 信 息 基 础 系 列 选 择 依 此 类 推 为 方 便 教 师 授 课 和 学 生 学 习, 清 华 大 学 出 版 社 正 在 建 设 本 套 教 材 的 教 学 服 务 体 系 本 套 教 材 先 期 选 择 重 点 课 程 和 专 业 主 干 课 程, 进 行 立 体 化 教 材 建 设 : 加 强 多 媒 体 教 学 课 件 或 电 子 教 案 素 材 库 学 习 盘 学 习 指 导 书 等 形 式 的 制 作 和 出 版, 开 发 网 络 课 程 学 校 在 选 用 教 材 时, 可 通 过 邮 件 或 电 话 与 我 们 联 系 获 取 相 关 服 务, 并 通 过 与 各 院 校 的 密 切 交 流, 使 其 日 臻 完 善 高 职 高 专 教 育 正 处 于 新 一 轮 改 革 时 期, 从 专 业 设 置 课 程 体 系 建 设 到 教 材 编 写, 依 然 是 新 课 题 希 望 各 高 职 高 专 院 校 在 教 学 实 践 中 积 极 提 出 意 见 和 建 议, 并 向 我 们 推 荐 优 秀 选 题 反 馈 意 见 请 发 送 到 E 唱 mail tup.tsinghua.edu.cn 清 华 大 学 出 版 社 将 对 已 出 版 的 教 材 不 断 地 修 订 完 善, 提 高 教 材 质 量, 完 善 教 材 服 务 体 系, 为 我 国 的 高 职 高 专 教 育 出 版 优 秀 的 高 质 量 的 教 材 高 职 高 专 教 育 教 材 编 审 委 员 会
5 前 言 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 语 言 本 书 第 章 和 附 录, 以 及 书 中 课 后 作 业 和 实 训 由 张 蒲 生 编 写 ; 第
6 Ⅳ SQL Server 数 据 库 应 用 技 术 章 由 何 升 编 写 ; 全 书 由 张 蒲 生 统 稿 在 本 书 编 写 过 程 中, 得 到 了 广 东 外 语 外 贸 大 学 信 息 学 院 的 大 力 支 持, 许 多 老 师 为 本 书 提 供 了 宝 贵 的 意 见, 在 此 向 他 们 表 示 衷 心 的 感 谢 由 于 编 者 水 平 所 限, 加 之 时 间 仓 促, 书 中 难 免 存 在 错 误 和 不 妥 之 处, 殷 切 期 望 广 大 读 者 给 予 指 正 作 者 2005 年 7 月 于 广 州
7 目 录 SQ L Server 数 据 库 应 用 技 术 第 1 章 数 据 库 技 术 基 础 数 据 管 理 的 概 述 数 据 数 据 管 理 与 数 据 处 理 数 据 管 理 的 发 展 数 据 库 数 据 库 管 理 系 统 和 数 据 库 系 统 数 据 模 型 数 据 模 型 的 三 要 素 概 念 模 型 数 据 模 型 的 分 类 数 据 库 设 计 需 求 分 析 阶 段 概 念 结 构 设 计 逻 辑 结 构 设 计 数 据 库 物 理 设 计 数 据 库 实 施 数 据 库 运 行 与 维 护 24 课 后 作 业 25 第 2 章 SQL Server 2000 服 务 器 和 客 户 端 SQ L Server 概 述 SQ L 的 特 点 SQ L Server 的 结 构 SQ L Server 的 数 据 库 文 件 SQ L Server 2000 的 服 务 器 组 件 SQ L Server 2000 服 务 器 端 的 操 作 启 动 SQ L Server 对 sa 账 号 加 入 密 码 SQ L Server 2000 配 置 36
8 Ⅵ SQL Server 数 据 库 应 用 技 术 2.4 SQ L Server 2000 的 客 户 端 组 件 SQ L Server 2000 客 户 端 的 操 作 38 实 训 41 课 后 作 业 44 第 3 章 数 据 库 及 其 管 理 系 统 数 据 库 master 数 据 库 model 数 据 库 msdb 数 据 库 tempdb 数 据 库 创 建 用 户 数 据 库 使 用 企 业 管 理 器 创 建 用 户 数 据 库 使 用 SQ L 查 询 分 析 器 创 建 用 户 数 据 库 事 务 日 志 查 看 数 据 库 信 息 管 理 数 据 库 打 开 数 据 库 增 加 和 缩 减 数 据 库 容 量 查 看 目 前 数 据 库 选 项 设 定 及 修 改 数 据 库 更 名 删 除 数 据 库 59 实 训 60 课 后 作 业 62 第 4 章 数 据 库 中 表 的 基 本 操 作 数 据 库 对 象 数 据 表 约 束 默 认 规 则 视 图 存 储 过 程 触 发 器 数 据 表 的 设 计 和 创 建 SQ L Server 中 的 数 据 类 型 数 据 表 设 计 与 创 建 修 改 表 结 构 82
9 目 录 Ⅶ 插 入 更 新 和 删 除 表 数 据 定 义 约 束 约 束 的 类 型 约 束 的 创 建 查 看 删 除 使 用 默 认 和 规 则 使 用 默 认 使 用 规 则 99 实 训 101 课 后 作 业 104 第 5 章 索 引 及 其 应 用 索 引 的 基 础 知 识 数 据 存 储 索 引 索 引 的 分 类 创 建 索 引 使 用 企 业 管 理 器 创 建 索 引 使 用 T ransact 唱 SQ L 创 建 索 引 索 引 的 分 析 与 维 护 索 引 统 计 创 建 和 修 改 统 计 信 息 统 计 信 息 的 查 看 与 删 除 查 看 与 删 除 索 引 查 看 表 中 的 索 引 索 引 更 名 与 删 除 123 实 训 125 课 后 作 业 126 第 6 章 SQL Server 的 数 据 查 询 SELEC T 语 句 中 的 数 学 问 题 SQ L Server 中 的 变 量 SQ L Server 的 运 算 符 SQ L Server 中 的 函 数 SELEC T 语 句 简 单 查 询 FRO M 子 句 与 IN T O 子 句 使 用 W HERE 子 句 设 置 查 询 条 件 查 询 结 果 排 序 及 ORDER BY 子 句 143
10 Ⅷ SQL Server 数 据 库 应 用 技 术 GRO U P BY 子 句 与 H A VING 子 句 CO M PU T E 子 句 连 接 查 询 连 接 概 述 内 连 接 外 连 接 交 叉 连 接 自 连 接 嵌 套 查 询 单 值 嵌 套 查 询 多 值 嵌 套 查 询 联 合 159 实 训 160 课 后 作 业 164 第 7 章 数 据 复 制 复 制 模 型 复 制 与 出 版 的 关 系 复 制 模 型 复 制 的 类 型 快 照 复 制 事 务 复 制 合 并 复 制 配 置 复 制 建 立 和 使 用 复 制 创 建 发 布 订 阅 创 建 强 制 订 阅 通 过 Internet 执 行 复 制 复 制 监 视 器 186 实 训 188 课 后 作 业 190 第 8 章 视 图 及 其 应 用 视 图 的 概 述 视 图 的 概 念 使 用 视 图 的 优 点 和 缺 点 视 图 的 创 建 193
11 目 录 Ⅸ 使 用 企 业 管 理 器 创 建 视 图 使 用 T ransact 唱 SQ L 创 建 视 图 使 用 创 建 视 图 向 导 程 序 视 图 定 义 的 查 询 与 修 改 查 看 和 修 改 视 图 定 义 视 图 的 删 除 通 过 视 图 查 询 与 更 新 数 据 通 过 视 图 查 询 数 据 通 过 视 图 更 新 数 据 208 实 训 209 课 后 作 业 210 第 9 章 存 储 过 程 与 触 发 器 存 储 过 程 概 述 什 么 是 存 储 过 程 存 储 过 程 类 型 存 储 过 程 的 好 处 创 建 和 执 行 存 储 过 程 创 建 和 执 行 不 带 参 数 的 存 储 过 程 创 建 和 执 行 带 参 数 的 存 储 过 程 修 改 和 删 除 存 储 过 程 查 看 存 储 过 程 修 改 存 储 过 程 删 除 存 储 过 程 触 发 器 的 创 建 和 管 理 触 发 器 概 述 触 发 器 的 创 建 管 理 触 发 器 233 实 训 236 课 后 作 业 239 第 10 章 SQL Server 的 程 序 设 计 批 处 理 与 流 程 控 制 批 处 理 流 程 控 制 事 务 处 理 事 务 概 述 事 务 管 理 247
12 Ⅹ SQL Server 数 据 库 应 用 技 术 事 务 模 式 事 务 日 志 锁 机 制 锁 的 控 制 方 法 查 看 锁 的 信 息 死 锁 游 标 游 标 的 定 义 及 其 优 点 使 用 游 标 游 标 示 例 257 实 训 258 课 后 作 业 261 第 11 章 数 据 转 换 服 务 导 入 / 导 出 概 述 导 入 数 据 导 入 Excel 工 作 表 导 入 文 本 文 件 导 出 数 据 导 出 数 据 至 Access 导 出 数 据 至 文 本 文 件 使 用 D T S 设 计 器 使 用 bcp 和 BU L K INSER T 批 复 制 程 序 BU LK INSER T 283 实 训 284 课 后 作 业 285 第 12 章 SQL Server 2000 的 安 全 管 理 SQ L Server 2000 的 安 全 认 证 模 式 身 份 验 证 权 限 认 证 创 建 和 管 理 安 全 账 户 创 建 安 全 账 户 管 理 安 全 账 户 删 除 登 录 和 用 户 管 理 数 据 库 用 户 和 角 色 服 务 器 角 色 298
13 目 录 Ⅺ 数 据 库 角 色 SQ L Server 权 限 管 理 使 用 企 业 管 理 器 管 理 权 限 使 用 T ransact 唱 SQ L 语 句 管 理 权 限 304 实 训 307 课 后 作 业 310 第 13 章 备 份 与 还 原 备 份 与 还 原 的 概 述 备 份 与 还 原 概 念 备 份 与 还 原 方 式 数 据 库 的 备 份 备 份 设 备 使 用 企 业 管 理 器 进 行 备 份 使 用 向 导 进 行 备 份 使 用 查 询 分 析 器 进 行 备 份 数 据 库 的 还 原 使 用 企 业 管 理 器 还 原 数 据 库 使 用 查 询 分 析 器 还 原 数 据 库 326 实 训 330 课 后 作 业 332 第 14 章 SQL Server 编 程 接 口 通 过 ODBC 访 问 SQ L Server 数 据 库 ODBC 的 概 述 通 过 Excel 访 问 SQ L Server 数 据 库 通 过 Visual Basic 访 问 SQ L Server 数 据 库 通 过 PowerBuilder 访 问 SQ L Server 数 据 库 使 用 ADO 操 作 数 据 库 中 的 数 据 ActiveX 数 据 对 象 (ADO) 在 Visual Basic 中 用 ADO 访 问 数 据 库 在 C++ Builder 中 用 ADO 访 问 数 据 库 363 实 训 368 课 后 作 业 368 附 录 A 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 教 学 大 纲 373 附 录 B 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 实 训 大 纲 376 参 考 文 献 380
14 第 1 章 数 据 库 技 术 基 础 数 据 库 是 数 据 管 理 的 实 用 技 术, 是 计 算 机 技 术 的 重 要 分 支, 它 的 出 现 极 大 地 促 进 了 计 算 机 应 用 向 各 行 各 业 的 渗 透 本 章 将 介 绍 数 据 库 技 术 的 有 关 基 本 概 念 特 点, 各 种 数 据 模 型, 数 据 库 系 统 的 构 成 等 知 识, 这 些 内 容 将 为 后 续 数 据 库 技 术 的 学 习 起 到 指 导 性 的 作 用 1.1 数 据 管 理 的 概 述 数 据 数 据 管 理 与 数 据 处 理 1. 数 据 数 据 (Data) 是 描 述 事 物 的 符 号 记 录 除 了 常 用 的 数 字 数 据 外, 文 字 ( 如 名 称 ) 图 形 图 像 声 音 等 信 息, 也 都 是 数 据 日 常 生 活 中, 人 们 为 了 交 流, 会 直 接 用 自 然 语 言 ( 如 汉 语 ) 去 描 述 事 物 在 计 算 机 中, 为 了 存 储 和 处 理 这 些 事 物, 就 要 抽 出 对 这 些 事 物 感 兴 趣 的 特 征 组 成 一 个 记 录 来 描 述 例 如, 在 学 生 档 案 中, 可 以 对 学 生 的 学 号 姓 名 性 别 出 生 年 月 家 庭 住 址 电 话 邮 编 和 入 学 成 绩 等 情 况 这 样 描 述 : , 聂 晓 明, 男,1987 唱 8 唱 23, 广 州 市 海 珠 区,020 唱 ,510310,604 数 据 与 其 语 义 是 不 可 分 的 对 于 上 面 一 条 学 生 记 录, 了 解 其 语 义 的 人 会 得 到 如 下 信 息 : 聂 晓 明 是 一 个 学 生, 学 号 为 ,1987 年 8 月 23 日 出 生, 家 庭 住 址 是 广 州 市 海 珠 区, 电 话 是 020 唱 , 邮 编 是 , 入 学 成 绩 是 604 分 ; 而 不 了 解 其 语 义 的 人 则 无 法 理 解 其 含 义 可 见, 数 据 的 形 式 本 身 并 不 能 完 全 表 达 其 内 容, 需 要 经 过 语 义 解 释 2. 数 据 管 理 与 数 据 处 理 现 实 世 界 中 的 事 物 反 映 到 人 们 的 头 脑 里, 经 过 认 识 选 择 命 名 等 综 合 分 析 而 形 成 了 印 象 和 概 念, 产 生 认 识, 这 就 是 信 息, 即 进 入 信 息 世 界 在 信 息 世 界 里, 有 些 信 息 可 以 直 接 用 数 据 表 示, 如 学 生 学 号 出 生 日 期 成 绩 等 ; 有 些 是 由 符 号 文 字 或 其 他 形 式 来 表 示 的 在 计 算 机 中, 所 有 的 信 息 只 能 用 二 进 制 数 表 示, 一 切 信 息 进 入 计 算 机 时, 必 须 是 数 据 化 的 信 息 是 维 持 生 产 活 动 经 济 活 动 和 社 会 活 动 必 不 可 少 的 资 源 ; 数 据 是 将 现 实 世 界 中 的 各 种 信 息 记 录 下 来 可 识 别 的 符 号, 它 用 类 型 和 数 值 来 表 示 数 据 的 表 现 形 式 是 多 种 多 样 的, 例 如 : 文 字 图 形 图 像 声 音 学 生 的 档 案 记 录 商 品 的 销 售 账 目 货 物 的 运 输 情 况 等, 这 些 都 是 数 据 数 据 的 形 式 本 身 并 不 能 完 全 表 达 其 内 容, 它 需 要 经 过 语 义 解 释 数 据 与
15 2 SQL Server 数 据 库 应 用 技 术 其 语 义 是 不 可 分 的 ; 并 不 是 所 有 的 数 据 都 是 信 息, 信 息 是 一 种 已 经 被 加 工 为 特 定 形 式 的 数 据, 这 种 数 据 形 式 对 接 收 者 来 说 是 有 意 义 的 即 只 有 有 价 值 的 数 据 才 是 信 息 数 据 处 理 是 指 从 某 些 已 知 的 数 据 出 发, 推 导 加 工 出 一 些 新 的 数 据, 这 些 新 的 数 据 又 表 示 了 新 的 信 息 在 具 体 操 作 中, 涉 及 数 据 收 集 管 理 加 工 和 输 出 等 过 程 数 据 处 理 是 用 计 算 机 对 数 据 进 行 处 理 的 系 统 应 用 它 是 一 个 由 人 计 算 机 等 组 成 的 能 进 行 信 息 的 收 集 传 递 存 储 加 工 维 护 分 析 计 划 控 制 决 策 和 使 用 的 系 统, 这 些 基 本 操 作 环 节 称 为 数 据 管 理 数 据 管 理 技 术 是 解 决 上 述 基 本 环 节 的, 而 其 他 环 节 ( 加 工 / 计 算 输 出 等 操 作 ) 是 由 应 用 程 序 实 现 的, 所 以 数 据 库 是 管 理 信 息 系 统 (Management Information System,MIS) 的 核 心 在 数 据 处 理 中, 通 常 数 据 的 计 算 比 较 简 单, 而 数 据 的 管 理 比 较 复 杂 数 据 管 理 是 指 数 据 的 收 集 整 理 组 织 存 储 和 检 索 等 操 作, 这 部 分 操 作 是 数 据 处 理 业 务 的 基 本 环 节, 是 任 何 数 据 处 理 业 务 中 必 不 可 少 的 共 有 部 分, 因 此 有 必 要 学 习 和 掌 握 数 据 管 理 的 技 术, 对 数 据 处 理 提 供 有 利 的 支 持 数 据 管 理 的 发 展 数 据 管 理 是 数 据 库 的 核 心 任 务, 内 容 包 括 对 数 据 的 分 类 组 织 编 码 储 存 检 索 和 维 护 随 着 计 算 机 硬 件 和 软 件 的 发 展, 数 据 库 技 术 也 不 断 地 发 展 从 数 据 管 理 方 式 的 角 度 看, 数 据 管 理 到 目 前 共 经 历 了 人 工 管 理 阶 段 文 件 系 统 阶 段 和 数 据 库 系 统 阶 段 1. 人 工 管 理 阶 段 人 工 管 理 阶 段 大 约 在 20 世 纪 50 年 代 中 期 以 前, 那 时 由 于 计 算 机 技 术 相 对 落 后, 硬 件 主 要 是 磁 带 卡 片 纸 带, 没 有 磁 盘, 而 计 算 机 是 很 昂 贵 的 资 源, 主 要 用 于 科 学 计 算 ; 软 件 方 面 也 没 有 操 作 系 统 ( 更 没 有 管 理 数 据 的 软 件 ), 数 据 不 能 保 存, 编 写 程 序 时 要 安 排 数 据 的 物 理 存 储, 数 据 是 面 向 程 序 的, 一 个 程 序 对 应 一 些 数 据 如 图 1 唱 1 所 示 图 1 唱 1 人 工 处 理 阶 段 数 据 管 理 示 意 图 这 个 时 期 数 据 管 理 的 特 点 是 : (1) 数 据 不 保 存 该 时 期 的 计 算 机 主 要 应 用 于 科 学 计 算, 一 般 不 需 要 将 数 据 长 期 保 存, 只 是 在 计 算 某 一 课 题 时 将 数 据 输 入, 用 完 后 不 保 存 原 始 数 据, 也 不 保 存 计 算 结 果 (2) 没 有 对 数 据 进 行 管 理 的 软 件 系 统 程 序 员 不 仅 要 规 定 数 据 的 逻 辑 结 构, 而 且 还 要 在 程 序 中 设 计 物 理 结 构, 包 括 存 储 结 构 存 取 方 法 输 入 输 出 方 式 等 因 此 程 序 中 存 取 数 据 的 子 程 序 随 着 存 储 的 改 变 而 改 变, 数 据 与 程 序 不 具 有 一 致 性 (3) 没 有 文 件 的 概 念 数 据 的 组 织 方 式 必 须 由 程 序 员 自 行 设 计 (4) 一 组 数 据 对 应 于 一 个 程 序, 数 据 是 面 向 应 用 的 即 使 两 个 程 序 用 到 相 同 的 数 据,
16 第 1 章 数 据 库 技 术 基 础 3 也 必 须 各 自 定 义 各 自 组 织, 数 据 无 法 共 享, 无 法 相 互 利 用 和 互 相 参 照, 从 而 导 致 程 序 和 程 序 之 间 有 大 量 重 复 的 数 据 2. 文 件 系 统 阶 段 文 件 系 统 阶 段 是 指 计 算 机 不 仅 用 于 科 学 计 算, 而 且 还 大 量 用 于 管 理 数 据 的 阶 段 ( 从 20 世 纪 50 年 代 后 期 到 60 年 代 中 期 ) 在 硬 件 方 面, 外 存 储 器 有 了 磁 盘 磁 鼓 等 直 接 存 取 的 存 储 设 备 在 软 件 方 面, 操 作 系 统 中 已 经 有 了 专 门 用 于 管 理 数 据 的 软 件, 称 为 文 件 系 统 在 处 理 方 式 上, 不 仅 有 了 文 件 批 处 理, 而 且 能 够 联 机 实 时 处 理 这 个 时 期 数 据 管 理 的 特 点 是 : (1) 数 据 需 要 长 期 保 存 在 外 存 上 供 反 复 使 用 由 于 计 算 机 大 量 用 于 数 据 处 理, 经 常 对 文 件 进 行 查 询 修 改 插 入 和 删 除 等 操 作, 所 以 数 据 需 要 长 期 保 留, 以 便 于 反 复 操 作 (2) 程 序 之 间 有 了 一 定 的 独 立 性 操 作 系 统 提 供 了 文 件 管 理 功 能 和 访 问 文 件 的 存 取 方 法, 程 序 和 数 据 之 间 有 了 数 据 存 取 的 接 口, 程 序 可 以 通 过 文 件 名 和 数 据 打 交 道, 不 必 再 寻 找 数 据 的 物 理 存 放 位 置 至 此, 数 据 有 了 物 理 结 构 和 逻 辑 结 构 的 区 别, 但 此 时 程 序 和 数 据 之 间 的 独 立 性 尚 不 充 分 (3) 文 件 的 形 式 已 经 多 样 化 由 于 已 经 有 了 直 接 存 取 的 存 储 设 备, 文 件 也 就 不 再 局 限 于 顺 序 文 件, 还 有 了 索 引 文 件 链 表 文 件 等 因 而, 对 文 件 的 访 问 可 以 是 顺 序 访 问, 也 可 以 是 直 接 访 问 (4) 数 据 的 存 取 基 本 上 以 记 录 为 单 位 文 件 系 统 阶 段 程 序 和 数 据 之 间 的 关 系 如 图 1 唱 2 所 示 由 图 1 唱 2 可 以 看 出, 文 件 系 统 中 的 数 据 和 程 序 虽 然 具 有 了 一 定 的 独 立 性, 但 还 很 不 充 分, 每 个 文 件 仍 然 对 应 于 一 个 应 用 程 序, 数 据 还 是 面 向 应 用 的 要 想 对 现 有 的 数 据 再 增 加 一 些 新 的 应 用 是 很 困 难 的, 系 统 不 易 扩 充 一 旦 数 据 的 逻 辑 结 构 改 变, 必 须 修 改 应 用 程 序 并 且, 各 个 文 件 之 间 是 孤 立 的, 不 能 反 映 现 实 世 界 事 物 之 间 的 内 在 联 系, 各 个 不 同 应 用 程 序 之 间 也 不 能 共 享 相 同 的 数 据, 从 而 造 成 数 据 冗 余 度 大, 并 容 易 产 生 相 同 数 据 的 不 一 致 性 图 1 唱 2 文 件 系 统 阶 段 数 据 管 理 示 意 图 3. 数 据 库 系 统 阶 段 到 20 世 纪 60 年 代 后 期, 数 据 管 理 规 模 更 为 庞 大, 应 用 更 广 泛, 数 据 量 剧 增, 共 享 要 求 ( 多 种 应 用 多 种 语 言 互 相 覆 盖 地 共 享 数 据 集 合 ) 更 高, 在 硬 件 方 面 有 了 大 容 量 和 快 速 存 取 磁 盘 于 是 出 现 了 数 据 库 系 统, 它 的 指 导 思 想 是 : 对 所 有 的 数 据 实 行 统 一 的 集 中 的 和 独 立 的 管 理, 使 数 据 存 储 独 立 于 使 用 数 据 的 程 序, 实 现 数 据 共 享 如 图 1 唱 3 所 示 数 据 库 系 统 阶 段 有 如 下 特 点 :
17 4 SQL Server 数 据 库 应 用 技 术 图 1 唱 3 数 据 库 管 理 阶 段 数 据 管 理 示 意 图 (1) 数 据 共 享 共 享 是 指 多 用 户 多 种 应 用 多 种 语 言 互 相 覆 盖 地 共 享 数 据 集 合 数 据 库 系 统 阶 段 可 以 实 现 文 件 级 记 录 级 数 据 项 级 的 数 据 共 享 (2) 面 向 全 组 织 的 数 据 结 构 化 按 照 某 种 数 据 模 型, 将 整 个 组 织 的 全 部 数 据 组 织 成 一 个 结 构 化 的 数 据 整 体 而 文 件 系 统 是 一 个 无 结 构 的 数 据 集 合, 文 件 之 间 是 孤 立 的, 不 能 反 映 事 物 之 间 的 联 系, 数 据 面 向 专 用, 没 有 弹 性, 不 宜 扩 充 (3) 数 据 独 立 性 数 据 库 系 统 阶 段 的 数 据 具 有 物 理 独 立 性 逻 辑 独 立 性, 而 且 具 有 较 高 的 数 据 和 程 序 的 独 立 性, 将 数 据 描 述 定 义 从 应 用 程 序 中 分 离 出 来, 独 立 于 应 用 程 序 而 存 在, 且 相 互 独 立, 互 不 依 赖 (4) 可 控 数 据 冗 余 度 数 据 库 系 统 阶 段 的 数 据 存 储 不 必 重 复 存 储, 从 而 节 省 存 储 空 间, 保 证 数 据 的 一 致 性 ; 在 理 论 上 数 据 存 储 可 以 做 到 冗 余 度 为 零, 还 可 以 有 意 安 排 若 干 冗 余, 由 用 户 控 制, 称 为 可 控 冗 余 度 (5) 统 一 数 据 控 制 功 能 共 享 一 般 是 并 发 的, 当 多 个 用 户 同 时 使 用 数 据 库 时, 数 据 库 系 统 提 供 如 下 控 制 功 能 : 数 据 安 全 控 制 ; 数 据 完 整 性 控 制 ( 正 确 性 有 效 性 相 容 性 ) ; 并 发 控 制 ; 数 据 恢 复 数 据 库 数 据 库 管 理 系 统 和 数 据 库 系 统 1. 数 据 库 所 谓 数 据 库 (Database,DB), 是 将 数 据 按 一 定 的 数 据 模 型 组 织 描 述 和 储 存, 具 有 较 小 的 冗 余 度, 较 高 的 数 据 独 立 性 和 易 扩 展 性, 并 可 为 各 种 用 户 共 享 的 数 据 集 合 通 常, 收 集 并 抽 取 一 个 应 用 所 需 要 的 大 量 数 据 之 后, 应 该 将 其 保 存 起 来 以 供 进 一 步 加 工 处 理 和 抽 取 有 用 信 息 保 存 方 法 有 多 种, 尤 其 以 保 存 在 数 据 库 中 最 佳 因 为 它 们 一 般 由 相 互 关 联 的 数 据 表 组 成, 能 使 数 据 冗 余 度 尽 可 能 地 小 数 据 表 由 一 些 列 构 成, 列 主 要 用 来 存 储 在 数 据 表 中 的 相 同 数 据 类 型 的 一 系 列 值 2. 数 据 库 管 理 系 统 数 据 库 管 理 系 统 对 收 集 到 的 大 量 数 据 进 行 整 理 加 工 归 并 分 类 计 算 存 储 等 处 理, 产 生 新 的 数 据, 以 便 反 映 事 物 或 现 象 的 本 质 和 特 征 及 其 内 在 联 系 例 如 : 在 微 波 炉 生 产
18 第 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 其 职 能 是 对 数 据 库 进 行 日 常 的 管 理, 负 责 全 面 管 理 和 控 制 数 据 库 系 统 数 据 库 管 理 员 的 素 质 在 一 定 程 度 上 决 定 了 数 据 库 应 用 的 水 平, 所 以 他 们 是 数 据 库 系 统 中 最 重 要
19 6 SQL Server 数 据 库 应 用 技 术 的 人 员 数 据 库 管 理 员 的 主 要 职 责 包 括 : 设 计 与 定 义 数 据 库 系 统 ; 帮 助 最 终 用 户 使 用 数 据 库 系 统 ; 监 督 与 控 制 数 据 库 系 统 的 使 用 和 运 行 ; 改 进 和 重 组 数 据 库 系 统, 优 化 数 据 库 系 统 的 性 能 ; 备 份 与 恢 复 数 据 库 ; 当 用 户 的 应 用 需 求 增 加 或 改 变 时,DBA 需 要 对 数 据 库 进 行 较 大 的 改 造, 即 重 新 构 造 数 据 库 1.2 数 据 模 型 现 实 世 界 中, 个 体 间 总 存 在 着 某 些 联 系, 反 映 到 信 息 世 界 中, 是 实 体 间 的 联 系, 由 此 构 成 实 体 模 型 ; 反 映 到 数 据 库 系 统 中, 是 记 录 间 的 联 系, 将 实 体 模 型 数 据 化, 转 化 成 数 据 模 型 如 图 1 唱 5 所 示 在 数 据 库 中 用 数 据 模 型 (Data M odel) 这 个 工 具 来 抽 象 表 示 和 处 理 现 实 世 界 中 的 数 据 和 信 息 通 俗 地 讲 数 据 模 型 就 是 现 实 世 界 的 模 拟 根 据 应 用 目 的, 模 型 分 为 两 个 层 次 : 1 概 念 模 型 ( 信 息 模 型 ) : 从 用 户 角 度 看 到 的 模 型, 是 第 一 层 抽 象 要 求 概 念 简 单, 表 达 清 晰, 易 于 理 解 2 数 据 模 型 : 从 计 算 机 角 度 看 到 的 模 型 要 求 用 有 严 格 语 法 和 语 义 的 语 言 对 数 据 进 行 严 格 的 形 式 化 定 义 限 制 和 规 图 1 唱 5 对 象 的 抽 象 过 程 定, 使 模 型 能 转 变 为 计 算 机 可 以 理 解 的 格 式 主 要 包 括 网 状 模 型 层 次 模 型 关 系 模 型 等 数 据 模 型 的 三 要 素 数 据 模 型 是 严 格 定 义 的 概 念 的 集 合, 这 些 概 念 精 确 地 描 述 系 统 的 静 态 特 性 动 态 特 性 和 完 整 性 约 束 条 件 1. 数 据 结 构 数 据 结 构 用 于 描 述 系 统 的 静 态 特 性 数 据 结 构 是 所 研 究 的 对 象 类 型 (Object T ype) 的 集 合 这 些 对 象 是 数 据 库 的 组 成 成 分, 它 们 包 括 两 类, 一 类 是 与 数 据 类 型 内 容 性 质 有 关 的 对 象, 例 如 关 系 模 型 中 的 域 属 性 关 系 等 ; 一 类 是 与 数 据 之 间 联 系 有 关 的 对 象, 例 如 关 系 模 型 中 的 关 系 数 据 结 构 是 刻 画 一 个 数 据 模 型 性 质 最 重 要 的 方 面 因 此 在 数 据 库 系 统 中, 人 们 通 常 按 照 其 数 据 结 构 的 类 型 来 命 名 数 据 模 型 例 如, 层 次 结 构 网 状 结 构 和 关 系 结 构 的 数 据 模 型 分 别 命 名 为 层 次 模 型 网 状 模 型 和 关 系 模 型 2. 数 据 操 作 数 据 操 作 用 于 描 述 系 统 的 动 态 特 性 数 据 操 作 是 指 对 数 据 库 中 各 种 对 象 执 行 允 许 操 作 的 集 合, 包 括 操 作 和 相 关 的 操 作 规 则 操 作 分 为 检 索 和 更 新 ( 删 除 插 入 更 改 ), 对 数 据 模 型 来 说, 要 求 定 义 这 些 操 作 的 确 切 含 义 操 作 符 号 操 作 规 则 ( 如 优 先 级 别 ) 以 及 实 现 操 作 的 语 言 3. 数 据 的 约 束 条 件 数 据 的 约 束 条 件 即 一 组 完 整 性 规 则 的 集 合 完 整 性 规 则 是 给 定 的 数 据 模 型 中 数 据 及
20 第 1 章 数 据 库 技 术 基 础 7 其 联 系 所 具 有 的 制 约 和 存 储 规 则, 用 以 限 定 符 合 数 据 模 型 的 数 据 库 状 态 以 及 状 态 的 变 化, 以 保 证 数 据 的 正 确 有 效 和 兼 容 数 据 模 型 应 该 反 映 和 规 定 本 数 据 模 型 必 须 遵 守 完 整 性 约 束 条 件 例 如, 在 关 系 模 型 中, 任 何 关 系 必 须 满 足 实 体 完 整 性 和 参 照 完 整 性 两 个 条 件 此 外, 数 据 模 型 还 应 该 提 供 定 义 完 整 性 约 束 条 件 的 机 制, 以 反 映 具 体 应 用 所 涉 及 的 数 据 必 须 遵 守 的 特 定 的 语 义 约 束 条 件 概 念 模 型 数 据 模 型 是 数 据 库 系 统 的 核 心 和 基 础 各 种 机 器 上 实 现 的 DBM S 软 件 都 是 基 于 某 种 数 据 模 型 的 为 了 把 现 实 世 界 中 的 具 体 事 物 抽 象 组 织 为 某 一 DBM S 支 持 的 数 据 模 型, 人 们 常 常 首 先 将 现 实 世 界 抽 象 为 信 息 世 界, 然 后 将 信 息 世 界 转 换 为 机 器 世 界 也 就 是 说, 首 先 把 现 实 世 界 中 的 客 观 对 象 抽 象 为 某 一 种 信 息 结 构, 这 种 信 息 结 构 并 不 依 赖 于 具 体 的 计 算 机 系 统 是 不 是 某 一 个 DBM S 支 持 的 数 据 模 型, 而 是 概 念 级 的 模 型 ; 然 后 再 把 概 念 模 型 转 换 为 计 算 机 上 某 一 DBM S 支 持 的 数 据 模 型 这 一 过 程 如 图 1 唱 4 所 示, 不 难 看 出, 概 念 模 型 实 际 上 是 现 实 世 界 到 机 器 世 界 的 一 个 中 间 层 次, 用 于 信 息 世 界 的 建 模 概 念 模 型 有 如 下 特 点 : 1 具 有 较 强 的 语 义 表 达 能 力, 能 够 方 便 直 接 地 表 达 应 用 中 的 各 种 语 义 知 识 2 简 单 清 晰 易 于 用 户 理 解, 是 用 户 与 数 据 库 设 计 人 员 之 间 进 行 交 流 的 语 言 1. 概 念 模 型 中 的 基 本 概 念 (1) 实 体 (Entity) : 客 观 存 在 并 可 以 相 互 区 分 的 事 物, 例 如 人 物 实 际 的 对 象 某 些 概 念 或 事 物 之 间 的 联 系 若 干 个 属 性 的 属 性 值 组 成 的 集 合, 用 来 表 征 一 个 实 体 如 聂 晓 明 男, 表 示 聂 晓 明 这 个 实 体 同 类 实 体 的 集 合 则 组 成 了 实 体 集 例 如 描 述 全 部 学 生 的 实 体 就 构 成 了 学 生 实 体 集, 反 映 了 一 个 学 校 全 部 学 生 的 情 况 (2) 属 性 (Attribute) : 实 体 所 具 有 的 某 一 特 征, 一 个 实 体 可 以 由 若 干 个 属 性 来 刻 画 它 是 事 物 的 某 一 方 面 的 特 征 的 抽 象 描 述 例 如 学 生 可 以 通 过 学 生 的 姓 名 学 号 性 别 出 生 日 期 等 特 征 来 描 述, 称 姓 名 学 号 性 别 年 龄 为 该 事 物 的 属 性 属 性 值 是 属 性 的 具 体 取 值, 如 学 生 姓 名 为 王 一 明, 学 号 为 , 性 别 为 男, 出 生 日 期 为 1986 年 3 月 3 日, 这 些 具 体 值 即 为 属 性 值 (3) 关 键 字 (Key) : 惟 一 标 识 实 体 的 属 性 或 属 性 组 合 例 如, 在 学 生 实 体 集 合 中, 学 号 可 以 惟 一 地 标 识 每 个 学 生 实 体, 所 以 学 号 为 关 键 字 在 有 些 实 体 集 中, 可 以 有 多 个 关 键 字, 例 如 学 生 实 体 集, 如 果 学 生 姓 名 无 重 名, 则 属 性 姓 名 也 可 作 为 关 键 字 通 常 选 定 其 中 一 个, 被 选 的 那 一 个 关 键 字 是 主 关 键 字, 其 他 的 关 键 字 是 次 关 键 字 次 关 键 字 在 实 体 集 中 经 常 选 择 一 些 不 能 惟 一 标 识 实 体 的 属 性 来 标 识 实 体, 这 样 的 属 性 叫 次 关 键 字 例 如, 学 生 的 姓 名 考 试 分 数 等 都 可 以 充 当 次 关 键 字 (4) 域 (Domain) : 某 个 ( 些 ) 属 性 的 取 值 范 围, 例 如, 性 别 的 域 为 ( 男, 女 ) (5) 实 体 型 (Entity T ype) : 具 有 相 同 属 性 的 实 体 具 有 共 同 的 特 征 和 性 质, 用 实 体 名 及 其 属 性 名 集 合 来 抽 象 和 描 述 同 类 实 体, 称 为 实 体 型 例 如, 学 生 ( 学 号 姓 名 年 龄 性 别 系 年 级 ) 是 一 个 实 体 型
21 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 椭 圆 型 表 示 实 体 的 属 性, 并 用 无 向 边 把 实 体 和 属 性 连 接 起 来
22 第 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 所 支 持 的 数 据 模 型, 它 是 各 种 数 据 模 型 的 共 同 基 础, 因 而 比 数 据 模 型 更 一 般 更 抽 象 更 接 近 现 实 世 界 数 据 模 型 的 分 类 当 前 流 行 的 基 本 数 据 模 型 有 层 次 模 型 网 状 模 型 关 系 模 型 它 们 之 间 的 根 本 区 别 在 于
23 10 SQL Server 数 据 库 应 用 技 术 图 1 唱 7 E 唱 R 图 实 例 数 据 之 间 的 联 系 的 表 示 方 式 不 同 ( 记 录 型 之 间 的 联 系 方 式 不 同 ) 按 照 三 类 数 据 模 型 设 计 和 实 现, 数 据 库 系 统 又 可 以 分 为 三 类 : 关 系 数 据 库 系 统 层 次 数 据 库 系 统 网 状 数 据 库 系 统 1. 层 次 模 型 (1) 层 次 数 据 模 型 的 数 据 结 构 1 层 次 模 型 的 基 本 结 构 层 次 模 型 用 树 形 结 构 来 表 示 各 类 实 体 以 及 实 体 间 的 联 系 每 个 节 点 表 示 一 个 记 录 类 型, 节 点 之 间 的 连 线 表 示 记 录 类 型 间 的 联 系, 这 种 联 系 只 能 是 父 子 联 系 每 个 记 录 类 型 可 包 含 若 干 个 字 段, 在 这 个 模 型 里, 记 录 类 型 描 述 的 是 实 体, 字 段 描 述 实 体 的 属 性 任 何 一 个 给 定 的 记 录 值 只 有 按 其 路 径 查 看 时, 才 能 显 出 它 的 全 部 意 义, 没 有 一 个 子 女 记 录 值 能 够 脱 离 双 亲 记 录 值 而 独 立 存 在 层 次 模 型 表 示 各 类 实 体 以 及 实 体 间 的 联 系, 存 在 如 下 特 点 : 瞯 只 有 一 个 节 点 没 有 双 亲 节 点, 称 之 为 根 节 点 ; 瞯 根 以 外 的 其 他 节 点 有 且 只 有 一 个 双 亲 节 点 这 样 就 使 得 层 次 数 据 库 系 统 只 能 处
24 第 1 章 数 据 库 技 术 基 础 11 理 一 对 多 的 实 体 关 系 那 么 如 何 在 层 次 模 型 中 表 示 多 对 多 联 系? 方 法 是 : 首 先 将 其 分 解 成 一 对 多 联 系, 然 后 再 用 多 对 多 联 系 表 示 2 层 次 数 据 模 型 的 操 纵 与 完 整 性 约 束 层 次 数 据 模 型 的 操 纵 主 要 有 查 询 插 入 删 除 和 更 新 进 行 插 入 删 除 更 新 操 作 时 要 满 足 层 次 模 型 的 完 整 性 约 束 条 件 : 瞯 进 行 插 入 操 作 时, 如 果 没 有 相 应 的 双 亲 节 点 值 就 不 能 插 入 子 女 节 点 值 瞯 进 行 删 除 操 作 时, 如 果 删 除 双 亲 节 点 值, 则 相 应 的 子 女 节 点 值 也 被 同 时 删 除 瞯 进 行 更 新 操 作 时, 应 更 新 所 有 相 应 记 录, 以 保 证 数 据 的 一 致 性 (2) 层 次 数 据 模 型 的 优 缺 点 层 次 数 据 模 型 优 点 : 数 据 模 型 比 较 简 单, 操 作 方 便 ; 对 于 实 体 间 联 系 是 固 定 的, 且 预 先 定 义 好 应 用 系 统, 性 能 较 高 ; 提 供 良 好 的 完 整 性 支 持 层 次 数 据 模 型 缺 点 : 不 适 合 于 表 示 非 层 次 性 的 联 系 ; 对 插 入 和 删 除 操 作 的 限 制 比 较 多 ; 查 询 子 女 节 点 必 须 通 过 双 亲 节 点 ; 由 于 结 构 严 密, 层 次 命 令 趋 于 程 序 化 2. 网 状 模 型 (1) 网 状 数 据 模 型 的 数 据 结 构 网 状 数 据 模 型 是 一 种 比 层 次 模 型 更 具 普 遍 性 的 结 构, 它 去 掉 了 层 次 模 型 的 两 个 限 制, 允 许 多 个 节 点 没 有 双 亲 节 点, 允 许 节 点 有 多 个 双 亲 节 点 此 外 它 还 允 许 两 个 节 点 之 间 有 多 种 联 系 ( 称 之 为 复 合 联 系 ) (2) 网 状 数 据 模 型 的 操 纵 与 完 整 性 约 束 网 状 数 据 模 型 的 操 纵 主 要 包 括 查 询 插 入 删 除 和 更 新 数 据 进 行 操 作 时 有 如 下 特 点 : 瞯 插 入 操 作 允 许 插 入 尚 未 确 定 双 亲 节 点 值 的 子 女 节 点 值 ; 瞯 删 除 操 作 允 许 只 删 除 双 亲 节 点 值 ; 瞯 更 新 操 作 时 只 需 更 新 指 定 记 录 即 可 ; 瞯 查 询 操 作 可 以 有 多 种 方 法, 可 根 据 具 体 情 况 选 用 (3) 网 状 数 据 模 型 的 优 缺 点 网 状 数 据 模 型 优 点 : 能 够 更 为 直 接 地 描 述 现 实 世 界 ; 具 有 良 好 的 性 能, 存 取 效 率 较 高 网 状 数 据 模 型 缺 点 : 其 DDL 语 言 极 其 复 杂 ; 数 据 独 立 性 较 差 由 于 实 体 间 的 联 系 本 质 上 是 通 过 存 取 路 径 指 示 的, 因 此 应 用 程 序 在 访 问 数 据 时 要 指 定 存 取 路 径 3. 关 系 模 型 (1) 关 系 数 据 模 型 的 数 据 结 构 在 用 户 看 来, 一 个 关 系 模 型 的 逻 辑 结 构 是 一 张 二 维 表, 它 由 行 和 列 组 成 在 关 系 模 型 中, 实 体 以 及 实 体 间 的 联 系 都 用 关 系 来 表 示 关 系 模 型 要 求 关 系 必 须 是 规 范 化 的, 最 基 本 的 条 件 就 是 关 系 的 每 一 个 分 量 必 须 是 一 个 不 可 分 的 数 据 项, 即 不 允 许 表 中 还 有 表 例 如, 图 1 唱 8 中 的 学 生 基 本 信 息 表 就 是 一 个 关 系 模 型, 它 涉 及 以 下 概 念
25 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 刘 流 女 计 算 机 18 广 东 张 章 男 信 息 管 理 19 广 西 李 里 女 多 媒 体 18 广 东 赵 兆 男 网 络 通 信 18 福 建
26 第 1 章 数 据 库 技 术 基 础 13 (2) 关 系 数 据 模 型 的 操 作 与 完 整 性 约 束 关 系 数 据 模 型 的 操 作 主 要 包 括 查 询 插 入 删 除 和 更 新 数 据 这 些 操 作 必 须 满 足 关 系 的 完 整 性 约 束 条 件 关 系 的 完 整 性 约 束 条 件 包 括 三 大 类 : 实 体 完 整 性 参 照 完 整 性 和 用 户 定 义 的 完 整 性 关 系 模 型 中 的 数 据 操 作 是 集 合 操 作, 操 作 对 象 和 操 作 结 果 都 是 关 系, 即 若 干 记 录 的 集 合 关 系 模 型 把 存 取 路 径 向 用 户 隐 蔽 起 来, 用 户 只 要 指 出 干 什 么, 不 必 详 细 说 明 怎 么 干, 从 而 大 大 地 提 高 了 数 据 的 独 立 性, 提 高 了 用 户 生 产 率 关 系 数 据 库 标 准 操 作 语 言 是 SQ L 语 言 (3) 关 系 数 据 模 型 的 优 缺 点 关 系 数 据 模 型 的 优 点 : 1 关 系 模 型 是 建 立 在 严 格 的 数 学 概 念 的 基 础 上 的 无 论 实 体 还 是 实 体 之 间 的 联 系 都 用 关 系 来 表 示 对 数 据 的 检 索 结 果 也 是 关 系 ( 即 表 ), 因 此, 概 念 单 一, 其 数 据 结 构 简 单 清 晰 2 关 系 模 型 的 存 取 路 径 对 用 户 透 明, 从 而 具 有 更 高 的 数 据 独 立 性 更 好 的 安 全 保 密 性, 也 简 化 了 程 序 员 的 工 作 和 数 据 库 的 开 发 工 作 关 系 数 据 模 型 的 缺 点 : 由 于 存 取 路 径 对 用 户 透 明, 查 询 效 率 往 往 不 如 非 关 系 数 据 模 型 因 此 为 了 提 高 性 能, 必 须 对 用 户 的 查 询 请 求 进 行 优 化, 从 而 增 加 了 开 发 数 据 库 管 理 系 统 的 负 担 1.3 数 据 库 设 计 数 据 库 设 计 是 一 个 软 件 系 统 工 程, 本 节 将 从 软 件 工 程 的 角 度 讨 论 数 据 库 设 计 的 各 个 阶 段, 掌 握 数 据 库 设 计 的 特 点 数 据 库 设 计 分 为 如 下 几 个 阶 段 需 求 分 析 阶 段 1. 需 求 分 析 的 任 务 需 求 分 析 的 任 务 是 通 过 详 细 调 查 现 实 世 界 要 处 理 的 对 象 ( 组 织 部 门 企 业 等 ), 充 分 了 解 原 系 统 ( 手 工 系 统 或 计 算 机 系 统 ) 工 作 概 况, 明 确 用 户 的 各 种 需 求, 然 后 在 此 基 础 上 确 定 新 系 统 的 功 能 新 系 统 必 须 充 分 考 虑 今 后 可 能 的 扩 充 和 改 变, 不 仅 仅 按 当 前 应 用 需 求 来 设 计 需 求 分 析 的 重 点 是 调 查 收 集 与 分 析 用 户 在 数 据 管 理 中 的 信 息 要 求 处 理 要 求 安 全 性 与 完 整 性 要 求 信 息 要 求 是 指 用 户 需 要 从 数 据 库 中 获 得 信 息 的 内 容 与 性 质 由 用 户 的 信 息 要 求 可 以 导 出 数 据 要 求, 即 在 数 据 库 中 需 要 存 储 哪 些 数 据 处 理 要 求 是 指 用 户 要 求 完 成 什 么 处 理 功 能, 对 处 理 的 响 应 时 间 有 什 么 要 求, 处 理 方 式 是 批 处 理 还 是 联 机 处 理 新 系 统 的 功 能 必 须 能 够 满 足 用 户 的 信 息 要 求 处 理 要 求 安 全 性 与 完 整 性 要 求 确 定 用 户 的 最 终 需 求 其 实 是 一 件 很 困 难 的 事, 这 是 因 为 一 方 面 用 户 缺 少 计 算 机 知 识, 开 始 时 无 法 确 定 计 算 机 究 竟 能 为 自 己 做 什 么, 不 能 做 什 么, 因 此 无 法 马 上 准 确 地 表 达 自 己 的 需 求, 他 们 所 提 出 的 需 求 往 往 不 断 地 变 化 另 一 方 面 设 计 人 员 缺 少 用 户 的 专 业 知 识, 不
27 14 SQL Server 数 据 库 应 用 技 术 易 理 解 用 户 的 真 正 需 求, 甚 至 误 解 用 户 的 需 求 此 外 新 的 硬 件 软 件 技 术 的 出 现 也 会 使 用 户 需 求 发 生 变 化 因 此 设 计 人 员 必 须 与 用 户 不 断 深 入 地 进 行 交 流, 才 能 逐 步 确 定 用 户 的 实 际 需 求 2. 需 求 分 析 的 方 法 (1) 调 查 组 织 机 构 情 况 包 括 了 解 该 组 织 的 部 门 组 成 情 况 各 部 门 的 职 能 等, 为 分 析 信 息 流 程 做 好 准 备 (2) 调 查 各 部 门 的 业 务 活 动 情 况 包 括 了 解 各 个 部 门 输 入 和 使 用 什 么 数 据 如 何 加 工 处 理 这 些 数 据 输 出 什 么 信 息 输 出 到 什 么 部 门 输 出 结 果 的 格 式 是 什 么 (3) 协 助 用 户 明 确 对 新 系 统 的 各 种 要 求 包 括 信 息 要 求 处 理 要 求 完 全 性 与 完 整 性 要 求 (4) 确 定 新 系 统 的 边 界 确 定 哪 些 功 能 由 计 算 机 完 成 或 将 来 准 备 让 计 算 机 完 成, 哪 些 活 动 由 人 工 完 成 由 计 算 机 完 成 的 功 能 就 是 新 系 统 应 该 实 现 的 功 能 常 用 的 调 查 方 法 有 : 跟 班 作 业 ; 开 调 查 会 ; 请 专 人 介 绍 ; 询 问 ; 设 计 问 卷 调 查 表 请 用 户 填 写 ; 查 阅 记 录 通 过 调 查 了 解 了 用 户 需 求 后, 还 需 要 进 一 步 分 析 和 表 达 用 户 的 需 求 例 如, 采 用 自 顶 向 下 的 结 构 化 分 析 方 法 (Structured Analysis,SA) 分 析 和 表 达 用 户 需 求, 即 从 最 上 层 的 系 统 组 织 机 构 入 手, 采 用 逐 层 分 解 的 方 式 分 析 系 统, 并 且 把 每 一 层 用 数 据 流 图 和 数 据 字 典 描 述 将 处 理 功 能 的 具 体 内 容 分 解 为 若 干 子 功 能, 再 将 每 个 子 功 能 继 续 分 解, 直 到 把 系 统 的 工 作 过 程 表 达 清 楚 为 止 在 处 理 功 能 逐 步 分 解 的 同 时, 它 们 所 用 的 数 据 也 逐 级 分 解, 形 成 若 干 层 次 的 数 据 流 图 数 据 流 图 表 达 了 数 据 和 处 理 过 程 的 关 系 系 统 中 的 数 据 则 借 助 数 据 字 典 (Data Dictionary,DD) 来 描 述 3. 数 据 字 典 对 数 据 库 设 计 来 讲, 数 据 字 典 是 进 行 数 据 收 集 和 分 析 所 获 得 的 各 类 数 据 描 述 的 集 合 通 常 包 括 数 据 项 数 据 结 构 数 据 流 数 据 存 储 和 处 理 过 程 5 个 部 分 (1) 数 据 项 数 据 项 是 不 可 再 分 的 数 据 单 位 对 数 据 项 的 描 述 通 常 包 括 以 下 内 容 : 数 据 项 描 述 = { 数 据 项 名, 数 据 项 含 义 说 明, 别 名, 数 据 类 型, 长 度, 取 值 范 围, 取 值 含 义, 与 其 他 数 据 项 的 逻 辑 关 系 } 其 中 取 值 范 围 与 其 他 数 据 项 的 逻 辑 关 系 定 义 了 数 据 的 完 整 性 约 束 条 件, 是 设 计 数 据 功 能 的 依 据 (2) 数 据 结 构 数 据 结 构 反 映 了 数 据 之 间 的 组 合 关 系 一 个 数 据 结 构 可 以 由 若 干 个 数 据 项 组 成, 也 可 以 由 若 干 个 数 据 结 构 组 成, 或 由 若 干 个 数 据 项 和 数 据 结 构 混 合 组 成 对 数 据 结 构 的 描 述 通 常 包 括 以 下 内 容 : 数 据 结 构 描 述 = { 数 据 结 构 名, 含 义 说 明, 组 成 :{ 数 据 项 或 数 据 结 构 }}
28 第 1 章 数 据 库 技 术 基 础 15 (3) 数 据 流 数 据 流 是 数 据 结 构 在 系 统 内 传 输 的 路 径 对 数 据 流 的 描 述 通 常 包 括 以 下 内 容 : 数 据 流 描 述 = { 数 据 流 名, 说 明, 数 据 流 来 源, 数 据 流 去 向, 组 成 :{ 数 据 结 构 }, 平 均 流 量, 高 峰 期 流 量 } 其 中 数 据 流 来 源 是 说 明 该 数 据 流 来 自 哪 个 过 程 数 据 流 去 向 是 说 明 该 数 据 流 将 到 哪 个 过 程 去 平 均 流 量 是 指 在 单 位 时 间 ( 每 天 每 周 每 月 等 ) 里 的 传 输 次 数 高 峰 期 流 量 则 是 指 在 高 峰 时 期 的 数 据 流 量 (4) 数 据 存 储 数 据 存 储 是 数 据 结 构 停 留 或 保 存 的 地 方, 也 是 数 据 流 的 来 源 和 去 向 之 一 对 数 据 存 储 的 描 述 通 常 包 括 以 下 内 容 : 数 据 存 储 描 述 = { 数 据 存 储 名, 说 明, 编 号, 流 入 的 数 据 流, 流 出 的 数 据 流, 组 成 : { 数 据 结 构 }, 数 据 量, 存 取 方 式 } 其 中 数 据 量 是 指 每 次 存 取 多 少 数 据, 每 天 ( 每 小 时 每 周 等 ) 存 取 几 次 等 信 息 存 取 方 法 包 括 是 批 处 理, 还 是 联 机 处 理 ; 是 检 索 还 是 更 新 ; 是 顺 序 检 索 还 是 随 机 检 索 等 另 外, 流 入 的 数 据 流 要 指 出 其 来 源, 流 出 的 数 据 流 要 指 出 其 去 向 (5) 处 理 过 程 数 据 字 典 中 只 需 要 描 述 处 理 过 程 的 说 明 性 信 息, 通 常 包 括 以 下 内 容 : 处 理 过 程 描 述 = { 处 理 过 程 名, 说 明, 输 入 : { 数 据 流 }, 输 出 : { 数 据 流 }, 处 理 : { 简 要 说 明 }} 其 中 简 要 说 明 中 主 要 说 明 该 处 理 过 程 的 功 能 及 处 理 要 求 功 能 是 指 该 处 理 过 程 用 来 做 什 么 ( 而 不 是 怎 么 做 ), 处 理 要 求 包 括 处 理 频 度 要 求, 如 单 位 时 间 里 处 理 多 少 事 务 多 少 数 据 量 ; 响 应 时 间 要 求 等 这 些 处 理 要 求 是 后 面 物 理 设 计 的 输 入 及 性 能 评 价 的 标 准 数 据 字 典 是 关 于 数 据 库 中 数 据 的 描 述, 即 元 数 据, 而 不 是 数 据 本 身 数 据 本 身 将 存 放 在 物 理 数 据 库 中, 由 数 据 库 管 理 系 统 管 理 数 据 字 典 有 助 于 这 些 数 据 的 进 一 步 管 理 和 控 制, 为 设 计 人 员 和 数 据 库 管 理 员 在 数 据 库 设 计 实 现 和 运 行 阶 段 控 制 有 关 数 据 提 供 依 据 下 面 以 学 生 管 理 系 统 为 例, 简 要 说 明 如 何 定 义 数 据 字 典 1 该 子 系 统 涉 及 很 多 数 据 项, 其 中 学 号 数 据 项 可 以 如 下 描 述 : 瞯 数 据 项 : 学 号 瞯 含 义 说 明 : 惟 一 标 识 每 个 学 生 瞯 别 名 : 学 生 编 号 瞯 类 型 : 字 符 型 瞯 长 度 :10 瞯 取 值 范 围 : ~ 瞯 取 值 含 义 : 第 1 ~ 2 位 表 示 学 生 所 在 年 级, 第 3 ~ 4 位 表 示 学 生 所 在 院 系, 第 5 ~ 6 位 表 示 学 生 所 学 专 业, 第 7 ~ 8 位 表 示 学 生 的 班 次 编 号, 第 9 ~ 10 位 表 示 在 班 级 的 顺 序 号 2 学 生 是 学 生 管 理 子 系 统 中 的 一 个 核 心 数 据 结 构, 它 可 以 如 下 描 述 : 瞯 数 据 结 构 : 学 生
29 16 SQL Server 数 据 库 应 用 技 术 瞯 含 义 说 明 : 是 学 生 管 理 子 系 统 的 主 体 数 据 结 构, 定 义 了 一 个 学 生 的 有 关 信 息 瞯 组 成 : 学 号 姓 名 出 生 日 期 性 别 家 庭 住 址 电 话 号 码 邮 政 编 码 入 学 成 绩 3 数 据 流 考 试 / 考 查 可 以 如 下 描 述 : 瞯 数 据 流 : 平 时 成 绩 期 中 成 绩 期 末 成 绩 瞯 说 明 : 测 试 学 生 学 习 程 度 和 测 量 教 师 教 学 水 平 瞯 数 据 流 来 源 : 考 试 / 考 查 的 卷 面 分 数 瞯 数 据 流 去 向 : 课 程 最 终 评 定 分 数 瞯 组 成 : 学 号 姓 名 课 程 号 分 数 4 数 据 存 储 学 生 登 记 表 可 以 如 下 描 述 : 瞯 数 据 存 储 : 学 生 登 记 表 瞯 说 明 : 记 录 学 生 的 基 本 情 况 瞯 流 入 数 据 流 : 学 号 姓 名 出 生 日 期 性 别 家 庭 住 址 电 话 邮 编 入 学 成 绩 瞯 流 出 数 据 流 : 人 数 年 龄 段 男 女 比 例 平 均 成 绩 瞯 存 取 方 式 : 随 机 存 取 瞯 数 据 量 : 记 录 字 节 数 年 级 标 准 班 人 数 班 级 数 5 处 理 过 程 教 室 安 排 可 如 下 描 述 : 瞯 处 理 过 程 : 安 排 教 室 瞯 说 明 : 为 所 有 班 级 按 照 课 程 规 格 分 配 教 室 瞯 输 入 : 课 程 编 号, 课 程 类 型, 教 室 编 号, 教 师 编 号, 班 级 编 号 瞯 输 出 : 教 室 安 排 表 ( 课 表 ) 瞯 处 理 : 新 学 期 学 生 报 到 注 册 后, 为 所 有 班 级 分 配 授 课 教 师 确 定 某 一 专 业 的 班 级 数 据 和 课 程 规 格, 给 每 一 个 班 级 某 一 门 课 程 安 排 教 室 和 授 课 教 师 要 求 同 一 间 教 室 只 能 安 排 同 一 班 级 的 学 生, 同 一 个 教 师 在 某 一 时 间 段 只 能 安 排 在 一 个 教 室 授 课 概 念 结 构 设 计 将 需 求 分 析 得 到 的 用 户 需 求 抽 象 为 信 息 结 构 即 概 念 模 型 的 过 程 就 是 概 念 结 构 设 计 概 念 结 构 是 对 现 实 世 界 的 一 种 抽 象, 即 对 实 际 的 人 物 事 和 概 念 进 行 人 为 处 理, 抽 取 人 们 关 心 的 共 同 特 性, 忽 略 非 本 质 的 细 节, 并 把 这 些 特 性 用 各 种 概 念 精 确 地 加 以 描 述 概 念 结 构 独 立 于 数 据 库 逻 辑 结 构, 也 独 立 于 支 持 数 据 库 的 DBM S 它 是 现 实 世 界 与 机 器 世 界 的 中 介, 它 一 方 面 能 够 充 分 反 映 现 实 世 界, 包 括 实 体 和 实 体 之 间 的 联 系, 同 时 又 易 于 向 关 系 网 状 层 次 等 各 种 数 据 模 型 转 换 它 是 现 实 世 界 的 一 个 真 实 模 型, 易 于 理 解, 便 于 和 不 熟 悉 计 算 机 的 用 户 交 换 意 见, 使 用 户 易 于 参 与, 当 现 实 世 界 需 求 改 变 时, 概 念 结 构 又 可 以 很 容 易 地 作 相 应 调 整 因 此 概 念 结 构 设 计 是 整 个 数 据 库 设 计 的 关 键 所 在 1. 概 念 结 构 设 计 的 方 法 设 计 概 念 结 构 通 常 有 四 类 方 法 : (1) 自 顶 向 下, 即 首 先 定 义 全 局 概 念 结 构 的 框 架, 然 后 逐 步 细 化 (2) 自 底 向 上, 即 首 先 定 义 各 局 部 应 用 的 概 念 结 构, 然 后 将 它 们 集 成 起 来, 得 到 全 局 概 念 结 构 这 是 最 经 常 采 用 的 策 略
30 第 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 的 联 系 由 于 班 主 任 同 时 还 要 教 课, 因 此 班 主 任 与 学 生 之 间 存 在 指 导 联 系, 一 个 班 主 任 要 教 多 名 学 生, 而 一 个 学 生 只 对
31 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 图
32 第 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 学 生 实 体 中 的 年 龄 属 性 可 以 由 出 生 日 期 推 算 出 来, 属 于 冗 余 数 据, 应 该 去 掉 这 样 不 仅 可 以 节 省 存 储 空 间, 而 且 当 某 个 学 生 的 出 生 日 期 有 误, 进 行 修 改 后, 无 须 相 应 修 改 年 龄, 减 少 了 产 生 数 据 不 一 致 的 机 会 学 生 :{ 学 号, 姓 名, 出 生 日 期, 课 程 号, 平 均 成 绩 }
33 20 SQL Server 数 据 库 应 用 技 术 2 教 室 实 体 与 班 级 实 体 之 间 的 上 课 联 系 可 以 由 教 室 与 课 程 之 间 的 开 设 联 系 课 程 与 学 生 之 间 的 选 修 联 系 学 生 与 班 级 之 间 的 组 成 联 系 三 者 推 导 出 来, 因 此 属 于 冗 余 联 系, 可 以 消 去 3 学 生 实 体 中 的 平 均 成 绩 可 以 从 选 修 联 系 中 的 成 绩 属 性 中 推 算 出 来, 但 如 果 应 用 中 需 要 经 常 查 询 某 个 学 生 的 平 均 成 绩, 每 次 都 进 行 这 种 计 算 效 率 就 会 太 低, 因 此 为 提 高 效 率, 可 以 考 虑 保 留 该 冗 余 数 据, 但 是 为 了 维 护 数 据 一 致 性, 应 该 定 义 一 个 触 发 器 来 保 证 学 生 的 平 均 成 绩 等 于 该 学 生 各 科 成 绩 的 平 均 值 任 何 一 科 成 绩 修 改 后, 或 该 学 生 学 了 新 的 科 目 并 有 成 绩 后, 就 要 触 发 该 触 发 器 去 修 改 该 学 生 的 平 均 成 绩 属 性 值 否 则 会 出 现 数 据 的 不 一 致 图 1 唱 11 是 进 行 修 改 和 重 构 后 生 成 的 基 本 E 唱 R 图 逻 辑 结 构 设 计 图 1 唱 11 描 述 学 生 管 理 的 基 本 E 唱 R 图 1.E 唱 R 图 向 关 系 模 型 的 转 换 设 计 逻 辑 结 构 应 该 选 择 最 适 于 描 述 与 表 达 相 应 概 念 结 构 的 数 据 模 型, 然 后 选 择 最 合 适 的 DBM S 关 系 模 型 的 逻 辑 结 构 是 一 组 关 系 模 式 的 集 合 而 E 唱 R 图 则 是 由 实 体 实 体 的 属 性 和 实 体 之 间 的 联 系 三 个 要 素 组 成 的 所 以 将 E 唱 R 图 转 换 为 关 系 模 型 实 际 上 就 是 要 将 实 体 实 体 的 属 性 和 实 体 之 间 的 联 系 转 化 为 关 系 模 式, 这 种 转 换 一 般 遵 循 如 下 原 则 : (1) 一 个 实 体 型 转 换 为 一 个 关 系 模 式 实 体 的 属 性 就 是 关 系 的 属 性 实 体 的 关 键 字 就 是 关 系 的 关 键 字 例 如, 学 生 实 体 可 以 转 换 为 学 生 ( 学 号, 姓 名, 课 程 号, 成 绩 ) 的 关 系 模 式, 其 中 学 号 为 学 生 关 系 的 关 键 字 同 样, 班 级 档 案 材 料 教 师 课 程 教 室 教 材 都 能 转 换 为 一 个 关 系 模 式
34 第 1 章 数 据 库 技 术 基 础 21 (2) 一 个 m n 联 系 转 换 为 一 个 关 系 模 式 与 m n 联 系 相 连 的 各 实 体 的 关 键 字 以 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性 而 关 系 的 关 键 字 为 各 实 体 关 键 字 的 组 合 例 如, 考 试 联 系 是 一 个 m n 联 系, 可 以 将 它 转 换 为 考 试 ( 学 号, 课 程 号, 考 室, 成 绩 ) 的 关 系 模 式, 其 中 关 系 的 关 键 字 是 学 号 与 课 程 号 的 组 合 (3) 一 个 1 n 联 系 可 以 转 换 为 一 个 独 立 的 关 系 模 式, 也 可 以 与 n 端 对 应 的 关 系 模 式 合 并 如 果 转 换 为 一 个 独 立 的 关 系 模 式, 则 与 该 联 系 相 连 的 各 实 体 的 关 键 字 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性, 而 关 系 的 关 键 字 为 n 端 实 体 的 关 键 字 例 如, 组 成 联 系 为 1 n 联 系, 将 其 转 换 为 关 系 模 式 一 种 方 法 是 使 其 成 为 一 个 独 立 的 关 系 模 式 : 组 成 ( 学 号, 班 级 号 ), 其 中 学 号 为 组 成 关 系 的 关 键 字 另 一 种 方 法 是 将 其 学 生 关 系 模 式 合 并, 这 时 学 生 关 系 模 式 为 : 学 生 ( 学 号, 姓 名, 出 生 日 期, 所 在 院 系, 年 级, 班 级 号, 平 均 成 绩 ) 后 一 种 方 法 可 以 减 少 系 统 中 的 关 系 个 数, 一 般 情 况 下 更 倾 向 于 采 用 这 种 方 法 (4) 一 个 1 1 联 系 可 以 转 换 为 一 个 独 立 的 关 系 模 式, 也 可 以 与 任 意 一 端 对 应 的 关 系 模 式 合 并 如 果 转 换 为 一 个 独 立 的 关 系 模 式, 则 与 该 联 系 相 连 的 各 实 体 的 关 键 字 以 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性, 每 个 实 体 的 关 键 字 均 是 该 关 系 的 候 选 关 键 字 如 果 与 某 一 端 对 应 的 关 系 模 式 合 并, 则 需 要 在 该 关 系 模 式 的 属 性 中 加 入 另 一 个 关 系 模 式 的 关 键 字 和 联 系 本 身 的 属 性 例 如, 管 理 联 系 为 1 1 联 系, 可 以 将 其 转 换 为 一 个 独 立 的 关 系 模 式 : 管 理 ( 教 师 编 号, 班 级 编 号 ), 管 理 联 系 也 可 以 与 班 级 或 教 师 关 系 模 式 合 并 如 果 与 班 级 关 系 模 式 合 并, 则 只 需 在 班 级 关 系 中 加 入 教 师 关 系 的 关 键 字 教 师 编 号, 即 关 系 模 式 : 班 级 ( 班 级 号, 学 生 人 数, 所 属 院 系, 教 师 编 号 ) 同 样, 如 果 与 教 师 关 系 模 式 合 并, 则 只 需 在 教 师 关 系 中 加 入 班 级 关 系 的 关 键 字 班 级 编 号, 即 关 系 模 式 : 教 师 ( 职 工 号, 姓 名, 性 别, 职 称, 班 级 号, 是 否 为 优 秀 班 主 任 ) (5) 三 个 或 三 个 以 上 实 体 间 的 一 个 多 元 联 系 转 换 为 一 个 关 系 模 式 与 多 元 联 系 相 连 的 各 实 体 的 关 键 字 以 及 联 系 本 身 的 属 性 均 转 换 为 关 系 的 属 性 而 关 系 的 关 键 字 为 各 实 体 关 键 字 的 组 合 例 如, 教 授 联 系 是 一 个 三 元 联 系, 可 以 将 它 转 换 为 讲 授 ( 课 程 编 号, 教 师 编 号, 教 材 编 号 ) 的 关 系 模 式, 其 中 课 程 编 号 教 师 编 号 和 教 材 编 号 为 关 系 的 组 合 关 键 字 (6) 实 体 集 的 实 体 间 的 联 系, 即 自 联 系, 也 可 按 上 述 n 和 m n 三 种 情 况 分 别 处 理 例 如, 如 果 教 师 实 体 集 内 部 存 在 领 导 与 被 领 导 的 1 n 自 联 系, 可 以 将 该 联 系 与 教 师 实 体 合 并, 这 时 主 关 键 字 教 师 编 号 将 多 次 出 现, 但 作 用 不 同, 可 用 不 同 的 属 性 名 加 以 区 分, 例 如 在 合 并 后 的 关 系 模 式 中, 主 关 键 字 仍 为 教 师 编 号, 再 增 设 一 个 系 主 任 属 性, 存 放 相 应 系 主 任 的 教 师 编 号 (7) 相 同 关 键 字 的 关 系 模 式 可 合 并 为 了 减 少 系 统 中 的 关 系 个 数, 如 果 两 个 关 系 模 式 具 有 相 同 的 主 关 键 字, 可 以 考 虑 将 它 们 合 并 为 一 个 关 系 模 式 合 并 方 法 是 将 其 中 一 个 关 系 模 式 的 全 部 属 性 加 入 到 另 一 个 关 系
35 22 SQL Server 数 据 库 应 用 技 术 模 式 中, 然 后 去 掉 其 中 的 同 义 属 性 ( 可 能 同 名 也 可 能 不 同 名 ), 并 适 当 调 整 属 性 的 次 序 例 如, 有 一 个 拥 有 关 系 模 式 : 拥 有 ( 学 号, 性 别 ) ; 另 有 一 个 学 生 关 系 模 式 : 学 生 ( 学 号, 姓 名, 出 生 日 期, 所 在 院 系, 年 级, 班 级 号, 平 均 成 绩 ), 这 两 个 关 系 模 式 都 以 学 号 为 关 键 字, 可 以 将 它 们 合 并 为 一 个 关 系 模 式, 假 设 合 并 后 的 关 系 模 式 仍 叫 学 生 : 学 生 ( 学 号, 姓 名, 性 别, 出 生 日 期, 所 在 院 系, 年 级, 班 级 号, 平 均 成 绩 ) 2. 数 据 模 型 的 优 化 数 据 库 逻 辑 设 计 的 结 果 不 是 惟 一 的 为 了 进 一 步 提 高 数 据 库 应 用 系 统 的 性 能, 通 常 以 规 范 化 理 论 为 指 导, 还 应 该 适 当 地 修 改 调 整 数 据 模 型 的 结 构, 这 就 是 数 据 模 型 的 优 化 数 据 模 型 的 优 化 方 法 为 : (1) 确 定 数 据 依 赖 对 于 各 个 关 系 模 式 之 间 的 数 据 依 赖 进 行 极 小 化 处 理, 消 除 冗 余 的 联 系 按 照 数 据 依 赖 的 情 况 对 关 系 模 式 逐 一 进 行 分 析, 考 查 是 否 存 在 部 分 依 赖 传 递 依 赖 多 值 依 赖 等 按 照 需 求 分 析 阶 段 得 到 的 各 种 应 用 对 数 据 处 理 的 要 求, 分 析 对 于 这 样 的 应 用 环 境 这 些 模 式 是 否 合 适, 确 定 是 否 要 对 它 们 进 行 合 并 或 分 解 (2) 对 关 系 模 式 进 行 必 要 的 分 解 数 据 库 设 计 人 员 为 了 判 断 关 系 模 式 优 劣, 预 测 关 系 模 式 可 能 出 现 的 问 题, 需 要 对 关 系 模 式 进 行 必 要 的 分 解, 使 数 据 库 设 计 工 作 有 严 格 的 质 量 保 障 3. 设 计 用 户 子 模 式 前 面 根 据 用 户 需 求 设 计 了 局 部 E 唱 R 图, 这 种 局 部 E 唱 R 图 只 是 概 念 模 型 在 将 概 念 模 型 转 换 为 逻 辑 模 型 后, 即 生 成 了 整 个 应 用 系 统 的 模 式 后, 还 应 该 根 据 局 部 应 用 需 求, 结 合 具 体 DBM S 的 特 点, 设 计 用 户 的 外 模 式 目 前 关 系 数 据 库 管 理 系 统 一 般 都 提 供 了 视 图 概 念, 支 持 用 户 的 虚 拟 视 图 可 以 利 用 这 一 功 能 设 计 更 符 合 局 部 用 户 需 要 的 用 户 外 模 式 定 义 数 据 库 模 式 主 要 是 从 系 统 的 时 间 效 率 空 间 效 率 易 维 护 等 角 度 出 发 由 于 用 户 外 模 式 与 模 式 是 独 立 的, 因 此, 在 定 义 用 户 外 模 式 时 应 该 更 注 重 考 虑 用 户 的 习 惯 与 方 便 包 括 : 1 使 用 更 符 合 用 户 习 惯 的 别 名 2 针 对 不 同 级 别 的 用 户 定 义 不 同 的 外 模 式, 以 满 足 系 统 对 安 全 性 的 要 求 3 简 化 用 户 对 系 统 的 使 用 数 据 库 物 理 设 计 数 据 库 最 终 是 要 存 储 在 物 理 设 备 上 的 为 一 个 给 定 的 逻 辑 数 据 模 型 选 取 一 个 最 适 合 应 用 环 境 的 物 理 结 构 ( 存 储 结 构 与 存 取 方 法 ) 的 过 程, 就 是 数 据 库 的 物 理 设 计 物 理 结 构 依 赖 于 给 定 的 DBM S 和 硬 件 系 统, 因 此 设 计 人 员 必 须 充 分 了 解 所 用 DBM S 的 内 部 特 征, 特 别 是 存 储 结 构 和 存 取 方 法 ; 充 分 了 解 应 用 环 境, 特 别 是 应 用 的 处 理 频 率 和 响 应 时 间 要 求 ; 以 及 充 分 了 解 外 存 设 备 的 特 性 1. 确 定 数 据 的 存 储 结 构 确 定 数 据 库 存 储 结 构 时 要 综 合 考 虑 存 取 时 间 存 储 空 间 利 用 率 和 维 护 代 价 三 方 面 的
36 第 1 章 数 据 库 技 术 基 础 23 因 素 这 三 个 方 面 常 常 是 相 互 矛 盾 的, 例 如 消 除 一 切 冗 余 数 据 虽 然 能 够 节 约 存 储 空 间, 但 往 往 会 导 致 检 索 代 价 的 增 加, 因 此 必 须 进 行 权 衡, 选 择 一 个 折 中 方 案 2. 设 计 数 据 的 存 取 路 径 在 关 系 数 据 库 中, 选 择 存 取 路 径 主 要 是 指 确 定 如 何 建 立 索 引 例 如, 应 把 哪 些 域 作 为 次 关 键 字 建 立 次 索 引, 建 立 单 个 关 键 字 索 引 还 是 组 合 索 引, 建 立 多 少 个 为 合 适, 是 否 建 立 聚 集 索 引 等 3. 确 定 数 据 的 存 放 位 置 为 了 提 高 系 统 性 能, 数 据 应 该 根 据 应 用 情 况 将 易 变 部 分 与 稳 定 部 分 经 常 存 取 部 分 和 存 取 频 率 较 低 部 分 分 开 存 放 例 如, 数 据 库 数 据 备 份 日 志 文 件 备 份 等 由 于 只 在 故 障 恢 复 时 才 使 用, 而 且 数 据 量 很 大, 可 以 考 虑 刻 录 在 光 盘 上 目 前 许 多 计 算 机 都 有 多 个 硬 盘, 因 此 进 行 物 理 设 计 时 可 以 考 虑 将 表 和 索 引 分 别 放 在 不 同 的 硬 盘 上 在 查 询 时, 由 于 两 个 硬 盘 驱 动 器 分 别 在 工 作, 因 而 可 以 保 证 物 理 读 写 速 度 比 较 快 也 可 以 将 比 较 大 的 表 分 别 放 在 两 个 硬 盘 上, 以 加 快 存 取 速 度, 这 在 多 用 户 环 境 下 特 别 有 效 此 外, 还 可 以 将 日 志 文 件 与 数 据 库 对 象 ( 表 索 引 等 ) 放 在 不 同 的 硬 盘 以 改 进 系 统 的 性 能 4. 确 定 系 统 配 置 Oracle 数 据 库 一 般 都 提 供 了 一 些 存 储 分 配 参 数, 供 设 计 人 员 和 DBA 对 数 据 库 进 行 物 理 优 化 初 始 情 况 下, 系 统 都 为 这 些 变 量 赋 予 了 合 理 的 默 认 值 但 是 这 些 值 不 一 定 适 合 每 一 种 应 用 环 境, 在 进 行 物 理 设 计 时, 需 要 重 新 对 这 些 变 量 赋 值 以 改 善 系 统 的 性 能 通 常 情 况 下, 这 些 配 置 变 量 包 括 : 同 时 使 用 数 据 库 的 用 户 数, 同 时 打 开 的 数 据 库 对 象 数, 使 用 的 缓 冲 区 长 度 个 数, 时 间 片 大 小, 数 据 库 的 大 小, 装 填 因 子, 锁 的 数 目 等, 这 些 参 数 值 影 响 存 取 时 间 和 存 储 空 间 的 分 配, 在 物 理 设 计 时 就 要 根 据 应 用 环 境 确 定 这 些 参 数 值, 以 使 系 统 性 能 最 优 在 物 理 设 计 时 对 系 统 配 置 变 量 的 调 整 只 是 初 步 的, 在 系 统 运 行 时 还 要 根 据 系 统 实 际 运 行 情 况 做 进 一 步 的 调 整, 以 期 切 实 改 进 系 统 性 能 5. 评 价 物 理 结 构 数 据 库 物 理 设 计 过 程 中 需 要 对 时 间 效 率 空 间 效 率 维 护 代 价 和 各 种 用 户 要 求 进 行 权 衡, 其 结 果 可 以 产 生 多 种 方 案, 数 据 库 设 计 人 员 必 须 对 这 些 方 案 进 行 细 致 的 评 价, 从 中 选 择 一 个 较 优 的 方 案 作 为 数 据 库 的 物 理 结 构 评 价 物 理 数 据 库 的 方 法 完 全 依 赖 于 所 选 用 的 DBM S, 主 要 是 从 定 量 估 算 各 种 方 案 的 存 储 空 间 存 取 时 间 和 维 护 代 价 入 手, 对 估 算 结 果 进 行 权 衡 比 较, 选 择 出 一 个 较 优 的 合 理 的 物 理 结 构 如 果 该 结 构 不 符 合 用 户 需 求, 则 需 要 修 改 设 计 数 据 库 实 施 1. 定 义 数 据 库 结 构 确 定 了 数 据 库 的 逻 辑 结 构 与 物 理 结 构 后, 就 可 以 用 所 选 用 的 DBM S 提 供 的 数 据 定 义 语 言 (DDL) 来 严 格 描 述 数 据 库 结 构
37 24 SQL Server 数 据 库 应 用 技 术 2. 数 据 装 载 数 据 库 结 构 建 立 好 后, 就 可 以 向 数 据 库 中 装 载 数 据 了 组 织 数 据 入 库 是 数 据 库 实 施 阶 段 最 主 要 的 工 作 对 于 数 据 量 不 是 很 大 的 小 型 系 统, 可 以 用 人 工 方 法 完 成 数 据 的 入 库, 其 步 骤 为 : 1 筛 选 数 据, 需 要 装 入 数 据 库 中 的 数 据 通 常 都 分 散 在 各 个 部 门 的 数 据 文 件 或 原 始 凭 证 中, 所 以 首 先 必 须 把 需 要 入 库 的 数 据 筛 选 出 来 2 转 换 数 据 格 式, 筛 选 出 来 的 需 要 入 库 的 数 据, 其 格 式 往 往 不 符 合 数 据 库 要 求, 还 需 要 进 行 转 换 这 种 转 换 有 时 可 能 很 复 杂 3 输 入 数 据, 将 转 换 好 的 数 据 输 入 计 算 机 中 4 校 验 数 据, 检 查 输 入 的 数 据 是 否 有 误 对 于 大 中 型 系 统, 由 于 数 据 量 极 大, 用 人 工 方 式 组 织 数 据 入 库 将 会 耗 费 大 量 人 力 物 力, 而 且 很 难 保 证 数 据 的 正 确 性 因 此 应 该 设 计 一 个 数 据 输 入 子 系 统 由 计 算 机 辅 助 数 据 的 入 库 工 作 3. 编 制 与 调 试 应 用 程 序 数 据 库 应 用 程 序 的 设 计 应 该 与 数 据 库 设 计 并 行 进 行 在 数 据 库 实 施 阶 段, 当 数 据 库 结 构 建 立 好 后, 就 可 以 开 始 编 制 与 调 试 数 据 库 的 应 用 程 序, 也 就 是 说, 编 制 与 调 试 应 用 程 序 是 与 组 织 数 据 入 库 同 步 进 行 的 调 试 应 用 程 序 时 由 于 数 据 入 库 尚 未 完 成, 可 先 使 用 模 拟 数 据 4. 数 据 库 试 运 行 应 用 程 序 调 试 完 成, 并 且 已 有 一 小 部 分 数 据 入 库 后, 就 可 以 开 始 数 据 库 的 试 运 行 数 据 库 试 运 行 也 称 为 联 合 调 试, 其 主 要 工 作 包 括 : 1 功 能 测 试 即 实 际 运 行 应 用 程 序, 执 行 对 数 据 库 的 各 种 操 作, 测 试 应 用 程 序 的 各 种 功 能 2 性 能 测 试 即 测 量 系 统 的 性 能 指 标, 分 析 是 否 符 合 设 计 目 标 数 据 库 运 行 与 维 护 数 据 库 试 运 行 结 果 符 合 设 计 目 标 后, 数 据 库 就 可 以 真 正 投 入 运 行 了 数 据 库 投 入 运 行 标 志 着 开 发 任 务 的 基 本 完 成 和 维 护 工 作 的 开 始, 并 不 意 味 着 设 计 过 程 的 终 结 由 于 应 用 环 境 在 不 断 变 化, 数 据 库 运 行 过 程 中 物 理 存 储 也 会 不 断 变 化, 对 数 据 库 设 计 进 行 评 价 调 整 修 改 等 维 护 工 作 是 一 个 长 期 的 任 务, 也 是 设 计 工 作 的 继 续 和 提 高 在 数 据 库 运 行 阶 段, 对 数 据 库 经 常 性 的 维 护 工 作 主 要 是 由 DBA 完 成 的, 它 包 括 : 1. 数 据 库 的 备 份 和 恢 复 定 期 对 数 据 库 和 日 志 文 件 进 行 备 份, 以 保 证 一 旦 发 生 故 障, 能 利 用 数 据 库 备 份 及 日 志 文 件 备 份, 尽 快 将 数 据 库 恢 复 到 某 种 一 致 性 状 态, 并 尽 可 能 减 少 对 数 据 库 的 破 坏 2. 数 据 库 的 安 全 性 完 整 性 控 制 DBA 必 须 对 数 据 库 安 全 性 和 完 整 性 的 控 制 负 责 根 据 用 户 的 实 际 需 要 授 予 不 同 的 操 作 权 限 另 外, 由 于 应 用 环 境 的 变 化, 数 据 库 的 完 整 性 约 束 条 件 也 会 变 化, 也 需 要 DBA
38 第 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 定 义 联 系 ;
39 26 SQL Server 数 据 库 应 用 技 术 6 检 查 每 个 实 体 类 型 以 查 看 它 与 其 他 实 体 相 关 联 ;7 描 述 联 系 的 类 型 ;8 除 去 冗 余 关 系 A B C D (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 图 转 换 为 关 系 模 式
40 SQL Server 2000 服 务 器 和 客 户 端 第 2 章 SQ L Server 是 一 种 具 有 客 户 机 / 服 务 器 体 系 结 构 的 关 系 型 数 据 库 管 理 系 统, 它 由 一 些 具 有 数 据 存 储 检 索 功 能 的 客 户 端 组 件 和 服 务 器 组 件 组 成 这 种 体 系 结 构 的 好 处 是 把 所 有 的 工 作 负 荷 分 散 到 在 服 务 器 和 客 户 端 上 运 行 的 各 项 任 务 中, 客 户 端 负 责 业 务 逻 辑 和 向 用 户 提 供 数 据, 服 务 器 管 理 数 据 库 和 分 配 可 用 的 服 务 器 资 源 这 样, 服 务 器 为 整 个 数 据 库 系 统 提 供 自 己 最 擅 长 的 服 务, 供 所 有 客 户 机 来 分 享 ; 客 户 机 上 的 应 用 程 序 借 助 于 服 务 器 上 的 服 务 功 能 可 以 实 现 复 杂 的 应 用 本 章 将 介 绍 SQ L Server 2000 的 组 成 结 构 性 能 以 及 各 种 组 件 和 组 件 的 操 作 2.1 SQL Server 概 述 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 唱 年,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
41 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 编 写 的 程 序 都 可 以 移 植 SQL Server 的 结 构 SQ L Server 2000 由 一 系 列 相 互 协 作 的 组 件 构 成, 能 满 足 最 大 的 Web 站 点 和 企 业 数 据 处 理 系 统 存 储 和 分 析 数 据 的 需 要 同 时, 还 能 为 个 人 或 企 业 提 供 易 于 使 用 的 数 据 存 储 服 务 SQ L Server 2000 采 用 客 户 机 / 服 务 器 计 算 模 型, 如 图 2 唱 1 所 示, 即 中 央 服 务 器 用 来 存 放 数 据 库, 该 服 务 器 可 以 被 多 台 客 户 机 访 问, 数 据 库 应 用 的 处 理 过 程 分 布 在 客 户 机 和 服 务 器 上 客 户 机 / 服 务 器 计 算 模 型 分 为 两 层 的 客 户 机 / 服 务 器 结 构 和 多 层 的 客 户 机 / 服 务 器
42 第 2 章 SQL Server 2000 服 务 器 和 客 户 端 29 结 构 在 两 层 的 客 户 机 / 服 务 器 系 统 中, 客 户 机 通 过 网 络 与 运 行 SQ L Server 2000 实 例 的 服 务 器 相 连, 客 户 机 用 来 完 成 数 据 表 示 和 大 部 分 业 务 逻 辑 的 实 现, 服 务 器 完 成 数 据 的 存 储 在 多 层 ( 一 般 为 三 层 ) 的 客 户 机 / 服 务 器 系 统 中, 第 一 层 是 客 户 机, 它 只 负 责 数 据 的 表 示 ; 第 二 层 是 业 务 逻 辑 层, 负 责 业 务 逻 辑 的 实 现, 所 有 客 户 机 都 可 以 对 它 进 行 访 问 ; 第 三 层 是 数 据 库 Internet 应 图 2 唱 1 客 户 机 / 服 务 器 结 构 用 就 是 三 层 结 构 的 一 个 典 型 例 子 SQ L Server 采 用 客 户 机 / 服 务 器 结 构 的 好 处 在 于 : (1) 数 据 集 中 存 储 在 服 务 器 上, 而 不 是 分 开 存 储 在 各 个 客 户 机 上, 这 使 所 有 用 户 都 可 以 访 问 到 相 同 的 数 据 (2) 业 务 逻 辑 和 安 全 规 则 可 以 在 服 务 器 上 定 义 一 次, 而 后 被 所 有 的 客 户 机 使 用 (3) 关 系 数 据 库 服 务 器 仅 返 回 应 用 程 序 所 需 要 的 数 据, 这 样 可 以 减 少 网 络 拥 挤 程 度 (4) 数 据 存 储 在 服 务 器 上, 客 户 机 硬 件 不 需 要 具 备 存 储 和 处 理 大 量 数 据 的 能 力, 同 样, 服 务 器 也 不 需 要 具 备 数 据 表 示 的 功 能 (5) 数 据 存 储 在 服 务 器 上, 所 以 数 据 的 备 份 和 恢 复 起 来 很 容 易 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 提 供 了 对 数 据 库 文 件 进 行 分 组 管 理 的 功 能 文 件 组 可 以 将 数 据 分 布 在 多 个 磁 盘 上, 并 在 查 询 过 程 中 使 用 并 行 线 程, 从 而 改 善 系 统 性 能, 同 时 文 件 组 也 有 利 于 数 据 库 的 维 护 例 如, 可 以 将 一 个 数 据 库 的 三 个 次 要 数 据
43 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. 查 询 分 析 器 查 询 分 析 器 是 一 个 交 互 式 图 形 工 具, 它 使 数 据 库 管 理 员 和 开 发 人 员 能 够 在 其 中 编 辑
44 第 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 引 擎 事 件 进 行 监 视
45 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 性 能 监 视 器
46 第 2 章 SQL Server 2000 服 务 器 和 客 户 端 其 他 服 务 器 组 件 除 了 上 面 介 绍 的 企 业 管 理 器 查 询 分 析 器 服 务 管 理 器 事 件 探 查 器 性 能 监 视 器 之 外, 服 务 器 组 件 还 有 : (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 服 务 器 端 的 操 作 启 动 SQL Server 服 务 管 理 器 方 式 要 使 用 数 据 库, 首 先 要 启 动 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 管 理 工 具 中 的 服 务 方 式 用 户 还 可 以 通 过 Windo ws 2000 Server 控 制 面 板 中 的 管 理 工 具 下 的 服 务 来 启 动
47 34 SQL Server 数 据 库 应 用 技 术 和 关 闭 SQ L Server 使 用 控 制 面 板 进 行 配 置, 可 按 下 列 步 骤 进 行 操 作 : 单 击 开 始 设 置 控 制 面 板, 打 开 控 制 面 板 窗 口, 双 击 服 务 图 标, 打 开 服 务 对 话 框, 对 话 框 的 服 务 清 单 中 显 示 了 当 前 系 统 中 每 一 种 服 务 的 当 前 状 态 和 启 动 方 式, 如 果 要 启 动 或 停 止 某 个 服 务, 可 选 定 该 服 务, 然 后 单 击 启 动 或 停 止 按 钮 ; 要 配 置 某 个 服 务, 可 双 击 该 服 务, 或 选 定 该 服 务 然 后 单 击 启 动 按 钮, 打 开 设 置 选 定 服 务 的 启 动 方 式 的 对 话 框 一 般 情 况 下, 服 务 的 启 动 方 式 有 自 动 手 动 和 禁 用 对 于 像 M S SQ L Server 这 样 的 不 涉 及 数 据 库 复 制 分 布 式 事 务 处 理 的 服 务, 可 设 置 为 自 动 启 动, 而 像 SQ L Server Agent 和 M SD T C 之 类 的 服 务, 可 设 置 为 手 工 启 动, 以 便 在 需 要 该 服 务 时, 通 过 控 制 面 板 其 他 应 用 程 序 或 Net Start 命 令 行 来 启 动 它 因 为 无 论 启 动 哪 一 种 服 务, 都 需 要 占 用 一 定 的 系 统 资 源, 影 响 到 整 个 系 统 的 性 能, 因 此, 一 般 情 况 下, 只 启 动 那 些 需 要 的 服 务 对 sa 账 号 加 入 密 码 系 统 在 第 一 次 安 装 时, 会 建 立 一 个 名 称 为 sa 的 用 户 账 号, 用 户 使 用 这 个 账 号 可 以 登 录 SQ L Server 服 务 器 使 用 数 据 库 等 但 是 它 没 有 密 码, 任 何 人 都 可 以 sa 的 名 义 登 录 和 使 用 数 据 库, 为 了 安 全 起 见, 必 须 在 安 装 完 成 后 马 上 对 sa 账 号 设 定 密 码 1. 利 用 企 业 管 理 器 给 sa 账 号 添 加 密 码 启 动 SQ L Server 服 务 器 后, 打 开 企 业 管 理 器 并 展 开 服 务 器, 选 择 安 全 性 文 件 夹 中 的 登 录 图 标, 双 击 该 图 标, 企 业 管 理 器 右 边 窗 口 将 显 示 本 服 务 器 的 现 有 登 录 账 号 选 中 sa 账 号, 右 击 并 选 择 属 性, 如 图 2 唱 8 所 示, 在 弹 出 的 属 性 对 话 框 中 重 新 输 入 修 改 的 密 码, 并 单 击 确 定 按 钮 即 可 如 图 2 唱 9 所 示 图 2 唱 8 给 sa 账 号 添 加 密 码
48 第 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 设 置 为 新 密 码, 例 如 最 后 单 击 查 询 分 析 器 窗 口 工 具 栏 上 的 执 行 查 询 按 钮, 即
49 36 SQL Server 数 据 库 应 用 技 术 可 得 到 密 码 已 更 改 的 信 息, 如 图 2 唱 11 所 示 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 企 业 管 理 器 中 的 快 捷 菜 单
50 第 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 接 收 到 该 命 令 语 句 后, 立 即 检 查 该 用 户 是 否 有 执 行 这 条 指 令 的 权 限
51 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 数 据 库 执 行 它 们, 执 行 结 果 在 结 果 窗 格 中 以 文 本 或 表 格 形 式 显 示, 还 允 许 用 户 将 执 行 的 结 果 保 存 到 报 表 文 件 中 或 导 出 到 指 定 文 件 中 ;
52 第 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 所 示 ) 显 示
53 SQL Server 数 据 库 应 用 技 术 图 2 唱 14 以 文 本 形 式 显 示 查 询 结 果 图 2 唱 15 以 表 格 形 式 显 示 查 询 结 果 (3) 在 SQ L 查 询 分 析 器 中 输 入 数 据 除 了 可 以 在 查 询 窗 口 的 编 辑 器 窗 格 内 键 入 INSER T U PDA T E 和 DELE T E 语 句 外,SQ L 查 询 分 析 器 还 提 供 了 打 开 表 窗 口, 它 是 用 于 查 看 或 修 改 数 据 的 一 个 图 形 界 面 从 对 象 浏 览 器 或 对 象 搜 索 对 话 框 中, 右 击 包 含 要 更 新 数 据 的 表, 并 从 弹 出 菜 单 中 选 择 打 开 命 令 即 可 在 打 开 表
54 第 2 章 SQL Server 2000 服 务 器 和 客 户 端 41 可 以 同 时 指 定 多 个 文 件 扩 展 名, 每 个 扩 展 名 之 间 用 分 号 隔 开 ; 可 以 指 定 默 认 的 文 件 打 开 格 式 ; 把 制 表 位 (Tab) 修 改 为 空 格 符 号 ; 可 以 指 定 最 大 的 当 前 连 接 数, 默 认 的 连 接 数 为 32 ; 可 以 指 定 执 行 查 询 文 件 后 所 生 成 的 结 果 文 件 的 文 件 扩 展 名, 默 认 的 扩 展 名 是.rpt ; 可 以 指 定 当 执 行 完 一 批 查 询 作 业 后, 系 统 发 出 提 示 信 号, 如 Window s 消 息 嘟 嘟 声 播 放 指 定 的.WA V 文 件 等 可 以 为 指 定 的 服 务 器 配 置 选 项, 可 以 设 置 SQ L Server 登 录 选 项, 如 允 许 一 次 登 录 的 最 长 时 间, 默 认 的 时 间 是 15 秒 钟, 如 果 把 该 值 指 定 为 0, 则 表 示 登 录 时 间 是 无 限 的 ; 执 行 一 次 查 询 的 最 长 时 间, 以 及 传 递 的 信 息 包 的 大 小 等 还 可 以 设 置 查 询 选 项 及 在 SQ L Server 系 统 中 所 使 用 的 语 言 为 了 节 省 内 存, 在 结 果 标 签 页 上, 用 户 还 可 以 设 置 查 询 结 果 中 每 列 所 显 示 的 最 多 字 符 数, 该 选 项 的 默 认 值 是 每 列 256 个 字 符, 该 值 的 取 值 范 围 为 30 ~ 用 户 还 可 以 在 对 话 框 中 设 置 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 企 业 管 理 器
55 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 属 性 ( 配 置 ) 对 话 框, 这 里, 参 考 节 内 容 对 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 选 择 查 询 菜 单 下 的 显 示 执 行 计 划 和 显 示 客 户 统 计 选 项
56 第 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 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 王 刚 天 津 市 南 开 区 022 唱 王 一 明 甘 肃 省 兰 州 市 0621 唱 袁 飞 湖 南 省 长 沙 县 0731 唱 谢 仰 光 广 东 省 湛 江 市 0789 唱 孔 荣 云 南 省 昆 明 市 0871 唱 孙 强 重 庆 市 沙 坪 坝 023 唱 赵 明 上 海 市 浦 东 区 021 唱 郑 芳 江 苏 省 南 京 市 025 唱 李 伟 北 京 市 大 兴 县 010 唱 陈 红 武 汉 市 汉 口 区 027 唱 张 源 北 京 市 海 淀 区 010 唱 钱 昆 广 州 市 海 珠 区 020 唱 张 军 成 都 市 和 平 区 028_ (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 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 唱 王 刚 天 津 市 南 开 区 022 唱 王 一 明 甘 肃 省 兰 州 市 0621 唱 袁 飞 湖 南 省 长 沙 县 0731 唱 谢 仰 光 广 东 省 湛 江 市 0789 唱
57 44 SQL Server 数 据 库 应 用 技 术 孔 荣 云 南 省 昆 明 市 0871 唱 孙 强 重 庆 市 沙 坪 坝 023 唱 赵 明 上 海 市 浦 东 区 021 唱 郑 芳 江 苏 省 南 京 市 025 唱 李 伟 北 京 市 大 兴 县 010 唱 陈 红 武 汉 市 汉 口 区 027 唱 张 源 北 京 市 海 淀 区 010 唱 钱 昆 广 州 市 海 珠 区 020 唱 张 军 成 都 市 和 平 区 028_ (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 的 实 例 对 象, 使 之 不 会 出 现 在 企 业 管 理 器 中?
58 第 3 章 数 据 库 及 其 管 理 数 据 库 由 包 含 数 据 的 基 本 表 和 对 象 ( 如 视 图 索 引 存 储 过 程 和 触 发 器 等 ) 组 成 其 主 要 用 途 是 处 理 数 据 管 理 活 动 产 生 的 信 息 例 如, 学 生 管 理 中 的 大 量 学 生 信 息, 需 要 一 个 基 于 数 据 技 术 的 学 生 信 息 管 理 系 统 来 提 供 应 用 支 持 本 章 主 要 讲 述 SQ L Server 2000 中 的 系 统 数 据 库, 以 及 它 们 在 SQ L Server 中 的 使 用 和 所 提 供 的 管 理 作 用 ; 最 后 讲 述 如 何 创 建 用 户 数 据 库 和 有 关 数 据 库 的 管 理 3.1 系 统 数 据 库 每 个 SQL Server 都 包 含 两 种 类 型 的 数 据 库 : 系 统 数 据 库 和 用 户 数 据 库 系 统 数 据 库 存 储 有 关 SQL Server 的 信 息,SQL Server 使 用 系 统 数 据 库 来 操 作 和 管 理 系 统, 例 如 下 面 将 要 介 绍 的 master 数 据 库 model 数 据 库 msdb 数 据 库 和 tempdb 数 据 库 而 用 户 数 据 库 由 用 户 来 建 立, 例 如 学 生 管 理 信 息 数 据 库 SQL Server 可 以 包 含 有 一 个 或 多 个 用 户 数 据 库 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 系 统 将 受 到 影 响, 用 户 数 据 库 将 不 能 被 使 用 model 数 据 库 model( 模 板 ) 数 据 库 为 用 户 新 创 建 的 数 据 库 提 供 模 板 和 原 型 它 包 含 了 用 户 数 据 库 中 应 该 包 含 的 所 有 系 统 表 的 结 构 当 用 户 创 建 数 据 库 时, 系 统 会 自 动 地 把 model 数 据 库
59 46 SQL Server 数 据 库 应 用 技 术 中 的 内 容 复 制 到 新 建 的 用 户 数 据 库 中 熟 悉 Microsoft Word 的 用 户 都 会 有 这 样 的 体 会, 当 修 改 了 文 档 的 页 面 设 置, 并 把 该 设 置 作 为 默 认 设 置 保 存 起 来, 那 么 在 此 之 后 新 建 的 任 何 文 档 的 格 式 都 会 默 认 为 该 设 置 格 式 也 就 是 说, 在 把 被 修 改 过 的 页 面 设 置 作 为 默 认 设 置 保 存 的 同 时, 也 就 修 改 了 Microsoft Word 中 基 于 所 有 新 建 文 档 的 Normal 模 板 同 样,SQ L Server 中 的 model 数 据 库 就 是 系 统 为 用 户 创 建 新 的 数 据 库 而 制 作 的 一 个 通 用 模 板, 用 户 在 系 统 中 新 创 建 的 所 有 数 据 库 的 内 容, 最 初 都 与 该 模 板 数 据 库 具 有 完 全 相 同 的 内 容 msdb 数 据 库 msdb 数 据 库 供 SQ L Server 代 理 程 序 调 度 警 报 作 业 以 及 记 录 操 作 员 时 使 用 当 很 多 用 户 在 使 用 一 个 数 据 库 时, 经 常 会 出 现 多 个 用 户 对 同 一 数 据 的 修 改 而 造 成 数 据 不 一 致 的 现 象, 或 者 是 用 户 对 某 些 数 据 和 对 象 的 非 法 操 作 等 为 了 防 止 上 述 现 象 的 发 生,SQ L Server 里 面 有 一 套 代 理 程 序 能 够 按 照 系 统 管 理 员 的 设 定 来 监 控 上 述 现 象 的 发 生, 否 则 及 时 向 系 统 管 理 员 发 出 警 报 那 么 当 代 理 程 序 调 度 警 报 和 作 业 记 录 操 作 员 的 时 候, 系 统 要 用 到 或 实 时 产 生 许 多 相 关 信 息, 这 些 信 息 一 般 存 储 在 msdb 数 据 库 里 面 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 命 令 创 建 数 据 库 和 设 置 数 据 库 属 性, 它 还 可 以 将 创 建 数 据 库 的 脚 本 保 存 下 来, 在 其 他 机 器 上 运 行 以 创 建 相 同 的 数 据 库 此 外, 利 用 系 统 提 供 的 创 建 数 据 库 向 导 也 可
60 第 3 章 数 据 库 及 其 管 理 47 以 创 建 数 据 库 创 建 用 户 数 据 库 之 前, 必 须 先 确 定 数 据 库 的 名 称 数 据 库 所 有 者 初 始 大 小 数 据 库 文 件 增 长 方 式 数 据 库 文 件 的 最 大 允 许 增 长 的 大 小, 以 及 用 于 存 储 数 据 库 的 文 件 路 径 和 属 性 等 下 面 分 别 介 绍 两 种 创 建 数 据 库 的 方 法 使 用 企 业 管 理 器 创 建 用 户 数 据 库 在 企 业 管 理 器 界 面 里 展 开 SQ L Server 服 务 器, 右 击 数 据 库, 然 后 单 击 新 建 数 据 库 命 令 如 图 3 唱 1 所 示 图 3 唱 1 利 用 企 业 管 理 器 创 建 用 户 数 据 库 系 统 弹 出 数 据 库 属 性 对 话 框, 在 名 称 输 入 框 中 键 入 创 建 的 数 据 库 名 称 Student, 然 后 单 击 确 定 按 钮 如 图 3 唱 2 所 示 此 时 系 统 会 以 数 据 库 名 作 为 前 缀 创 建 主 数 据 库 文 件 和 事 务 日 志 文 件, 如 Student_Data.mdf 和 Student_ Log.ldf 主 数 据 库 和 事 务 日 志 文 件 图 3 唱 2 给 创 建 的 数 据 库 命 名
61 48 SQL Server 数 据 库 应 用 技 术 的 初 始 大 小 与 为 model 系 统 数 据 库 指 定 的 默 认 大 小 相 同 用 户 可 以 选 择 数 据 文 件 标 签, 对 数 据 文 件 的 默 认 属 性 进 行 修 改, 如 图 3 唱 3 所 示, 可 以 设 置 数 据 文 件 的 路 径 文 件 的 增 长 方 式 和 文 件 增 长 限 制 等 属 性 用 户 还 可 以 选 择 事 务 日 志 标 签, 对 数 据 库 的 事 务 日 志 文 件 的 默 认 属 性 进 行 修 改 如 图 3 唱 4 所 示 图 3 唱 3 设 置 数 据 文 件 属 性 图 3 唱 4 设 置 事 务 日 志 属 性 创 建 完 成 用 户 数 据 库 后, 就 可 以 在 企 业 管 理 器 的 控 制 台 根 目 录 窗 口 中, 展 开 SQ L 服 务 器 (Local)Window s N T 下 的 数 据 库, 用 户 就 可 以 看 到 新 建 立 的 数 据 库 使 用 SQL 查 询 分 析 器 创 建 用 户 数 据 库 使 用 SQ L 查 询 分 析 器 创 建 数 据 库, 其 实 就 是 在 查 询 分 析 器 的 编 辑 窗 口 中 使 用 CREA T E DA T ABASE 等 T ransact 唱 SQ L 语 句 并 运 行 这 些 T ransact 唱 SQ L 命 令, 来 创 建 用
62 第 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
63 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 数 据 库 继 承 数 据 库 选 项 设 置 事 务 日 志 在 SQ L Server 2000 中, 数 据 库 必 须 包 含 一 个 或 多 个 数 据 文 件 和 一 个 事 务 日 志 文 件, 并 且 每 个 文 件 只 能 由 一 个 数 据 库 使 用, 如 图 3 唱 5 中 的 学 生 管 理.mdf 和 学 生 管 理.ldf
64 第 3 章 数 据 库 及 其 管 理 51 两 个 文 件, 只 能 由 学 生 管 理 这 个 数 据 库 使 用 前 面 已 经 讲 过, 数 据 库 的 数 据 文 件 主 要 记 录 数 据 库 的 启 动 信 息 并 用 来 存 储 数 据, 而 数 据 库 的 事 务 日 志 文 件 里 包 含 着 用 于 恢 复 数 据 库 的 事 务 日 志 信 息 SQ L Server 使 用 各 数 据 库 的 事 务 日 志 来 恢 复 事 务 事 务 ( T ransaction) 是 作 为 单 个 逻 辑 工 作 单 元 执 行 的 一 系 列 操 作, 如 在 数 据 库 中 创 建 一 张 数 据 表 对 数 据 表 中 的 某 一 数 据 进 行 修 改 等 操 作 都 是 一 个 事 务 事 务 日 志 是 数 据 库 中 已 发 生 的 所 有 修 改 和 执 行 每 次 修 改 的 事 务 的 一 连 串 记 录 事 务 日 志 记 录 每 个 事 务 的 开 始, 它 记 录 了 在 每 个 事 务 期 间, 对 数 据 的 更 改 及 撤 销 更 改 所 需 的 足 够 信 息 对 于 一 些 大 的 操 作 ( 如 CREA T E INDEX), 事 务 日 志 则 记 录 该 操 作 发 生 的 事 实 随 着 数 据 库 中 发 生 被 记 录 的 操 作, 日 志 会 不 断 地 增 长 事 务 日 志 记 录 数 据 页 的 分 配 和 释 放, 以 及 每 个 事 务 的 提 交 或 回 滚 这 允 许 SQ L Server 采 用 下 列 方 式 应 用 ( 前 滚 ) 或 收 回 ( 回 滚 ) 每 个 事 务 在 应 用 事 务 日 志 时, 事 务 将 前 滚 SQ L Server 将 每 次 修 改 后 的 映 像 复 制 到 数 据 库 中, 或 者 重 新 运 行 语 句 ( 如 CREA T E INDEX) 这 些 操 作 将 按 照 其 原 始 发 生 顺 序 进 行 应 用 此 过 程 结 束 后, 数 据 库 将 处 于 与 事 务 日 志 备 份 时 相 同 的 状 态 当 收 回 未 完 成 的 事 务 时, 事 务 将 回 滚 SQL Server 将 恢 复 到 此 未 完 成 事 务 之 前 的 状 态 查 看 数 据 库 信 息 对 于 已 有 的 数 据 库, 可 以 分 别 利 用 企 业 管 理 器 和 Transact 唱 SQL 语 句 来 查 看 数 据 库 信 息 1. 用 企 业 管 理 器 查 看 数 据 库 信 息 打 开 SQ L Server 企 业 管 理 器, 在 控 制 台 根 目 录 窗 口 中, 选 中 需 要 查 看 信 息 的 数 据 库 student, 右 击, 在 弹 出 菜 单 中 选 择 查 看 菜 单, 在 弹 出 的 子 菜 单 中 选 择 并 单 击 任 务 板 菜 单, 如 图 3 唱 6 图 3 唱 7 所 示 图 3 唱 6 带 快 捷 菜 单 的 企 业 管 理 器
65 52 SQL Server 数 据 库 应 用 技 术 图 3 唱 7 数 据 库 信 息 在 任 务 板 的 常 规 选 项 卡 中, 此 时 会 列 出 数 据 库 备 份 和 维 护 计 划, 以 及 空 间 配 置 等 信 息 数 据 库 本 身 的 信 息 包 括 数 据 库 的 所 有 者 创 建 的 日 期 大 小 可 用 空 间 数 据 库 选 项 与 用 户 数 ; 在 维 护 方 面, 则 会 列 出 上 一 次 执 行 数 据 库 完 全 备 份 差 异 备 份 事 务 日 志 备 份 的 日 期 时 间 以 及 先 前 创 建 的 各 个 维 护 计 划 ; 至 于 空 间 配 置 则 会 将 各 个 数 据 文 件 与 日 志 文 件 的 已 使 用 空 间 可 用 空 间 及 总 空 间 清 楚 地 显 示 出 来 2. 使 用 Transact 唱 SQL 命 令 查 看 数 据 库 信 息 在 T ransact 唱 SQ L 语 句 格 式 中 有 许 多 查 看 数 据 库 信 息 的 语 句 如 可 以 使 用 存 储 过 程 sp_helpdb 来 显 示 有 关 数 据 库 和 数 据 库 参 数 的 信 息 图 3 唱 8 使 用 存 储 过 程 sp_helpdb 对 数 据 库 student 进 行 属 性 查 询, 图 中 显 示 了 该 数 据 库 的 所 有 者 状 态 创 建 时 间 文 件 尺 图 3 唱 8 使 用 sp_helpdb 显 示 数 据 库 信 息
66 第 3 章 数 据 库 及 其 管 理 53 寸 文 件 增 长 属 性 等 数 据 库 信 息 其 命 令 为 : sp_helpdb student 图 3 唱 9 显 示 了 使 用 存 储 过 程 sp_spaceused 查 看 数 据 库 空 间 信 息 结 果 显 示 了 数 据 库 student 的 基 本 信 息 和 数 据 库 的 空 间 尺 寸, 以 及 已 使 用 空 间 和 未 分 配 空 间 等 信 息 3.3 管 理 数 据 库 图 3 唱 9 使 用 sp_spaceused 显 示 数 据 库 空 间 信 息 数 据 库 在 使 用 过 程 中 一 些 属 性 会 发 生 变 化, 例 如 空 间 尺 寸 数 据 库 性 能 等, 用 户 需 要 以 自 动 或 手 工 等 方 式 对 数 据 库 进 行 增 删 改, 数 据 库 收 缩, 数 据 库 属 性 选 项 的 修 改 等 有 效 的 管 理 打 开 数 据 库 当 用 户 登 录 SQ L Server 服 务 器, 连 接 上 SQ L Server 后, 用 户 需 要 连 接 上 SQ L Server 服 务 器 中 的 一 个 数 据 库, 才 能 使 用 该 数 据 库 中 的 数 据 如 果 用 户 没 有 预 先 指 定 连 接 哪 个 数 据 库,SQ L Server 会 自 动 替 用 户 连 上 master 系 统 数 据 库 一 般 地, 用 户 需 要 指 定 连 接 SQ L Server 服 务 器 中 的 哪 个 数 据 库, 或 者 从 一 个 数 据 库 切 换 至 另 一 个 数 据 库, 可 以 在 查 询 分 析 器 的 查 询 子 窗 口 利 用 use 命 令 来 打 开 或 切 换 至 不 同 的 数 据 库 打 开 或 切 换 数 据 库 的 命 令 数 据 如 下 : USE database_name 其 中 : database_name 表 示 想 打 开 或 切 换 的 数 据 库 名 称 增 加 和 缩 减 数 据 库 容 量 当 数 据 库 的 数 据 增 长 到 要 超 过 它 的 使 用 空 间 时, 必 须 加 大 数 据 库 的 容 量 增 加 数 据 库 容 量 就 是 给 它 提 供 额 外 的 设 备 空 间 如 果 指 派 给 某 数 据 库 过 多 的 设 备 空 间, 可 以 通 过 缩 减 数 据 库 容 量 来 减 少 设 备 空 间 的 浪 费 增 加 和 缩 减 数 据 库 容 量 的 方 法 一 般 有 两 种, 即 用 T ransact 唱 SQ L 命 令 和 利 用 企 业 管 理 器 来 增 缩 数 据 库 容 量
67 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 会 报 错
68 第 3 章 数 据 库 及 其 管 理 55 图 3 唱 10 数 据 库 student 属 性 图 3 唱 11 数 据 库 文 件 的 分 配 空 间 扩 充 重 新 指 定 如 果 需 要 缩 减 数 据 库 容 量, 可 以 在 企 业 管 理 器 的 窗 口 里 选 择 student 数 据 库, 按 右 键 选 择 所 有 任 务 菜 单 下 的 子 菜 单 收 缩 数 据 库, 如 图 3 唱 12 所 示 在 弹 出 的 收 缩 数 据 库 对 话 框 中, 选 择 默 认 设 置, 单 击 确 定 按 钮, 数 据 库 将 收 缩 至 最 小 如 图 3 唱 13 所 示 如 果 单 击 收 缩 数 据 库 对 话 框 中 的 文 件 按 钮, 可 以 选 择 指 定 缩
69 56 SQL Server 数 据 库 应 用 技 术 图 3 唱 12 选 择 收 缩 数 据 库 菜 单 图 3 唱 13 收 缩 数 据 库 小 后 数 据 库 文 件 的 大 小, 如 图 3 唱 14 所 示 当 然 此 时 指 定 的 数 据 库 文 件 收 缩 后 的 尺 寸 大 小 必 须 比 现 有 数 据 库 文 件 尺 寸 小, 否 则 SQ L Server 会 报 错 查 看 目 前 数 据 库 选 项 设 定 及 修 改 设 定 数 据 库 选 项 可 以 控 制 数 据 库 是 否 为 单 用 户 使 用 模 式 或 db_ow ner 模 式 此 数 据 库 是 否 仅 可 读 取 数 据 等, 可 以 设 置 此 数 据 库 是 否 自 动 关 闭 自 动 收 缩 和 数 据 库 的 兼 容 级 别
70 第 3 章 数 据 库 及 其 管 理 57 图 3 唱 14 收 缩 数 据 库 文 件 大 小 等 选 项 如 果 想 查 看 目 前 数 据 库 选 项, 如 图 3 唱 15 所 示, 在 企 业 管 理 器 的 窗 口 里 单 击 数 据 库 student 的 属 性 菜 单, 然 后 在 弹 出 的 student 属 性 对 话 框 中 单 击 选 项 标 签, 在 这 里 可 以 查 看 和 修 改 数 据 库 选 项 设 定 图 3 唱 15 数 据 库 选 项 查 看 和 设 定
71 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 唱 16 使 用 Transact 唱 SQL 命 令 查 看 数 据 库 选 项 设 定 通 常 情 况 下, 在 一 个 应 用 程 序 的 开 发 过 程 中, 往 往 需 要 改 变 数 据 库 的 名 称, 但 是 在 SQ L Server 中 更 改 数 据 库 名 称 并 不 像 在 Window s 中 那 样 简 单, 要 改 变 名 称 的 那 个 数 据 库 很 可 能 正 被 其 他 用 户 使 用, 所 以 变 更 数 据 库 名 称 的 操 作 必 须 在 单 用 户 模 式 下 方 可 进 行, 然 后 使 用 系 统 存 储 过 程 sp_renamedb 来 更 改 数 据 库 的 名 称 例 3.5 将 数 据 库 student 更 名 为 pupil, 可 按 下 列 步 骤 进 行 操 作 : (1) 将 student 数 据 库 设 置 为 单 用 户 模 式 打 开 企 业 管 理 器 窗 口, 单 击 服 务 器, 展 开 数 据 库 项, 右 击 student 数 据 库, 选 择 属 性 选 项, 打 开 student 属 性 对 话 框, 单 击 选 项 标 签, 选 中 存 取 项 目 中 的 单 用 户 复 选 框, 单 击 确 定 按 钮 (2) 执 行 sp_renamedb 存 储 过 程 进 行 更 名 操 作 打 开 SQ L 查 询 分 析 器 窗 口, 输 入 如 下 语 句 :
72 第 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 语 句, 更 名 操 作 就 完 成 了 删 除 数 据 库 删 除 数 据 库 比 较 简 单, 但 是 应 该 注 意 的 是, 如 果 删 除 某 个 正 在 使 用 的 数 据 库 时, 则 无 法 对 该 数 据 库 进 行 删 除 可 以 使 用 DROP DA T ABASE 语 句 格 式 来 删 除 某 个 数 据 库 例 3.6 删 除 名 为 student 的 数 据 库 DROP DAT ABASE student 执 行 完 毕 后,SQ L Server 将 返 回 该 数 据 库 的 数 据 文 件 和 日 志 文 件 均 被 删 除 的 信 息 另 外, 也 可 以 在 企 业 管 理 器 中 用 鼠 标 右 键 选 择 所 要 删 除 的 数 据 库 名 字, 单 击 弹 出 子 菜 单 上 的 删 除 菜 单 项 即 可 完 成 数 据 库 的 删 除 操 作 如 图 3 唱 17 所 示 图 3 唱 17 删 除 数 据 库
73 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,
74 第 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
75 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,
76 第 3 章 数 据 库 及 其 管 理 63 (5) 将 corporation 数 据 库 的 空 间 压 缩 至 最 小 容 量 ( corporation ) (6) 删 除 scholastic 数 据 库 corporation
77 第 4 章 数 据 库 中 表 的 基 本 操 作 从 前 面 的 章 节 中, 可 以 已 经 知 道 数 据 库 由 数 据 和 对 象 组 成 一 般 而 言, 数 据 库 中 存 储 有 数 据, 但 是 正 确 高 效 地 组 织 显 示 和 使 用 存 放 在 数 据 库 中 的 数 据, 就 需 要 一 系 列 的 数 据 库 对 象 来 完 成 此 重 要 任 务 常 见 的 数 据 库 对 象 包 括 数 据 表 约 束 规 则 视 图 存 储 过 程 触 发 器 等 本 章 首 先 简 要 介 绍 有 关 的 数 据 库 对 象, 然 后 详 细 介 绍 数 据 表 约 束 默 认 和 规 则 四 个 数 据 库 对 象 的 使 用, 其 他 的 数 据 库 对 象 将 在 后 续 章 节 里 一 一 介 绍 4.1 数 据 库 对 象 数 据 表 创 建 了 用 户 数 据 库 之 后, 接 下 来 的 工 作 就 是 创 建 数 据 表 因 为 要 使 用 数 据 库 就 需 要 数 据 库 中 有 种 对 象 能 够 存 储 用 户 输 入 的 各 种 数 据, 以 后 使 用 数 据 库 完 成 各 种 应 用 也 是 在 数 据 表 的 基 础 上 完 成 的 所 以 数 据 表 是 数 据 库 中 最 重 要 的 对 象 数 据 表 被 定 义 为 列 的 集 合 它 与 电 子 表 格 类 似, 数 据 在 表 中 是 按 照 行 和 列 的 格 式 来 组 织 排 列 的 每 行 代 表 一 个 惟 一 的 记 录, 每 列 代 表 记 录 中 的 一 个 域 例 如 一 个 包 含 学 生 基 本 信 息 的 数 据 表, 表 中 的 每 一 行 代 表 一 个 学 生, 每 一 列 分 别 表 示 学 生 的 详 细 资 料, 如 学 号 姓 名 专 业 班 级 等 如 图 4 唱 1 所 示 为 student 数 据 库 中 的 学 生 基 本 信 息 表 stu_info 图 4 唱 1 数 据 表 SQ L Server 中 每 个 数 据 库 最 多 可 储 存 20 亿 个 数 据 表, 每 个 表 可 以 有 1024 列, 每 行 最 多 可 以 存 储 8060 字 节 SQ L Server 中 有 两 种 表 : 永 久 表 和 临 时 表 永 久 表 在 创 建 后
78 第 4 章 数 据 库 中 表 的 基 本 操 作 65 一 直 存 储 在 数 据 库 文 件 中, 除 非 用 户 删 除 该 表 ; 临 时 表 系 统 运 行 过 程 中 由 系 统 创 建, 一 旦 用 户 退 出 或 系 统 修 复 时, 临 时 表 将 被 自 动 删 除 约 束 现 在 已 经 了 解 了 创 建 用 户 数 据 库 和 在 数 据 库 中 创 建 表 以 存 储 数 据 读 者 自 然 会 知 道 数 据 库 中 的 数 据 是 现 实 世 界 的 反 映, 各 个 数 据 之 间 有 一 定 的 联 系 和 存 在 规 则, 如 学 生 的 学 号 必 须 是 惟 一 的, 学 生 姓 名 可 能 相 同 但 学 号 一 定 不 一 样 ; 每 个 学 生 的 性 别 只 能 是 男 和 女 中 的 一 种 取 值, 不 可 能 有 其 他 的 取 值 存 在 类 似 的 例 子 有 许 多, 这 也 说 明 一 个 问 题, 一 个 成 功 的 数 据 库 系 统 必 须 能 够 保 证 上 述 现 实 情 况 的 实 现 所 以 在 学 习 约 束 这 种 数 据 库 对 象 之 前, 有 必 要 先 学 习 数 据 完 整 性 知 识 什 么 是 数 据 完 整 性 呢? 它 就 是 指 存 储 在 数 据 库 中 数 据 的 一 致 性 和 正 确 性 为 了 保 证 数 据 完 整 性,SQ L Server 提 供 了 定 义 检 查 和 控 制 数 据 完 整 性 的 机 制 根 据 数 据 完 整 性 措 施 所 作 用 的 数 据 库 对 象 和 范 围 不 同, 数 据 完 整 性 分 为 : 实 体 完 整 性 域 完 整 性 参 照 完 整 性 和 用 户 定 义 完 整 性 四 种 实 体 完 整 性 也 成 为 行 完 整 性, 是 将 行 定 义 为 特 定 表 的 惟 一 实 体 简 而 言 之, 表 的 所 有 记 录 在 某 一 列 上 必 须 取 值 惟 一 如 记 录 有 多 个 学 生 信 息 的 表, 表 中 学 号 那 个 列 对 应 的 值 每 一 行 都 不 相 同, 否 则 没 有 一 个 列 来 区 分 每 一 行, 这 将 造 成 学 生 信 息 管 理 的 混 乱 域 完 整 性 也 称 列 完 整 性, 用 以 指 定 列 的 数 据 输 入 是 否 具 有 正 确 的 数 据 类 型 格 式 以 及 有 效 的 数 据 范 围 如 学 生 每 门 课 程 的 考 试 成 绩 必 定 是 一 个 不 大 于 100 的 正 数 值, 如 果 表 中 存 在 一 个 小 于 0 的 学 生 成 绩, 则 没 有 意 义 参 照 完 整 性 是 保 证 参 照 表 与 被 参 照 表 中 数 据 的 一 致 性 例 如, 学 生 基 本 信 息 表 中 有 学 生 的 学 号 且 学 生 成 绩 表 中 也 有 学 号 这 个 列, 那 么 两 个 表 中 的 学 号 值 必 须 一 致, 如 果 输 入 过 程 中 出 现 错 误 且 又 没 有 被 系 统 检 查 出 来, 数 据 之 间 就 造 成 混 乱 用 户 定 义 完 整 性 允 许 用 户 定 义 不 属 于 其 他 任 何 完 整 性 分 类 的 特 定 规 则 所 有 的 完 整 性 类 型 都 支 持 用 户 定 义 完 整 性 由 此 可 见, 保 证 数 据 完 整 性 在 数 据 库 管 理 系 统 中 十 分 重 要 数 据 库 系 统 中 必 须 有 些 措 施 来 防 止 数 据 混 乱 的 产 生 建 立 和 使 用 约 束 的 目 的 就 是 保 证 数 据 的 完 整 性 约 束 是 SQ L Server 强 制 实 行 的 应 用 规 则, 它 通 过 限 制 列 行 和 表 之 间 数 据 来 保 证 数 据 完 整 性 约 束 是 种 对 象, 它 可 以 加 到 表 上 以 限 制 列 行 和 表 间 的 数 据 当 表 删 除 时, 表 所 带 的 约 束 也 随 之 被 删 除 约 束 包 括 CHECK 约 束 PRIM ARY KEY 约 束 FOREIGN KEY 约 束 U NIQ UE 约 束 和 DEFA U L T 约 束 等, 这 些 内 容 将 在 4.3 节 中 介 绍 默 认 当 向 数 据 表 中 输 入 数 值 时, 希 望 表 里 面 的 某 些 列 已 经 具 有 一 些 默 认 值, 不 必 用 户 一 一 输 入, 或 者 是 用 户 现 在 还 不 准 备 输 入 但 又 不 想 空 着 例 如, 输 入 学 生 性 别 的 时 候, 先 默 认 所 有 学 生 的 性 别 为 男, 如 果 输 入 的 是 个 男 生 则 性 别 列 不 必 每 次 输 入 了, 如 果 是 女 生 就 将 男 改 为 女, 这 样 大 大 减 少 输 入 数 据 的 工 作 量 又 如 输 入 一 个 班 的 课 程 信 息, 由 于 全 班 同 学 在 一 个 教 室 上 课, 那 么 设 定 教 室 为 一 个 默 认 值, 则 每 个 同 学 的 上 课 教 室 就 不 必 输 入 了
79 66 SQL Server 数 据 库 应 用 技 术 默 认 是 实 现 上 述 目 的 的 一 种 数 据 库 对 象, 可 以 先 定 义 好, 需 要 时 将 它 绑 定 到 一 列 或 多 列 上 在 表 中 插 入 数 据 行 时, 系 统 自 动 为 没 有 指 定 数 据 的 列 提 供 事 先 定 义 的 默 认 值 规 则 有 时 会 遇 到 这 种 情 况 : 一 个 班 的 学 生 学 号 往 往 是 一 段 连 续 的 正 整 数, 而 设 计 的 表 被 其 他 用 户 输 入 学 号 值 时 必 须 要 有 效 而 不 能 是 超 出 此 范 围 的 无 效 值 ; 还 有 学 生 的 身 份 证 号 码 长 度 要 么 是 15 位 要 么 是 18 位, 不 可 能 是 其 他 位 数 长 度 的 数 值, 如 果 用 户 输 入 的 身 份 证 号 码 长 度 不 是 这 样 就 应 改 提 醒 用 户 数 值 输 入 有 误 规 则 这 种 数 据 库 对 象 的 作 用 就 是 当 向 表 中 插 入 数 据 时, 指 定 该 列 接 受 数 据 值 的 范 围 规 则 与 默 认 一 样 在 数 据 库 中 只 需 定 义 一 次, 就 可 以 被 多 次 应 用 于 任 意 表 中 的 一 列 或 多 列 上 视 图 可 以 从 现 实 情 况 来 了 解 视 图 这 种 数 据 库 对 象 一 般 地, 一 个 学 生 在 一 个 学 期 要 上 多 门 课 程, 这 些 课 程 的 成 绩 存 储 在 多 张 数 据 表 里 面, 班 主 任 想 了 解 班 上 同 学 的 学 习 成 绩, 需 要 打 开 一 张 张 的 表 来 看 能 否 将 存 储 在 多 张 表 中 的 课 程 成 绩 汇 总 在 一 张 新 表 上, 这 张 新 表 又 需 要 不 重 新 创 建 呢? 答 案 是 肯 定 的 因 为 课 程 成 绩 已 经 记 录 在 单 科 课 程 表 上, 只 要 提 取 其 数 据 就 可 以 汇 总 成 一 张 新 表, 这 样 就 可 以 避 免 数 据 多 存 储 一 遍, 即 数 据 冗 余 另 外 还 有 一 种 情 况 : 班 主 任 上 教 务 科 查 询 本 班 学 生 情 况, 但 教 务 科 数 据 库 中 记 录 的 是 全 校 的 学 生 信 息, 显 然 班 主 任 只 对 本 班 学 生 感 兴 趣, 但 全 校 的 学 生 却 都 在 一 张 表 上, 查 找 起 来 十 分 困 难 而 数 据 库 中 有 了 视 图 这 种 对 象, 上 述 问 题 迎 刃 而 解 视 图 是 从 一 个 或 多 个 相 关 联 表 中 派 生 出 来 的, 常 用 于 集 中 简 化 和 定 制 显 示 数 据 库 中 的 信 息 它 限 制 了 用 户 所 能 看 到 和 修 改 的 数 据, 视 图 像 一 个 过 滤 器, 对 于 一 个 或 多 个 基 表 中 的 数 据 进 行 筛 选 和 引 用 如 上 述 问 题 中 从 各 科 成 绩 表 中 将 本 班 学 生 的 成 绩 筛 选 出 来 做 成 一 张 视 图, 以 后 班 主 任 直 接 看 这 个 视 图, 而 不 必 一 张 张 地 查 询 所 有 表 就 可 以 查 询 到 本 班 学 生 的 成 绩 将 表 中 班 主 任 感 兴 趣 的 数 据 抽 取 出 来 做 成 一 张 视 图, 这 样 班 主 任 就 只 能 看 到 本 班 学 生 的 成 绩 而 看 不 到 其 他 班 学 生 的 成 绩 这 在 一 定 程 度 上 可 以 保 证 数 据 的 安 全 性 概 括 地 说, 视 图 是 一 种 虚 拟 表, 它 不 是 数 据 库 中 的 实 际 存 在 的 表, 其 内 容 来 自 于 其 他 一 些 基 表 ( 理 解 这 一 点 尤 其 重 要 ) 但 它 与 实 际 的 表 格 在 形 式 上 相 同, 每 个 视 图 都 含 有 列 名 与 记 录 视 图 并 不 存 储 数 据, 因 为 它 是 虚 拟 表, 视 图 中 的 数 据 实 际 上 是 对 组 成 视 图 的 基 表 内 存 储 数 据 的 引 用, 它 来 自 于 组 成 视 图 的 多 张 基 本 表 视 图 着 重 于 特 定 数 据, 可 以 简 化 数 据 操 作 以 及 组 合 区 分 数 据 有 关 视 图 的 创 建 修 改 等 操 作 将 在 第 8 章 中 加 以 介 绍 存 储 过 程 从 前 面 章 节 的 知 识 中 可 以 知 道, 许 多 种 数 据 库 操 作, 如 创 建 数 据 库 创 建 数 据 表 修 改 数 据 库 属 性 等 操 作 既 可 以 在 企 业 管 理 器 中 完 成, 也 可 以 在 查 询 分 析 器 中 编 写 T ransact 唱 SQ L 语 句 命 令 来 完 成 其 实,SQ L Server 中 所 有 的 有 关 数 据 库 ( 包 括 数 据 库 对 象 ) 的 操 作 均 能 编 写 T ransact 唱 SQ L 命 令 语 句, 在 查 询 分 析 器 中 运 行 由 此, 我 们 头 脑 中 自 然 会 想 到, 能 否 将 一 些 T ransact 唱 SQ L 命 令 语 句 打 包 成 一 个 数 据
80 第 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 提 供 支 持 用 户 自 定 义 存 储 过 程 是 由 用 户 创 建 并 能 完 成 某 一 特 定 功 能 ( 如 查 询 用 户 所 需 的 数 据 信 息 ) 的 存 储 过 程 触 发 器 节 中 简 要 介 绍 了 存 储 过 程 这 个 对 象 的 概 念 和 功 能 存 储 过 程 的 运 行 不 是 自 动 运 行, 而 是 由 应 用 程 序 激 发 运 行 这 里 将 要 讲 到 的 对 象 触 发 器, 它 是 一 种 能 够 自 动 运 行 的 SQ L Server 对 象, 由 预 先 设 定 的 条 件 触 发 当 用 户 在 操 作 数 据 表 中 的 数 据 时, 系 统 管 理 员 或 应 用 程 序 开 发 人 员 有 时 要 防 止 用 户 对 某 些 数 据 的 修 改 和 删 除, 以 避 免 出 现 对 数 据 进 行 不 一 致 或 不 正 确 的 修 改 如 果 系 统 里 面 有 编 译 好 的 触 发 器, 一 旦 用 户 对 某 些 数 据 进 行 修 改 或 删 除 操 作, 事 先 设 定 的 条 件 被 满 足 就 触 发 触 发 器 的 运 行, 要 么 是 弹 出 一 些 对 话 框 告 诉 用 户 正 在 对 数 据 进 行 非 法 操 作, 要 么 是 此 处 数 据 的 更 新 引 起 其 他 记 录 或 其 他 表 中 的 数 据 的 同 步 变 化, 从 而 避 免 出 现 数 据 不 一 致 和 不 正 确 的 混 乱 现 象 触 发 器 这 种 数 据 库 对 象 的 主 要 作 用 就 是 可 以 像 存 储 过 程 那 样 包 含 复 杂 的 处 理 逻 辑, 实 现 约 束 规 则 等 不 能 实 现 的 复 杂 的 数 据 完 整 性 和 一 致 性, 并 且 由 逻 辑 条 件 触 发 而 自 动 执 行 触 发 器 就 像 一 个 监 视 器 一 样 时 刻 监 视 着 用 户 的 数 据 操 作, 一 旦 用 户 对 数 据 的 操 作 满 足 预 先 设 定 的 条 件, 就 立 即 触 发 一 定 的 操 作 有 关 存 储 过 程 和 触 发 器 的 创 建 修 改 等 操 作 将 在 第 9 章 中 加 以 介 绍 4.2 数 据 表 的 设 计 和 创 建 SQL Server 中 的 数 据 类 型 在 创 建 表 的 时 候, 涉 及 数 据 表 结 构 的 重 要 问 题, 也 就 是 牵 涉 到 确 定 数 据 表 中 各 列 数 据 的 格 式, 是 数 值 字 符 日 期 还 是 货 币 图 像 等 其 他 格 式 的 数 据 因 为 只 有 设 计 好 了 数 据 表 中 各 列 应 该 填 写 什 么 格 式 的 数 据, 系 统 才 会 在 磁 盘 上 开 辟 相 应 的 空 间, 用 户 才 能 向 表 中 填 写 数 据 因 此 在 讲 述 数 据 表 的 操 作 前 必 须 重 点 介 绍 SQ L Server 的 数 据 类 型
81 68 SQL Server 数 据 库 应 用 技 术 在 SQ L Server 数 据 表 中, 列 的 数 据 类 型 既 可 以 是 系 统 提 供 的 数 据 类 型, 也 可 以 是 用 户 自 定 义 的 数 据 类 型 SQ L Server 系 统 提 供 了 丰 富 的 数 据 类 型 如 表 4 唱 1 所 示 bigint 表 4 唱 1 SQL Server 所 支 持 的 数 据 类 型 数 据 类 型 说 明 ( ) ~ ( ) 的 整 型 数 据 ( 所 有 数 字 ) int ( ) ~ ( ) 的 整 型 数 据 ( 所 有 数 字 ) smallint tinyint bit decimal numeric 从 ( ) 到 (32767) 的 整 数 数 据 从 0 到 255 的 整 数 数 据 1 或 0 的 整 数 数 据 到 的 固 定 精 度 和 小 数 位 的 数 字 数 据 功 能 上 等 同 于 decimal money 货 币 数 据 值 介 于 与 之 间, 精 确 到 货 币 单 位 的 1 % smallmoney 货 币 数 据 值 介 于 与 之 间, 精 确 到 货 币 单 位 的 1 % float real E ~ 1.79E 的 浮 点 精 度 数 字 E + 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 数 据, 最 大 长 度 为 ( ) 个 字 符 固 定 长 度 的 Unicode 数 据, 最 大 长 度 为 4000 个 字 符 可 变 长 度 Unicode 数 据, 其 最 大 长 度 为 4000 字 符 可 变 长 度 Unicode 数 据, 其 最 大 长 度 为 ( ) 个 字 符 固 定 长 度 的 二 进 制 数 据, 其 最 大 长 度 为 8000 个 字 节 可 变 长 度 的 二 进 制 数 据, 其 最 大 长 度 为 8000 个 字 节 可 变 长 度 的 二 进 制 数 据, 其 最 大 长 度 为 ( ) 个 字 节 游 标 的 引 用 一 种 存 储 SQL Server 支 持 的 各 种 数 据 类 型 (text ntext timestamp 和 sql_variant 除 外 ) 值 的 数 据 类 型 一 种 特 殊 的 数 据 类 型, 存 储 供 以 后 处 理 的 结 果 集 数 据 库 范 围 的 惟 一 数 字, 每 次 更 新 行 时 也 进 行 更 新 全 局 惟 一 标 识 符 (GUID) 1.SQL Server 所 支 持 的 数 据 类 型 变 量 或 列 的 数 据 类 型 定 义 了 每 一 变 量 或 列 可 以 接 受 的 数 据 值 也 就 是 说, 一 个 数 据 类 型 指 定 变 量 或 列 所 占 用 的 内 存 空 间, 也 决 定 访 问 显 示 更 新 数 据 的 方 法 表 4 唱 1 列 出 了 SQ L Server 所 支 持 的 数 据 类 型 SQ L Server 中 的 每 个 列 本 地 变 量 表 达 式 和 参 数 都 有 一 个 相 关 的 数 据 类 型, 一 般 情 况 下,SQ L Server 提 供 的 基 本 数 据 类 型 主 要 用 于 定 义 内 存 单 元 的 数 量, 以 便 指 定 信 息 大 小 和 存 储 格 式 的 类 型, 存 储 列 的 格 式, 存 储 过 程 参 数 和 本 地 变 量
82 2.SQL Server 第 4 章 数 据 库 中 表 的 基 本 操 作
83 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 类 型 是 指 取 值 范 围 在 到 之 间 的 整 数 ;numeric 类 型 则 是 指 十 进 制 数 另 外,bit 数 据 类 型 可 用 于 存 储 逻 辑 数 据, 可 用 作 状 态 标 志 位, 它 只 存 储 1 或 者 0 并 且 该 类 型 的 列 不 允 许 为 空 值 不 允 许 建 立 索 引 几 个 bit 列 可 占 用 同 一 字 节 (5) 浮 点 型 SQ L Server 2000 提 供 了 float 和 real 类 型 来 表 示 浮 点 数 据 类 型 和 实 型 数 据 其 中 float 型 数 据 的 取 值 范 围 是 E 到 1.79E ;real 型 数 据 的 取 值 范 围 是 E + 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 标 准 所 定 义 的 任 何 字 符, 该 字 符 包 括 各 种 字 符 集 中 所 定 义 的 所 有 字 符
84 第 4 章 数 据 库 中 表 的 基 本 操 作 71 其 中,ntext 数 据 类 型 用 来 存 储 大 量 的 文 本, 存 储 在 其 中 的 数 据 通 常 是 直 接 能 够 输 出 到 显 示 设 备 上 的 字 符, 显 示 设 备 可 以 是 显 示 器 窗 口 或 者 打 印 机 ntext 类 型 可 以 存 储 的 数 据 范 围 是 1 到 个 字 节 的 数 据 另 外, 值 得 注 意 的 是, 如 果 用 ntext 数 据 类 型 定 义 列 并 且 允 许 为 空, 则 使 用 INSER T 语 句 且 不 插 入 任 何 值 时, 将 不 会 分 配 任 何 空 间, 但 是 如 果 使 用 U PDA T E 语 句 来 更 新 数 据 库, 则 会 至 少 分 配 2 个 字 节 的 空 间 image 型 的 数 据 存 储 长 度 为 1 到 个 字 节 的 位 模 式, 可 以 用 来 存 储 照 片 目 录 图 片 或 者 图 画 通 常 存 储 在 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, 并 在 数 据 类 型 列 表 中 选 择 所 基 于 的 系 统 数 据 类 型
85 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 所 示 ), 单 击 全 部 除 去 按 钮, 就 可 完 成 删 除 用 户 定 义 的 数 据 类 型
86 第 4 章 数 据 库 中 表 的 基 本 操 作 73 图 4 唱 4 删 除 用 户 定 义 的 数 据 类 型 图 4 唱 5 除 去 对 象 对 话 框 也 可 以 在 查 询 分 析 器 的 窗 口 里 编 写 运 行 T ransact 唱 SQ L 命 令 来 删 除 用 户 定 义 的 数 据 类 型 例 4.3 删 除 在 student 数 据 库 中 创 建 的 数 据 类 型 birthday USE student GO EXEC sp_droptype birthday 数 据 表 设 计 与 创 建 SQ L Server 数 据 库 通 常 包 含 多 个 表, 表 是 一 个 存 储 数 据 的 实 体, 具 有 惟 一 的 名 称 可 以 说 数 据 库 实 际 上 是 表 的 集 合, 具 体 的 数 据 都 是 存 储 在 表 中 的 表 是 对 数 据 进 行 存 储 和 操 作 的 一 种 逻 辑 结 构, 每 一 个 表 代 表 一 个 对 象 例 如, 学 生 管 理 数 据 库 中 会 有 学 生 基 本 信 息 表 教 师 基 本 信 息 表 学 生 成 绩 表 课 程 信 息 表 专 业 代 码 表 教 研 室 信 息 表 教 室 信 息
87 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 学 生 编 号 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 入 学 成 绩 (2) 教 师 基 本 信 息 表 (teacher_info) 的 结 构 设 计 ( 如 表 4 唱 3 所 示 ) 表 4 唱 3 teacher_info 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 TEACHER_ID char 6 N 教 师 编 号 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 工 资 8 COURSE_ID char 10 任 教 课 程 编 码
88 第 4 章 数 据 库 中 表 的 基 本 操 作 75 (3) 学 生 成 绩 表 (stud_grade) 的 结 构 设 计 ( 如 表 4 唱 4 所 示 ) 表 4 唱 4 stud_grade 的 表 结 构 列 名 数 据 类 型 大 小 小 数 位 是 否 为 空 默 认 值 列 名 含 义 1 ST UD_ID char 10 N 学 生 编 号 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 课 程 号 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 专 业 编 号 2 SPECNAME varchar 20 专 业 名 称
89 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 教 室 编 码 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 张 源 12 唱 05 唱 1986 男 北 京 市 海 淀 区 010 唱 赵 明 08 唱 06 唱 1986 男 上 海 市 浦 东 区 021 唱 王 刚 01 唱 02 唱 1986 男 天 津 市 南 开 区 022 唱 陈 红 25 唱 10 唱 1986 女 武 汉 市 汉 口 区 027 唱 孙 强 06 唱 07 唱 1986 男 重 庆 市 沙 坪 坝 023 唱 李 伟 09 唱 01 唱 1986 男 北 京 市 大 兴 县 010 唱 钱 昆 12 唱 06 唱 1986 男 广 州 市 海 珠 区 020 唱 郑 芳 08 唱 09 唱 1986 女 江 苏 省 南 京 市 025 唱 袁 飞 03 唱 11 唱 1986 男 湖 南 省 长 沙 县 0731 唱 孔 荣 31 唱 05 唱 1986 男 云 南 省 昆 明 市 0871 唱 张 军 11 唱 03 唱 1987 男 成 都 市 和 平 区 028 唱 王 一 明 03 唱 03 唱 1986 男 甘 肃 省 兰 州 市 0621 唱 其 中, 学 号 ST UD_ID 的 10 位 数 字 说 明 年 级 (2 位 ) + 院 系 编 码 (2 位 ) + 专 业 编 码 (2 位 ) + 班 次 (2 位 ) + 顺 序 号 (2 位 ) 例 如, 之 中 第 1 ~ 2 位 的 04 表 示 2004 级, 第 3 ~ 4 位 的 01 表 示 计 算 机 工 程 系, 第 5 ~ 6 位 的 01 表 示 计 算 机 应 用 技 术 专 业, 第 7 ~ 8 位 的 01 表 示 班 次 编 号, 第 9 ~ 10 位 的 01 表 示 张 源 同 学 的 顺 序 号
90 第 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 刘 娜 女 34 讲 师 020 唱 邵 云 鹏 男 45 教 授 020 唱 孙 乐 多 男 27 助 教 020 唱 赵 一 欧 女 26 助 教 020 唱 王 吉 林 男 32 讲 师 020 唱 王 小 悦 女 35 讲 师 020 唱 其 中,T EAC HER_ID 的 6 位 说 明 院 系 编 码 (2) + 教 研 室 编 码 (2) + 顺 序 号 (2) 例 如, 计 算 机 工 程 系 编 码 (01) + 计 算 机 应 用 教 研 室 编 码 (01) + 刘 娜 老 师 的 顺 序 号 (01) (3) 学 生 成 绩 表 (stud_grade)( 如 表 4 唱 13 所 示 ) 表 4 唱 13 stud_grade 的 表 数 据 ST UD_ID 学 号 NAME 姓 名 Course_ID 课 程 号 Grade 成 绩 张 源 赵 明 王 刚 陈 红 孙 强 李 伟 钱 昆 郑 芳 袁 飞 孔 荣 张 军 (4) 课 程 信 息 表 (lesson_info)( 如 表 4 唱 14 所 示 ) Course_ID ( 课 程 号 ) Course_name ( 课 程 名 ) 表 4 唱 14 lesson_info 的 表 数 据 Course_type ( 课 程 类 型 ) Course_mark ( 课 程 学 分 ) Course_time ( 课 程 学 时 ) 计 算 机 导 论 考 查 Java 程 序 设 计 考 试 微 型 计 算 机 原 理 考 试 IT 市 场 营 销 考 查 网 络 互 联 设 备 与 配 置 考 查 多 媒 体 技 术 考 查 3 60
91 78 SQL Server 数 据 库 应 用 技 术 其 中, 课 程 号 (CO URSE_ID)10 位 数 字 的 详 细 说 明 如 下 第 1 ~ 2 位 第 3 ~ 4 位 第 5 ~ 6 位 第 7 ~ 8 位 第 9 ~ 10 位 年 级 编 号 院 系 编 号 专 业 编 号 学 期 编 号 课 程 编 号 级 计 算 机 系 计 算 机 应 用 第 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 ( 教 师 编 号 ) 唱 08 唱 唱 08 唱 唱 08 唱 唱 08 唱 唱 08 唱 唱 08 唱 (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( 专 业 名 称 ) 计 算 机 应 用 技 术 计 算 机 软 件 技 术 计 算 机 网 络 技 术 计 算 机 通 信 技 术 计 算 机 控 制 技 术 计 算 机 管 理 技 术 多 媒 体 技 术 其 中,SPECcode 的 6 位 构 成 学 年 (2) + 院 系 编 码 (2) + 专 业 顺 序 号 (2), 例 如, 之 中 第 1 ~ 2 位 的 04 表 示 2004 年, 第 3 ~ 4 位 的 01 表 示 计 算 机 工 程 系, 第 5 ~ 6 位 的 01 表 示 计 算 机 应 用 技 术 专 业 的 顺 序 号
92 第 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 ( 教 室 容 量 ) 微 机 组 装 与 维 护 实 训 微 机 投 影 仪 计 算 机 网 络 实 验 交 换 机 路 由 器 等 数 据 库 计 算 机 机 房 微 机 投 影 仪 软 件 设 计 计 算 机 机 房 微 机 投 影 仪 多 媒 体 计 算 机 机 房 微 机 投 影 仪 普 通 白 板 投 影 仪 120 其 中,ROO M_ID( 教 室 编 码 ) 的 6 位 组 成 为 2 位 楼 栋 号 2 位 楼 层 号 2 位 教 室 顺 序 号 例 如, 表 示 12 栋 7 楼 第 8 号 教 室 上 述 9 个 表 可 以 用 图 4 唱 6 来 描 述 它 们 之 间 的 相 互 关 系 图 4 唱 6 学 生 管 理 中 数 据 表 及 它 们 之 间 的 相 互 关 系 3. 创 建 数 据 表 的 实 现 例 4.4 在 student 数 据 库 中, 创 建 学 生 信 息 表 (stud_info), 该 表 存 储 某 学 院 每 个 年 级 的 学 生 信 息 表 结 构 如 表 4 唱 2 所 示 注 意 表 4 唱 2 中 的 学 生 编 号 (S T UD_ID) 为 表 的 主 键, 主 键 是 惟 一 的 且 不 能 为 空 值, 正 是 由 于 设 定 学 生 编 号 为 主 键, 才 使 得 表 中 的 每 一 行 记 录 都 不 相 同 以 区 别 每 一 名 学 生 入
93 80 SQL Server 数 据 库 应 用 技 术 学 成 绩 (M ARK) 有 个 默 认 值 560, 也 就 是 说 以 后 输 入 学 生 信 息 的 数 据 时, 如 果 不 输 入 学 生 的 入 学 成 绩, 系 统 就 默 认 设 定 它 为 560 下 面 分 别 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 来 创 建 上 述 表 (1) 使 用 企 业 管 理 器 创 建 学 生 信 息 表 在 企 业 管 理 器 里 面 展 开 已 经 创 建 的 student 数 据 库 右 击 表, 单 击 新 建 表 子 菜 单, 如 图 4 唱 7 所 示 图 4 唱 7 新 建 表 在 弹 出 的 编 辑 窗 口 中 分 别 输 入 各 列 的 名 称 数 据 类 型 长 度 是 否 允 许 为 空 等 属 性 如 图 4 唱 8 所 示 图 4 唱 8 定 义 表 结 构 属 性
94 第 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 语 法, 容 易 人 遮 雾 里, 先 看 看 下 面 的 例 子, 再 回 过 头 去 看 看 上 面 的 语 法, 就 会 理 清 头 绪 以 后 也 可 以 创 建 更 复 杂 的 数 据 表
95 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) ) 修 改 表 结 构 数 据 表 创 建 以 后, 在 使 用 过 程 中 可 能 需 要 对 原 先 定 义 的 表 的 结 构 进 行 修 改 修 改 表 的 结 构 也 可 以 通 过 SQ L Server 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 两 种 方 法 进 行 对 表 结 构 的 修 改 包 括 : 更 改 表 名 增 加 列 删 除 列 修 改 已 有 列 的 属 性 等 1. 使 用 企 业 管 理 器 修 改 表 (1) 修 改 表 名 SQ L Server 允 许 修 改 一 个 表 的 名 字, 但 当 表 名 改 变 后, 与 此 相 关 的 某 些 对 象 ( 如 视 图 存 储 过 程 等 ) 将 无 效, 因 为 它 们 都 与 表 名 有 关 因 此, 建 议 一 般 不 要 随 便 更 改 一 个 已 有 的 表 名, 特 别 是 在 其 上 已 经 定 义 了 视 图 等 对 象 在 企 业 管 理 器 中 展 开 student 数 据 库, 选 择 其 中 的 表 classroom_info 并 按 右 键, 单 击 重 命 名 子 菜 单, 如 图 4 唱 10 所 示 图 4 唱 10 修 改 表 名 接 着 在 表 名 的 位 置 上 输 入 新 的 表 名 教 室 信 息 表 后 回 车 马 上 弹 出 图 4 唱 11 所 示 的
96 第 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 企 业 管 理 器 中 打 开 表 的 设 计 表 窗 口, 可 以 对 已
97 84 SQL Server 数 据 库 应 用 技 术 图 4 唱 13 向 表 中 增 加 列 图 4 唱 14 删 除 列 有 列 的 列 名 数 据 类 型 长 度 以 及 是 否 允 许 为 空 值 等 属 性 直 接 进 行 修 改 修 改 完 毕 后, 单 击 工 具 栏 上 的 保 存 按 钮 以 保 存 修 改 结 果 但 是, 当 表 中 已 有 记 录 后, 不 要 轻 易 修 改 表 的 结 构, 特 别 是 修 改 列 的 数 据 类 型, 以 免 造
98 第 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
99 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 插 入 更 新 和 删 除 表 数 据 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 提 供 的 数 据 视 图
100 第 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 中 插 入 如 下 一 条 记 录 : , 傅 兵,08 唱 12 唱 1985, 男, 甘 肃 省 天 水 市,0863 唱 ,564000,627 USE student INSERT INTO stud_info VALUES( , 傅 兵, 08 唱 12 唱 1985, 男, 甘 肃 省 天 水 市, 0863 唱 , , 627 ) GO 打 开 表 stud_info, 看 到 表 尾 已 经 添 加 了 上 面 的 一 行 记 录 例 4.13 在 表 stud_info 中 插 入 部 分 记 录, 只 输 入 stud_id name address 三 个 列 值 : , 护 军, 河 南 省 新 乡 市
101 88 SQL Server 数 据 库 应 用 技 术 USE student INSERT stud_info(stud_id,name,address) VALUES( , 护 军, 河 南 省 新 乡 市 ) 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 唱 ,zipcode = WHERE stud_id = 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
102 第 4 章 数 据 库 中 表 的 基 本 操 作 定 义 约 束 约 束 的 类 型 通 常 创 建 表 的 步 骤 为 : 首 先 定 义 表 结 构, 即 给 表 的 每 一 列 取 列 名, 并 确 定 每 一 列 的 数 据 类 型 数 据 长 度 列 数 据 是 否 可 以 为 空 等 ; 然 后, 为 了 限 制 某 列 输 入 值 的 取 值 范 围, 以 保 证 输 入 数 据 的 正 确 性 和 一 致 性 而 设 置 约 束 ; 当 表 结 构 和 约 束 建 立 完 成 之 后, 最 后 就 可 以 向 表 中 输 入 数 据 了 本 节 将 介 绍 创 建 表 过 程 中 如 何 设 置 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 约 束 只 能 用 在 惟 一 列 上 且 不 能 为 空 值 约 束 的 创 建 查 看 删 除 节 中 已 经 介 绍 了 五 种 类 型 的 约 束, 本 节 介 绍 各 种 约 束 的 创 建 查 看 和 删 除 等 操 作 这 些 操 作 均 可 在 企 业 管 理 器 中 进 行, 也 可 利 用 T ransact 唱 SQ L 命 令 进 行
103 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 约 束
104 第 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
105 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 语 句 如 下 :
106 第 4 章 数 据 库 中 表 的 基 本 操 作 93 图 4 唱 18 设 置 PRIMARY KEY 约 束 ALTER T ABLE stud_info DROP CONSTRAINT PK_XH 4.FOREIGN KEY 约 束 的 创 建 查 看 和 删 除 节 讲 述 的 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_
107 94 SQL Server 数 据 库 应 用 技 术 info 表, 并 单 击 主 键 表 下 的 下 拉 按 钮 选 择 其 中 的 course_id ; 在 外 键 表 下 拉 选 择 框 中 选 定 stud_grade 表, 并 单 击 外 键 表 下 的 下 拉 按 钮 选 择 其 中 的 course_id 如 果 想 重 命 名 外 键 约 束 名, 可 以 在 关 系 名 文 本 框 中 重 新 输 入 新 的 名 称 最 后, 单 击 关 闭 按 钮, 即 完 成 外 键 约 束 的 创 建 这 样 两 张 表 通 过 course_id 而 连 接 起 来 如 图 4 唱 20 所 示 图 4 唱 19 创 建 外 键 关 系 图 4 唱 20 选 择 主 从 表 的 外 键 约 束 列
108 第 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 约 束 的 语 法 格 式 :
109 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 使 用 默 认 和 规 则 使 用 默 认 前 面 已 经 学 习 过 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 已 经 存 入 到 系 统 中
110 第 4 章 数 据 库 中 表 的 基 本 操 作 97 图 4 唱 22 设 置 默 认 的 属 性 创 建 了 默 认 后, 就 可 以 把 它 绑 定 到 表 上 的 某 列 从 而 可 以 使 用 该 默 认 此 时 在 企 业 管 理 器 中 单 击 student 数 据 库 下 的 默 认 值, 然 后 鼠 标 右 击 右 边 窗 口 里 的 默 认 M R _ GRADE, 在 弹 出 菜 单 中 选 择 属 性 子 菜 单, 如 图 4 唱 23 所 示 图 4 唱 23 默 认 值 属 性 此 时, 用 户 会 看 到 弹 出 的 默 认 属 性 对 话 框 里 的 绑 定 列 按 钮 已 经 由 灰 变 黑, 单 击 绑 定 列 按 钮, 如 图 4 唱 24 所 示 图 4 唱 24 绑 定 列
111 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
112 第 4 章 数 据 库 中 表 的 基 本 操 作 99 最 后 在 查 询 分 析 器 中 运 行 上 述 语 句, 即 可 将 默 认 值 560 绑 定 到 stud _ info 表 的 mark 列 使 用 规 则 前 面 已 经 学 习 了 规 则 的 概 念, 其 实 规 则 与 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 之 内 才 有 效
113 100 SQL Server 数 据 库 应 用 技 术 图 4 唱 27 设 置 规 则 属 性 图 4 唱 28 选 择 绑 定 列 使 用 T ransact 唱 SQ L 语 句 创 建 规 则 的 语 法 如 下 : CREATE RULE rule_name AS condition_expression 其 中, rule_name : 新 建 的 规 则 名 ; condition_expression : 定 义 规 则 的 条 件 执 行 绑 定 规 则 的 命 令 语 句 如 下 :
114 第 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 grade > = 0 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. 实 训 的 知 识 准 备 创 建 数 据 表, 需 要 为 每 一 个 数 据 表 的 设 计 表 结 构 参 照 节 数 据 表 样 本 的 设 计 方 法, 为 数 据 表 设 计 列 名 称 列 类 型 列 宽 度 是 否 允 许 为 空 同 时, 需 要 实 施 数 据 完 整 性, 即 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 删 除 在 企 业 管 理 器 中 创 建 的 表, 然 后
115 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)
116 第 4 章 数 据 库 中 表 的 基 本 操 作 103 自 行 练 习 : 为 表 stud_info 的 zipcode 列 建 立 DEFA U L T 约 束 (5) 向 数 据 库 student 的 表 中 插 入 数 据 1 向 学 生 信 息 表 (stud_info) 中 插 入 数 据, 并 使 用 SELEC T 语 句 检 索 所 插 入 的 数 据 INSERT INTO stud_info VALUES ( , 张 源, 12 唱 05 唱 1986, 男, 北 京 市 海 淀 区, 010 唱 , , 560) SELECT 倡 FROM 自 行 练 习 : 请 读 者 参 见 小 节 学 生 管 理 数 据 库 的 样 本, 完 成 stud_info 数 据 表 的 其 他 数 据 输 入 2 向 教 师 基 本 信 息 表 teacher_info 中 插 入 数 据, 并 在 企 业 管 理 器 中 检 查 所 插 入 的 数 据 INSERT INTO teacher_info VALUES( , 刘 娜, 女,34, 讲 师, 020 唱 ,418, ) 自 行 练 习 : 请 读 者 参 见 小 节 学 生 管 理 数 据 库 的 样 本, 完 成 teacher_info 数 据 表 的 其 他 数 据 输 入 3 在 查 询 分 析 器 中, 依 据 小 节 学 生 管 理 数 据 库 的 样 本 使 用 SQ L 命 令 分 别 向 数 据 表 stud_ grade lesson_info teach_ schedule dept _code specialty _code staffroom _ info 和 classroom_info 中 插 入 一 行 或 多 行 数 据 记 录 (6) 修 改 数 据 库 student 的 表 数 据 1 在 学 生 成 绩 表 中, 将 课 程 号 的 成 绩 在 原 来 基 础 上 增 加 10 % UPDATE stud_grade SET grade = grade + grade 倡 0.1 WHERE = 将 所 有 低 于 60 分 的 成 绩 置 空 UPDATE stud_grade SET grade = NULL WHERE 3 将 所 有 教 师 的 年 龄 增 加 1 岁 UPDATE teacher_info SET 自 行 练 习 : 将 赵 明 同 学 的 入 学 成 绩 更 新 成 与 学 号 为 的 孔 荣 同 学 的 入 学 成 绩 相 同 (7) 删 除 数 据 库 student 的 表 数 据 1 删 除 学 号 为 的 学 生 记 录 stud_info WHERE stud_id = 删 除 计 算 机 工 程 系 所 有 学 生 的 成 绩 记 录 DELETE FROM stud_grade WHERE = 01 自 行 练 习 : 使 用 SQ L 命 令 删 除 表 teacher_info 中 的 所 有 记 录
117 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
118 第 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
119 第 5 章 索 引 及 其 应 用 在 实 际 数 据 库 应 用 中, 在 数 据 表 上 创 建 和 维 护 索 引 是 一 项 重 要 的 工 作 本 章 详 细 全 面 地 介 绍 了 SQ L Server 2000 的 索 引 技 术 首 先 介 绍 索 引 的 基 本 概 念 和 特 点 ; 接 着 介 绍 创 建 索 引 的 方 法 和 维 护 索 引 的 技 术 ; 最 后 介 绍 创 建 索 引 统 计 和 查 看 索 引 信 息 5.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 将 通 过 使 用 索 引 来 获 取 所 需 要 的 数
120 第 5 章 索 引 及 其 应 用 107 据 当 SQ L Server 使 用 索 引 时, 它 会 通 过 遍 历 索 引 来 查 找 所 需 行 的 存 储 位 置, 并 通 过 查 找 的 结 果 提 取 所 需 的 行 一 般 而 言, 由 于 索 引 加 速 了 对 表 中 数 据 行 的 检 索, 所 以 通 过 使 用 索 引 可 以 加 快 SQ L Server 访 问 数 据 的 速 度, 减 少 数 据 访 问 时 间 索 引 1. 使 用 索 引 的 意 义 索 引 是 以 表 列 为 基 础 建 立 的 数 据 库 对 象, 它 保 存 着 表 中 排 序 的 索 引 列, 并 且 记 录 了 索 引 列 在 数 据 表 中 的 物 理 存 储 位 置, 实 现 了 表 中 数 据 的 逻 辑 排 序 其 主 要 目 的 是 提 高 SQ L Server 系 统 的 性 能, 加 快 数 据 的 查 询 速 度 和 减 少 系 统 的 响 应 时 间 为 了 方 便 理 解 索 引, 先 来 看 书 籍 中 的 目 录 在 一 本 书 中, 利 用 目 录 可 以 快 速 查 找 到 相 关 信 息, 而 无 须 阅 读 整 本 书 在 数 据 库 中, 数 据 的 查 询 就 是 对 数 据 表 进 行 扫 描 如 果 没 有 索 引, 就 需 要 一 行 一 行 地 扫 描 整 张 表, 势 必 查 询 花 费 的 时 间 较 长 ; 如 果 将 数 据 表 中 的 某 些 列 ( 例 如 主 键 ) 制 作 成 索 引, 查 询 数 据 的 时 候 先 查 看 一 下 索 引 而 不 扫 描 整 张 表, 这 相 当 于 先 翻 翻 书 籍 的 目 录, 从 索 引 里 确 定 了 用 户 要 查 找 的 数 据 在 表 中 哪 些 行 里 面, 再 去 扫 描 这 些 行, 查 询 的 速 度 会 大 大 加 快, 使 得 SQ L Server 系 统 的 性 能 得 以 提 高 至 此, 索 引 是 一 个 表 中 所 包 含 的 值 的 列 表, 它 说 明 了 表 中 包 含 各 个 值 的 行 所 在 的 存 储 位 置 索 引 除 了 可 以 提 高 查 询 表 内 数 据 的 速 度 以 外, 还 可 以 使 表 和 表 之 间 的 连 接 速 度 加 快 例 如, 在 实 现 数 据 的 参 照 完 整 性 时, 可 以 将 表 的 外 键 制 作 成 索 引, 这 样 将 加 速 表 与 表 之 间 的 连 接 2. 使 用 索 引 的 代 价 虽 然 索 引 具 有 如 此 多 的 优 点, 但 索 引 的 存 在 也 让 系 统 付 出 一 定 的 代 价 本 身 创 建 索 引 和 维 护 索 引 都 会 耗 费 时 间, 当 对 表 中 的 数 据 进 行 增 加 删 除 和 修 改 的 时 候, 索 引 就 要 进 行 维 护, 否 则 索 引 的 作 用 就 会 下 降 ; 另 外, 每 个 索 引 都 会 占 用 一 定 的 物 理 空 间, 如 果 占 有 的 物 理 空 间 过 多, 就 会 影 响 到 整 个 SQ L Server 系 统 的 性 能 3. 建 立 索 引 的 原 则 我 们 已 经 知 道 创 建 索 引 虽 然 可 以 提 高 查 询 速 度, 但 是 它 需 要 牺 牲 一 定 的 系 统 性 能 因 此 创 建 索 引 时, 哪 些 列 适 合 创 建 索 引, 哪 些 列 不 适 合 创 建 索 引, 需 要 进 行 一 番 判 断 考 察 才 能 进 行 索 引 的 创 建 (1) 定 义 有 主 键 的 数 据 列 一 定 要 建 立 索 引 因 为 主 键 可 以 惟 一 表 示 行, 通 过 主 键 可 以 快 速 定 位 到 表 中 的 某 一 行 (2) 定 义 有 外 键 的 数 据 列 可 以 建 索 引 外 键 列 通 常 用 于 表 与 表 之 间 的 连 接, 在 其 上 创 建 索 引 可 以 加 快 表 间 的 连 接 (3) 在 经 常 查 询 的 数 据 列 最 好 建 立 索 引 1 需 要 在 指 定 范 围 内 快 速 或 频 繁 查 询 的 数 据 列, 因 为 索 引 已 经 排 序, 其 指 定 的 范 围 是 连 续 的, 查 询 可 以 利 用 索 引 的 排 序, 加 快 排 序 查 询 的 时 间 2 经 常 用 在 W HERE 子 句 的 数 据 列, 将 索 引 建 立 在 W H ERE 字 句 的 集 合 过 程 中 需 要 快 速 或 频 繁 检 索 的 数 据 列, 可 以 让 这 些 经 常 参 与 查 询 的 数 据 列 按 照 索 引 的 排 序 进 行 查 询, 加 快 查 询 时 间
121 108 SQL Server 数 据 库 应 用 技 术 (4) 对 于 那 些 查 询 中 很 少 涉 及 的 列 重 复 值 比 较 多 的 列 不 要 建 索 引 例 如, 在 查 询 中 很 少 使 用 的 列, 有 无 索 引 并 不 能 提 高 查 询 速 度, 相 反 增 加 了 系 统 维 护 时 间 和 消 耗 了 系 统 空 间 ; 又 如, 性 别 列 只 有 列 值 男 和 女, 增 加 索 引 并 不 能 显 著 提 高 查 询 速 度 (5) 对 于 定 义 为 text,image 和 bit 数 据 类 型 的 列 上 不 要 建 立 索 引 因 为 数 据 类 型 为 text ntext 或 image 的 数 据 列 的 数 据 量 要 么 很 大, 要 么 很 小, 不 利 于 使 用 索 引 索 引 的 分 类 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. 惟 一 索 引 根 据 数 据 库 的 功 能, 可 在 数 据 库 设 计 器 中 创 建 三 种 类 型 的 索 引 惟 一 索 引 主 键 索 引 和 聚 集 索 引 惟 一 索 引 不 允 许 两 行 具 有 相 同 的 索 引 值 例 如, 如 果 在 表 中 的 姓 名 字 段 上 创 建 了 惟 一 索 引, 则 以 后 用 户 输 入 的 姓 名 将 不 能 同 名
122 第 5 章 索 引 及 其 应 用 109 聚 集 索 引 和 非 聚 集 索 引 都 可 以 是 惟 一 的 因 此, 只 要 列 中 的 数 据 是 惟 一 的, 就 可 以 在 同 一 个 表 上 创 建 一 个 惟 一 的 聚 集 索 引 和 多 个 惟 一 的 非 聚 集 索 引 只 有 当 惟 一 性 是 数 据 本 身 的 特 征 时, 指 定 惟 一 索 引 才 有 意 义 如 果 必 须 实 施 惟 一 性 以 确 保 数 据 的 完 整 性, 则 应 在 列 上 创 建 U NIQ UE 或 PRIM ARY KEY 约 束, 而 不 要 创 建 惟 一 索 引 创 建 PRIM ARY KEY 或 U NIQ UE 约 束 会 在 表 中 指 定 的 列 上 自 动 创 建 惟 一 索 引 创 建 U NIQ UE 约 束 与 手 动 创 建 惟 一 索 引 没 有 明 显 的 区 别 进 行 数 据 验 证 的 方 式 相 同, 而 且 查 询 优 化 器 不 区 分 惟 一 索 引 是 由 约 束 创 建 还 时 手 动 创 建 如 果 存 在 重 复 的 键 值, 则 无 法 创 建 惟 一 索 引 和 U NIQ UE 约 束 在 同 一 个 列 组 合 上 创 建 惟 一 索 引 而 不 是 非 惟 一 索 引 可 为 查 询 优 化 器 提 供 附 加 信 息, 所 以 最 好 创 建 惟 一 索 引 5.2 创 建 索 引 使 用 企 业 管 理 器 创 建 索 引 1. 直 接 创 建 索 引 (1) 在 企 业 管 理 器 中, 选 择 要 创 建 索 引 的 表 ( 如 数 据 库 student 中 的 学 生 成 绩 表 stud_ info), 然 后 在 此 表 的 名 字 上 右 击, 在 弹 出 的 菜 单 中 选 择 所 有 任 务 下 的 管 理 索 引, 如 图 5 唱 1 所 示 图 5 唱 1 创 建 索 引 (2) 在 如 图 5 唱 2 所 示 的 管 理 索 引 对 话 框 中 列 出 了 stud_info 表 上 的 已 有 的 索 引, 包 含 其 名 称 是 不 是 聚 集 索 引 和 索 引 列 的 名 称 可 以 单 击 对 话 框 的 新 建 按 钮, 打 开 新 建
123 110 SQL Server 数 据 库 应 用 技 术 索 引 对 话 框, 如 图 5 唱 3 所 示 设 定 索 引 的 各 属 性 图 5 唱 2 管 理 索 引 对 话 框 图 5 唱 3 新 建 索 引 对 话 框 (3) 在 新 建 索 引 对 话 框 上 的 索 引 名 称 文 本 框 中 输 入 所 要 创 建 的 索 引 名 称, 并 在 输 入 框 下 面 的 表 中 各 列 的 列 表 中 选 择 需 要 创 建 索 引 的 列 对 于 复 合 索 引, 使 用 更 改 列 顺 序 中 的 向 上 向 下 按 钮 调 整 各 组 合 列 的 组 合 顺 序
124 第 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 创 建 索 引 向 导
125 112 SQL Server 数 据 库 应 用 技 术 图 5 唱 6 选 择 数 据 库 和 表 图 5 唱 7 当 前 的 索 引 信 息 (7) 单 击 下 一 步 按 钮, 打 开 选 择 列 对 话 框, 如 图 5 唱 8 所 示 我 们 从 中 选 择 需 要 建 索 引 的 列, 如 学 号 出 生 日 期 (8) 单 击 下 一 步 按 钮, 打 开 指 定 索 引 选 项 对 话 框, 在 这 里 设 置 索 引 的 属 性, 可 以 设 置 聚 集 索 引 或 惟 一 索 引, 还 可 设 置 填 充 因 子, 如 图 5 唱 9 所 示 (9) 指 定 索 引 选 项 后, 单 击 下 一 步 按 钮, 出 现 创 建 完 成 对 话 框, 如 图 5 唱 10 所 示 在 其 名 称 文 本 框 中 为 新 建 索 引 指 定 一 个 名 称, 然 后 单 击 完 成 按 钮 出 现 消 息 提 示 创 建 索 引 成 功 时, 单 击 确 定 按 钮, 完 成 索 引 创 建
126 第 5 章 索 引 及 其 应 用 113 图 5 唱 8 选 择 列 图 5 唱 9 指 定 索 引 选 项 图 5 唱 10 创 建 完 成
127 114 SQL Server 数 据 库 应 用 技 术 使 用 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 : 该 选 项 控 制 当 尝 试 向 属 于 惟 一 聚 集 索 引 的 列 插 入 重 复 的 键 值 时 所 发 生 的 情 况
128 第 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 的 复 合 索 引
129 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 索 引 的 分 析 与 维 护 1. 索 引 分 析 SQ L Server 提 供 了 多 种 分 析 索 引 和 查 询 性 能 的 方 法, 常 用 的 有 S H OWPL A N 和 S T A TIS TICS IO 语 句 (1) S H OWPL A N 语 句 用 来 显 示 查 询 语 句 的 执 行 信 息, 包 含 查 询 过 程 中 连 接 表 时 所
130 第 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
131 118 SQL Server 数 据 库 应 用 技 术 5.3 索 引 统 计 创 建 和 修 改 统 计 信 息 SQ L Server 可 以 为 索 引 列 创 建 统 计 信 息 SQ L Server 为 维 护 某 一 个 索 引 关 键 值 的 分 布 统 计 信 息, 并 且 使 用 这 些 统 计 信 息 来 确 定 在 查 询 过 程 中 哪 一 个 索 引 是 有 用 的 查 询 的 优 化 依 赖 于 这 些 统 计 信 息 的 分 布 准 确 度 当 表 中 数 据 发 生 变 化 时,SQ L Server 周 期 性 地 自 动 修 改 统 计 信 息 索 引 统 计 被 自 动 地 修 改, 索 引 中 的 关 键 值 显 著 变 化 统 计 信 息 修 改 的 频 率 由 索 引 中 的 数 据 量 和 数 据 改 变 量 确 定 例 如, 如 果 表 中 有 行 数 据,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 或
132 第 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 表 中 全 部 索 引 的 统 计 信 息 统 计 信 息 的 查 看 与 删 除 1. 查 询 表 的 统 计 信 息 创 建 了 表 的 统 计 之 后, 可 以 使 用 DBCC SH OW_S T A TIS TICS 来 显 示 指 定 表 上 的 指
133 120 SQL Server 数 据 库 应 用 技 术 图 5 唱 11 手 动 更 新 统 计 信 息 定 目 标 的 当 前 统 计 信 息 其 语 法 如 下 : DBCC SHOW_STATISTICS (table,target) 其 中 参 数 如 下 : 瞯 table 表 名, 表 示 要 显 示 该 表 的 统 计 信 息 瞯 Target 索 引 名 称 或 集 合, 表 示 要 显 示 该 对 象 的 统 计 信 息 注 意 : 所 返 回 的 结 果 指 明 索 引 的 选 择 性 ( 所 返 回 的 密 度 越 低, 选 择 性 越 大 ), 并 提 供 用 于 确 定 索 引 对 查 询 优 化 器 是 否 有 用 的 基 本 信 息 例 如, 显 示 student 数 据 库 表 stud_grad 中 索 引 nameindex 的 统 计 信 息, 其 T ransact 唱 SQ L 语 句 及 运 行 结 果 如 图 5 唱 12 所 示 图 5 唱 12 查 询 表 的 统 计 信 息
134 第 5 章 索 引 及 其 应 用 删 除 列 的 统 计 信 息 SQ L Server 提 供 了 DROP S T A TIS TIC 命 令 来 删 除 指 定 数 据 表 列 的 统 计 信 息 例 5.11 删 除 前 面 所 创 建 的 统 计 信 息 stud_statis DROP ST ATISTICS stud_grade.grade_statis 5.4 查 看 与 删 除 索 引 查 看 表 中 的 索 引 1. 使 用 企 业 管 理 器 查 看 索 引 信 息 (1) 在 企 业 管 理 器 中, 选 择 需 要 的 表, 右 击 该 表 在 弹 出 的 菜 单 中 选 择 所 有 任 务 下 的 管 理 索 引 命 令, 打 开 管 理 索 引 对 话 框 (2) 在 管 理 索 引 对 话 框 的 现 有 索 引 列 表 中 列 出 了 当 前 表 中 有 多 少 索 引 以 及 每 个 索 引 的 名 称 类 型 和 关 键 值 (3) 如 果 需 要 了 解 某 个 索 引 更 加 详 细 的 信 息, 选 择 该 索 引, 单 击 编 辑 按 钮, 在 弹 出 的 编 辑 现 有 索 引 对 话 框 中, 可 以 看 到 当 前 索 引 的 详 细 信 息, 如 图 5 唱 13 所 示 图 5 唱 13 编 辑 现 有 索 引 对 话 框 2. 使 用 系 统 存 储 过 程 查 看 索 引 信 息 (1) 语 法 格 式 [EXEC] sp_helpindex table_name
135 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 是 包 含 要 为 其 提 供 索 引 属 性 信 息 的 表 ( 或 视 图 ) 标 识 号 的 表 达 式
136 第 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 ) 索 引 更 名 与 删 除 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
137 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
138 第 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, 其 语 句 如 下 :
139 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) 如 何 查 询 用 户 所 建 立 的 索 引 信 息?
140 第 5 章 索 引 及 其 应 用 写 出 下 列 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 上 的 碎 片
141 第 6 章 SQL Server 的 数 据 查 询 在 前 面 的 章 节 中 已 经 学 习 使 用 了 SELEC T 语 句 进 行 查 询 SELEC T 语 句 是 数 据 库 应 用 技 术 的 核 心, 学 习 SQ L Server 过 程 中 可 能 用 得 最 多 的 就 是 SELEC T 语 句 了 SELEC T 语 句 格 式 除 了 一 些 基 本 参 数 外, 还 有 大 量 的 选 项 可 以 用 于 数 据 查 询 当 构 造 SELEC T 语 句 的 时 候, 熟 悉 所 有 的 可 能 选 项 将 会 更 有 效 地 实 现 数 据 查 询 本 章 将 学 习 这 些 技 能, 即 详 细 对 SELEC T 语 句 的 通 用 形 式 及 使 用 进 行 阐 述 6.1 SELECT 语 句 中 的 数 学 问 题 SQL Server 中 的 变 量 T ransact 唱 SQ L 语 言 中 有 两 种 形 式 的 变 量, 一 种 是 用 户 自 己 定 义 的 局 部 变 量, 另 外 一 种 是 系 统 提 供 的 全 局 变 量 1. 局 部 变 量 局 部 变 量 是 一 个 能 够 拥 有 特 定 数 据 类 型 的 对 象, 它 的 作 用 范 围 仅 限 制 在 程 序 内 部 局 部 变 量 可 以 作 为 计 数 器 来 计 算 循 环 执 行 的 次 数, 或 是 控 制 循 环 执 行 的 次 数 另 外, 利 用 局 部 变 量 还 可 以 保 存 数 据 值, 以 供 控 制 流 语 句 测 试 以 及 保 存 由 存 储 过 程 返 回 的 数 据 值 等 局 部 变 量 被 引 用 时 要 在 其 名 称 前 加 上 标 而 且 必 须 先 用 DECL ARE 命 令 定 义 后 才 可 以 使 用 其 说 明 形 式 如 下 : variable_name datatype variable_name datatype...] 在 T ransact 唱 SQ L 中, 不 能 像 在 一 般 的 程 序 语 言 中 一 样 使 variable _ name = value 来 给 变 量 赋 值, 必 须 使 用 SELEC T 或 SE T 命 令 来 设 定 变 量 的 值 其 语 法 如 下 : variable_name = value variable_name = value 例 6.1 声 明 一 个 长 度 为 8 个 字 符 的 变 id, 并 赋 值 id CHAR(8) id =
142 第 6 章 SQL Server 的 数 据 查 询 全 局 变 量 全 局 变 量 是 SQ L Server 系 统 内 部 使 用 的 变 量, 其 作 用 范 围 并 不 局 限 于 某 一 程 序, 而 是 任 何 程 序 均 可 随 时 调 用 全 局 变 量 通 常 存 储 一 些 SQ L Server 的 配 置 设 定 值 和 效 能 统 计 数 据 用 户 可 在 程 序 中 用 全 局 变 量 来 测 试 系 统 的 设 定 值 或 T ransact 唱 SQ L 命 令 执 行 后 的 状 态 值 使 用 全 局 变 量 时 应 该 注 意 以 下 几 点 : (1) 全 局 变 量 不 是 由 用 户 的 程 序 定 义 的, 它 们 是 在 服 务 器 级 定 义 的 (2) 用 户 只 能 使 用 预 先 定 义 的 全 局 变 量 (3) 引 用 全 局 变 量 时, 必 须 以 标 开 头 (4) 局 部 变 量 的 名 称 不 能 与 全 局 变 量 的 名 称 相 同, 否 则 会 在 应 用 程 序 中 出 现 不 可 预 测 的 结 果 3. 注 释 符 在 T ransact 唱 SQ L 中 可 使 用 两 类 注 释 符 : (1) A NSI 标 准 的 注 释 符 唱 用 于 单 行 注 释 (2) 与 C 语 言 相 同 的 程 序 注 释 符 号, 即 / 倡 倡 /,/ 倡 用 于 注 释 文 字 的 开 始, 倡 / 用 于 注 释 文 字 的 结 尾, 可 在 程 序 中 标 识 多 行 文 字 为 注 释 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 数 据 类 型 除 外 ) 之 间 执 行 位 操 作 比 较 运 算 符 用 于 比 较 两 个 表 达 式 的 大 小 或 是 否 相 同, 其 比 较 的 结 果 是 布 尔 值, 即
143 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 运 算 符 的 优 先 级 别 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 的 常 量 值 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 的 平 方
144 第 6 章 SQL Server 的 数 据 查 询 131 例 6.2 在 查 询 分 析 器 中 使 用 CEILING() FLOOR() RO U ND() 函 数 SELECT ceiling(13.4), floor(13.4), round( ,3) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 : 例 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) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 为 : 字 符 串 函 数 字 符 串 函 数 可 以 对 二 进 制 数 据 字 符 串 和 表 达 式 执 行 不 同 的 运 算, 大 多 数 字 符 串 函 数 只 能 用 于 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 函 数 从 字 符 串 中 获 取 指 定 的 子 字 符 串, 然 后 使 用
145 132 SQL Server 数 据 库 应 用 技 术 LOWER 函 数 U PPER 函 数 对 子 字 符 串 进 行 转 换, 且 把 U PPER 函 数 嵌 套 在 LOWER 函 数 内, 或 把 LOWER 函 数 嵌 套 在 U PPER 函 数 内 在 查 询 分 析 器 中 输 入 以 下 语 句 : string_lower_upper varchar(40) string_lower_upper = Information Model Creation Issues. SELECT string_lower_upper,1,11)) AS Lower, string_lower_upper,13,5)) AS Upper, string_lower_upper,19,8))) As LowerUpper, string_lower_upper,28,7))) As UpperLower 语 句 运 行 结 果 如 图 6 唱 2 所 示 图 6 唱 2 例 6.4 中 语 句 的 运 行 结 果 例 6.5 使 用 L T RIM 函 数 删 除 字 符 变 量 中 的 起 始 空 格 string_to_trim varchar(60) string_to_trim = Five spaces are at the beginning of this string. SELECT Here is the string without the leading spaces : + 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 所 示 表 中 列 出 了 日 期 和 时 间 函 数 的 名 称 参 数 以 及 相 关 解 释
146 第 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( 不 带 纪 元 和 带 纪 元 )
147 134 SQL Server 数 据 库 应 用 技 术 例 6.11 将 数 值 型 数 据 转 换 为 字 符 型 后, 又 转 换 成 为 货 币 型 数 据 myval decimal (5,2) myval = SELECT myval AS varchar(20)) AS money) 如 果 使 用 CONVER T, 将 提 供 和 CAS T 相 似 的 功 能 SELECT CONVERT(money, 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 获 得 指 定 表 达 式 占 用 的 字 节 数
148 第 6 章 SQL Server 的 数 据 查 询 135 例 6.14 查 询 stud_info 表 中 学 号 为 的 address 列 的 定 义 长 度 和 数 据 长 度 SELECT COL_LENGT H( stud_info, address ) AS 定 义 长 度, DATALENGT H(address) AS 数 据 长 度 FROM stud_info WHERE stud_id = 其 中 : 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 = 在 查 询 分 析 器 中 运 行 上 述 语 句 将 可 以 在 学 生 成 绩 表 中 查 询 到 Java 程 序 设 计 课 程 ( 课 程 号 course_id 为 ) 的 平 均 成 绩 集 合 函 数 是 从 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 表 的 行 数
149 136 SQL Server 数 据 库 应 用 技 术 6.2 SELECT 语 句 使 用 SELEC T 语 句 进 行 数 据 查 询 是 数 据 库 的 核 心 操 作 SQ L Server 提 供 了 SELEC T 语 句 较 完 整 的 数 据 查 询 语 句 形 式, 该 语 句 具 有 灵 活 的 使 用 方 式 和 丰 富 的 功 能 简 单 查 询 简 单 查 询 的 语 句 格 式 : 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[,...]} 来 指 定 要 查 询 的 目 标 列 各 个 列 的 先 后 顺 序 可 以 与 表 中 的 顺 序 不 一 致, 用 户 可 以 根 据 应 用 的 需 要 改 变 列 的 现 实 顺 序
150 第 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 列 表 中 包 含 了 两 列 或 者 更 多 的 列, 那 么 显 示 的 结 果 将 是 这 两 列 或 者 更 多 列 的 惟 一 组 合 FROM 子 句 与 INTO 子 句 SELEC T 语 句 是 用 于 查 询 指 定 的 数 据 表 并 满 足 指 定 条 件 的 数 据 SELEC T 语 句 主 要 由 五 个 子 句 提 供 选 择, 每 一 个 子 句 有 大 量 的 选 择 项 参 数 等, 这 些 子 句 将 罗 列 在
151 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 = 男
152 第 6 章 SQL Server 的 数 据 查 询 139 使 用 SELEC T 和 IN T O 子 句 创 建 一 个 新 表 new _ stud_info, 该 表 中 包 含 stud_id, name, gender, 且 这 些 列 的 内 容 必 须 满 足 stud_info 表 中 gender 为 男 的 条 件 这 些 结 果 不 会 返 回 给 用 户 使 用 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
153 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 关 键 字 之 后 可 以 规 定 希 望 用 作 扩 展 字 符 的 字 符, 表 示 在 字 符 串 表
154 第 6 章 SQL Server 的 数 据 查 询 141 达 式 之 后 的 字 符 应 该 在 文 字 上 匹 配 例 6.25 首 先 向 学 生 基 本 信 息 表 中 添 加 一 个 学 号 为 , 姓 名 为 张 军 的 学 生, 其 电 话 为 028_ , 然 后 列 出 电 话 中 含 有 下 划 线 的 学 生 的 学 号 姓 名 电 话 地 址, 具 体 命 令 如 下 : INSERT INTO stud_info VALUES ( , 张 军, 11/03/1987, 男, 成 都 市 和 平 区, 028_ , ,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 所 示
155 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 关 键 字 之 后 提 供 的 数 值 之 中
156 第 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 条 件 运 算 符 来 排 除 列 表 中 的 一 些 数 据 行 查 询 结 果 排 序 及 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 查 询 所 有 教 师 的 编 号 姓 名 及 工 资, 并 按 工 资 进 行 降 序 排 列, 具 体 命 令
157 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 查 询 所 选 课 程 号 为 课 程 的 学 生 学 号 姓 名 和 成 绩, 并 将 结 果 按 成 绩 升 序 排 列, 具 体 命 令 如 下 : SELECT stud_id 学 号, name 姓 名 FROM stud_grade WHERE course_id = ORDER BY grade 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 18 所 示 图 6 唱 18 例 6.33 中 SELECT 语 句 的 运 行 结 果 如 果 指 定 了 SELEC T DIS TINC T, 那 么 ORDER BY 子 句 中 的 项 就 必 须 出 现 在 选 择
158 第 6 章 SQL Server 的 数 据 查 询 145 列 表 中 下 面 的 表 达 方 式 是 错 误 的 SELECT DISTINCT stud_id 学 号, name 姓 名 From stud_grade WHERE course_id = ORDER by grade 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 语 句 的 运 行 结 果
159 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 在 学 生 成 绩 表 中 统 计 参 加 多 媒 体 技 术 考 试 ( 课 程 号 为 ) 的 人 数, 具 体 命 令 如 下 : SELECT course_id 课 程 号,count(course_id) 人 数 FROM stud_grade GROUP BY course_id H AVING course_id = 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 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 在 教 师 信 息 表 中, 按 职 称 分 组 统 计 教 授 或 副 教 授 的 工 资 总 额, 具 体 命 令 如 下 :
160 第 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, 所 以 上 述 查 询 将 出 现 错 误 报 告
161 148 SQL Server 数 据 库 应 用 技 术 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 所 示
162 第 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 连 接 查 询 连 接 概 述 在 关 系 数 据 库 管 理 系 统 中, 数 据 表 建 立 时 各 数 据 之 间 的 关 系 不 必 确 定, 常 把 一 个 实 体 的 所 有 信 息 存 放 在 一 个 表 中 当 检 索 数 据 时, 通 过 连 接 操 作, 可 以 查 询 出 存 放 在 多 个 表 中 的 不 同 实 体 的 信 息 连 接 操 作 给 用 户 带 来 很 大 的 灵 活 性, 通 过 连 接 可 以 为 不 同 实 体 创 建 新 的 数 据 表, 然 后 通 过 连 接 可 以 使 用 一 个 表 中 的 数 据 来 查 询 其 他 表 的 数 据 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
163 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 语 句 的 运 行 结 果
164 第 6 章 SQL Server 的 数 据 查 询 在 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 子 句 搜 索 条 件 内 连 接 内 连 接 (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 不 等 值 连 接 的 具 体 命 令 如 下
165 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
166 第 6 章 SQL Server 的 数 据 查 询 153 列 lesson_info 表 中 course_name 列, 其 中 stud_grade 表 是 一 个 中 间 表, 如 果 没 有 它 连 接 无 法 实 现 外 连 接 在 内 连 接 查 询 中, 返 回 到 查 询 结 果 集 合 中 的 仅 是 符 合 连 接 条 件 (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 ( , 王 一 明, 03/03/1986, 男, 甘 肃 省 兰 州 市, 0621 唱 , ,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 语 句 的 运 行 结 果
167 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 张 丛 中 男 唱 INSERT INTO teacher_info VALUES( , 张 丛 中, 男,21,, 020 唱 ,310, ) 同 样, 为 了 显 示 结 果 突 出, 在 课 程 信 息 表 (lesson_info) 中 插 入 下 面 两 条 新 记 录 Course_ID ( 课 程 号 ) Course_name ( 课 程 名 ) Course_type ( 课 程 类 型 ) Course_mark ( 课 程 学 分 ) Course_time ( 课 程 学 时 ) Java web 程 序 设 计 考 试 J2EE 应 用 程 序 设 计 考 试 INSERT INTO lesson_info VALUES( , Java web 程 序 设 计, 考 试,3.5,60) INSERT INTO lesson_info VALUES( , 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 所 示
168 第 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 子 句 交 叉 连 接 交 叉 连 接 (Cross Join) 不 使 用 W H ERE 子 句 它 产 生 一 个 结 果 集, 在 这 个 结 果 集 中 包 含 了 所 连 接 的 两 个 表 中 所 有 行 的 全 部 组 合 其 数 目 为 第 一 表 中 符 合 连 接 条 件 的 行 数 与 第 二 个 表 中 符 合 连 接 条 件 的 行 数 的 乘 积 一 般 说 来, 交 叉 连 接 返 回 的 结 果 集 的 行 数 是 相 当 大 的 例 6.53 教 师 信 息 表 teacher_info 交 叉 连 接 课 程 信 息 表 lesson_info, 具 体 命 令
169 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 次 教 师 姓 名 和 教 师 编 号 自 连 接 如 果 所 连 接 的 两 个 表 为 同 一 个 表, 那 么 这 种 连 接 又 称 为 自 连 接 自 连 接 能 把 一 个 表 中 的 行 和 该 表 中 另 外 一 些 行 联 系 起 来 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 中 与 学 号 为 的 学 生 所 学 的 课 程 相 同 的 学 生 的 学 号 姓 名 课 程 号 成 绩 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 < > AND b.stud_id = 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 6 唱 33 所 示 图 6 唱 33 例 6.54 中 SELECT 语 句 的 运 行 结 果 这 里 通 过 两 个 别 名 a b 查 看 同 一 个 学 生 成 绩 表, 由 于 是 查 询 与 学 号 为 的 学 生 学 习 相 同 课 程 的 其 他 学 生, 故 在 查 询 结 果 中 不 应 该 包 括 学 号 为 的 学 生, 因 此 上 面 的 查 询 条 件 描 述 为 a.course _ id = b.course _ id A ND a.stud _ id < > A N D b.stud_id = 嵌 套 查 询 一 个 SELEC T 唱 FRO M 唱 W HERE 语 句 称 为 一 个 查 询 块 有 时 一 个 查 询 块 无 法 完 成 查 询 任 务, 需 要 一 个 子 SELEC T 的 结 果 作 为 主 查 询 语 句 的 条 件 将 一 个 查 询 块 嵌 套 在 另 一
170 第 6 章 SQL Server 的 数 据 查 询 157 个 查 询 块 的 条 件 子 句 中 的 查 询 被 称 为 嵌 套 查 询 嵌 套 查 询 可 以 用 多 个 简 单 查 询 构 成 复 杂 的 查 询, 从 而 增 强 其 查 询 功 能 SQ L Server 允 许 多 层 嵌 套 查 询, 即 一 个 子 查 询 中 还 可 以 嵌 套 其 他 子 查 询 嵌 套 查 询 一 般 的 求 解 方 法 是 由 里 向 外 进 行 处 理, 即 每 个 子 查 询 在 上 一 级 查 询 处 理 之 前 求 解, 子 查 询 的 结 果 用 于 建 立 其 父 查 询 的 查 找 条 件 子 查 询 中 所 存 取 的 表 可 以 是 父 查 询 没 有 存 取 的 表, 子 查 询 选 出 的 记 录 不 显 示 需 要 特 别 指 出 的 是, 子 查 询 的 SELEC T 语 句 中 不 能 使 用 ORDER BY 子 句,ORDER BY 子 句 只 能 对 最 终 查 询 结 果 排 序 单 值 嵌 套 查 询 子 查 询 的 返 回 结 果 是 一 个 值 的 嵌 套 查 询 称 为 单 值 嵌 套 查 询 例 6.55 查 询 与 学 号 为 的 学 生 同 在 计 算 机 应 用 技 术 专 业 学 习 的 所 有 学 生 的 学 号 姓 名 性 别 及 电 话 号 码, 具 体 命 令 如 下 : 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 = ) 在 查 询 分 析 器 中 运 行 上 述 语 句 的 结 果 如 图 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 唱 35 例 6.56 中 SELECT 语 句 的 运 行 结 果 子 查 询 的 返 回 结 果 是 一 列 值 的 嵌 套 查 询 称 为 多 值 嵌 套 查 询
171 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 的 子
172 第 6 章 SQL Server 的 数 据 查 询 159 查 询 只 返 回 真 值 或 假 值, 给 出 列 名 无 实 际 意 义 例 6.59 查 询 课 程 号 为 的 多 媒 体 技 术 这 门 课 的 成 绩 在 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 = ) 语 句 的 执 行 过 程 是 : 取 出 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 语 句 的 运 行 结 果
173 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 为 的 学 生 的 地 址 和 电 话
174 第 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 查 找 计 算 机 工 程 系 中 所 有 担 任 计 算 机 导 论 的 教 师 编 号 和 姓 名
175 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 ( ) 自 行 练 习 : 查 询 计 算 机 工 程 系 参 与 了 多 媒 体 技 术 课 程 考 试 的 学 生 的 学 号 姓 名 和 考 试 成 绩
176 第 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 按 职 称 统 计 各 个 教 研 室 的 教 师 人 数
177 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 的 学 生, 下 列 哪 条 查 询 语 句 最 合 适? ( )
178 第 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 = 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)
179 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( 成 绩 ) 代 燕 (3) 显 示 stud_grade 学 生 成 绩 表 中 成 绩 为 85,86 或 88 的 记 录 (4) 显 示 stud_grade 学 生 成 绩 表 中 成 绩 在 60 ~ 80 的 所 有 记 录 (5) 显 示 stud_grade 学 生 成 绩 表 中 的 最 高 分 的 学 生 学 号 和 课 程 号 (6) 以 入 学 成 绩 mark 降 序 显 示 stud_info 学 生 信 息 表 中 所 有 记 录 (7) 首 先 显 示 计 算 机 工 程 系 计 算 机 网 络 技 术 专 业 02 班 全 体 学 生 的 基 本 信 息, 然 后 再 统 计 计 算 机 工 程 系 计 算 机 网 络 技 术 专 业 02 班 的 学 生 人 数
180 第 6 章 SQL Server 的 数 据 查 询 167 (8) 显 示 号 课 程 的 平 均 分 (9) 在 学 生 成 绩 表 中, 显 示 最 低 分 大 于 60 最 高 分 小 于 80 的 stud_id 列 (10) 显 示 成 绩 高 于 学 号 为 课 程 号 为 的 所 有 成 绩 记 录 (11) 显 示 出 与 学 号 为 的 学 生 同 年 出 生 的 所 有 学 生 的 学 号 姓 名 和 出 生 日 期 (12) 显 示 课 程 号 为 的 同 学 人 数 和 老 师 姓 名 (13) 列 出 所 有 任 课 老 师 的 姓 名 和 所 在 院 系 (14) 在 学 生 成 绩 表 中, 显 示 存 在 有 85 分 以 上 成 绩 的 课 程 号, 并 统 计 各 门 课 程 不 及 格 人 数 在 10 人 以 上 的 课 程 数 量 (15) 显 示 计 算 机 工 程 系 老 师 所 教 课 程 的 成 绩 表 (16) 显 示 计 算 机 工 程 系 和 机 电 工 程 系 职 称 为 助 教 的 教 师 的 姓 名 和 性 别 (17) 显 示 课 程 号 为 课 程 成 绩 高 于 课 程 的 学 生 的 课 程 名 学 号 和 姓 名, 并 按 成 绩 从 高 到 低 次 序 排 列 (18) 将 stud_grade 学 生 成 绩 表 中 的 分 数 按 班 级 和 学 号 顺 序 显 示 (19) 将 stud_grade 学 生 成 绩 表 中 课 程 号 为 的 成 绩 加 5 (20) 删 除 stud_info 学 生 信 息 表 中 姓 名 为 张 源 的 学 生 记 录
181 第 7 章 数 据 复 制 数 据 复 制 是 一 个 实 现 数 据 发 布 的 方 法, 就 是 把 一 个 数 据 库 服 务 器 上 的 数 据 通 过 网 络 传 输 到 一 个 或 多 个 地 理 位 置 不 同 的 数 据 库 服 务 器 中 的 过 程 使 用 数 据 复 制 技 术 可 以 使 数 据 的 发 布 过 程 自 动 化, 以 适 应 可 伸 缩 组 织 的 需 要 减 轻 主 服 务 器 的 工 作 负 荷 并 提 高 数 据 的 使 用 效 率 本 章 将 对 SQ L Server 2000 的 复 制 技 术 进 行 详 细 的 分 析 和 介 绍 7.1 复 制 模 型 复 制 与 出 版 的 关 系 为 了 更 好 地 理 解 数 据 复 制 的 过 程 和 原 理, 可 以 把 数 据 复 制 比 喻 成 图 书 报 纸 等 出 版 过 程, 即 把 信 息 从 信 息 源 迅 速 传 送 到 信 息 接 收 处, 它 可 以 形 象 地 解 释 数 据 复 制 的 过 程 之 所 以 将 数 据 复 制 过 程 比 喻 成 出 版 过 程, 是 因 为 这 两 种 过 程 从 内 容 到 形 式 都 非 常 类 似 两 种 过 程 都 是 传 送 信 息, 复 制 过 程 主 要 传 送 数 据 信 息 两 种 过 程 中 都 有 信 息 源 和 信 息 接 收 处 出 版 过 程 中, 信 息 源 是 指 信 息 拥 有 者 的 出 版 社, 信 息 接 收 处 是 指 订 阅 了 出 版 物 的 用 户 而 复 制 过 程 中, 信 息 源 是 将 要 复 制 的 数 据 所 在 的 SQ L Server 系 统 服 务 器, 信 息 接 收 处 是 指 接 收 复 制 数 据 的 SQ L Server 系 统 服 务 器 或 其 他 服 务 器 从 信 息 传 送 方 向 来 看, 这 两 种 过 程 基 本 上 都 是 单 向 的 由 于 把 复 制 过 程 比 喻 成 了 出 版 过 程, 因 此, 复 制 过 程 中 的 组 件 也 就 可 以 相 应 地 比 喻 成 为 发 布 服 务 器 分 发 服 务 器 订 阅 服 务 器 发 布 项 目 和 订 阅 等 1. 发 布 服 务 器 发 布 服 务 器 就 像 是 一 家 出 版 社, 它 提 供 可 以 用 于 复 制 到 其 他 服 务 器 的 数 据 库, 并 检 测 这 些 数 据 的 更 新 情 况 发 布 服 务 器 包 含 了 将 要 复 制 的 数 据 所 在 的 数 据 库, 它 负 责 制 作 将 要 出 版 的 数 据, 然 后 将 这 些 数 据 的 所 有 变 化 发 送 到 分 发 服 务 器 中 出 版 是 一 个 数 据 库 中 的 一 个 或 多 个 项 目 的 集 合 这 种 多 个 项 目 的 分 组 使 得 指 定 逻 辑 相 关 的 一 组 数 据 和 数 据 库 对 象 一 起 复 制 变 得 更 容 易 项 目 是 指 定 要 复 制 的 数 据 表 数 据 分 区 或 数 据 库 对 象 项 目 可 以 是 完 整 的 表 某 几 列 ( 使 用 垂 直 筛 选 ) 某 几 行 ( 使 用 水 平 筛 选 ) 存 储 过 程 或 视 图 定 义 存 储 过 程 的 执 行 视 图 索 引 视 图 或 用 户 定 义 函 数
182 第 7 章 数 据 复 制 分 发 服 务 器 分 发 服 务 器 类 似 于 出 版 社 与 读 者 之 间 的 中 介, 例 如 分 发 站 书 店 报 刊 亭 等 分 发 服 务 器 负 责 从 发 布 服 务 器 中 接 收 数 据, 然 后 从 该 服 务 器 上 的 分 布 数 据 库 中 存 储 这 些 变 化, 最 后 按 照 指 定 的 时 间 间 隔 推 向 相 应 的 订 阅 服 务 器 中 分 发 服 务 器 分 为 远 程 分 发 服 务 器 和 本 地 分 发 服 务 器 3. 订 阅 服 务 器 订 阅 是 对 数 据 或 数 据 库 对 象 的 复 本 的 请 求 订 阅 定 义 将 接 收 的 发 布 和 接 收 的 时 间 地 点 订 阅 服 务 器 可 以 认 为 是 出 版 物 的 读 者, 它 是 接 收 数 据 的 服 务 器 订 阅 服 务 器 是 数 据 复 制 的 目 的 地, 负 责 接 收 复 制 的 数 据, 并 且 负 责 接 收 从 发 布 服 务 器 上 传 送 过 来 的 全 部 变 化 复 制 模 型 数 据 复 制 的 实 现 过 程 是 一 种 推 出 订 阅 模 型 使 用 推 出 模 型, 发 布 服 务 器 将 数 据 复 制 到 订 阅 服 务 器, 而 不 必 等 待 订 阅 服 务 器 发 出 请 求 数 据 推 出 订 阅 模 型 可 以 集 中 管 理 订 阅, 这 样 对 于 多 个 订 阅 服 务 器, 可 以 在 发 布 服 务 器 中 迅 速 地 建 立 某 个 发 布 的 全 部 订 阅 使 用 订 阅 模 型 订 阅 服 务 器 必 须 发 出 订 阅 数 据 请 求, 然 后 发 布 服 务 器 才 会 把 数 据 复 制 到 订 阅 服 务 器 SQ L Server 中 订 阅 服 务 器 必 须 注 册 为 订 阅 服 务 器 才 能 允 许 订 阅 图 7 唱 1 所 示 为 一 个 推 出 订 阅 模 型 的 数 据 复 制 示 意 图, 根 据 此 图 可 以 了 解 整 个 数 据 复 制 的 概 念 模 型 图 7 唱 1 数 据 复 制 推 出 订 阅 模 型 示 意 图 7.2 复 制 的 类 型 在 SQ L Server 中 根 据 事 务 一 致 性 各 个 站 点 的 自 主 性 和 分 区 数 据 避 免 冲 突 的 能 力, 可 以 把 复 制 类 型 分 成 快 照 复 制 事 务 复 制 和 合 并 复 制 三 种 复 制 类 型
183 170 SQL Server 数 据 库 应 用 技 术 快 照 复 制 快 照 复 制 就 是 把 在 发 布 服 务 器 上 的 出 版 物 中 的 当 前 数 据 进 行 快 照, 然 后 周 期 性 地 替 代 订 阅 服 务 器 上 的 出 版 物 此 过 程 类 似 于 快 速 拍 照 的 过 程, 即 首 先 抓 拍 发 布 服 务 器 上 的 数 据 内 容, 然 后 把 这 些 照 片 贴 在 订 阅 服 务 器 上 快 照 复 制 只 对 数 据 库 某 个 设 定 的 时 间 片 刻 时 的 数 据 进 行 复 制, 而 不 对 一 段 时 间 内 的 数 据 更 改 进 行 连 续 监 视 快 照 复 制 将 数 据 以 特 定 时 刻 的 当 时 状 态 分 发, 不 监 视 对 数 据 的 更 新 对 于 复 制 不 经 常 更 改 的 数 据, 或 不 要 求 保 持 数 据 最 新 值 ( 低 滞 后 时 间 ) 的 情 况, 快 照 复 制 是 一 种 最 好 的 数 据 复 制 方 法 发 生 同 步 时, 生 成 完 整 的 快 照 并 发 送 到 订 阅 服 务 器 当 数 据 更 改 量 大 但 不 经 常 发 生 时, 快 照 复 制 要 强 于 事 务 复 制 例 如, 如 果 某 销 售 组 织 要 维 护 一 个 产 品 价 格 表, 并 且 这 些 价 格 每 年 要 在 固 定 时 间 进 行 一 两 次 更 新, 建 议 在 数 据 更 改 后 复 制 完 整 的 数 据 快 照 如 果 发 布 的 是 只 在 发 布 服 务 器 上 更 新 相 对 较 小 的 表, 在 夜 间 创 建 快 照 也 是 一 种 选 择 当 需 要 浏 览 只 读 数 据, 而 不 在 意 该 数 据 是 不 是 最 新 的 情 况 下 ( 例 如 浏 览 价 格 表 在 线 产 品 目 录 或 决 策 支 持 数 据 ), 经 常 使 用 快 照 复 制 此 时 如 果 这 些 订 阅 服 务 器 不 是 正 在 更 新 数 据, 就 允 许 断 开 连 接 满 足 下 述 条 件 时 适 合 采 用 快 照 复 制 : 瞯 数 据 主 要 是 静 态 数 据, 不 经 常 更 改 当 数 据 确 实 发 生 更 改 时, 将 一 个 完 全 新 的 副 本 发 布 到 订 阅 服 务 器 更 有 意 义 瞯 一 个 时 期 内 允 许 有 已 过 时 的 数 据 复 本 瞯 复 制 少 量 数 据 ( 在 整 个 数 据 刷 新 为 合 理 的 情 况 下 ) 由 于 快 照 复 制 是 分 发 某 一 时 间 片 刻 的 数 据 副 本, 因 此 当 只 需 分 发 只 读 数 据 时, 特 别 适 合 使 用 快 照 复 制 另 外 快 照 复 制 是 一 次 复 制 整 个 数 据 集, 如 果 数 据 量 很 大, 那 么 将 数 据 修 改 传 播 到 订 阅 服 务 器 的 时 间 将 会 较 长, 这 时 可 以 考 虑 使 用 事 务 复 制 事 务 复 制 事 务 复 制 是 把 发 布 服 务 器 上 的 事 务 作 为 增 量 的 变 化 发 布 到 订 阅 服 务 器 中 实 际 上, 事 务 复 制 就 是 只 把 改 变 的 内 容 复 制 发 布 出 去, 而 快 照 复 制 则 不 论 数 据 是 否 变 化, 都 要 把 标 记 为 复 制 的 数 据 全 部 复 制 过 去 这 种 复 制 类 型 是 一 种 常 用 的 复 制 类 型, 因 为 它 可 以 最 大 限 度 地 降 低 事 务 一 致 性 的 延 迟 但 是 事 务 复 制 不 是 一 种 可 以 独 立 使 用 的 复 制 类 型, 而 是 建 立 在 快 照 复 制 基 础 上 的 一 种 复 制 也 就 是 说, 采 用 事 务 复 制 类 型 时, 必 须 进 行 一 次 快 照 复 制, 以 便 同 步 发 布 服 务 器 和 订 阅 服 务 器 通 过 事 务 复 制, 在 订 阅 服 务 器 上 应 用 数 据 的 初 始 快 照, 然 后, 当 发 布 服 务 器 上 发 生 数 据 修 改 时, 捕 获 个 别 的 事 务 并 传 播 到 订 阅 服 务 器 满 足 下 述 情 形 时 适 合 采 用 事 务 复 制 : 瞯 希 望 发 生 增 量 更 改 时 将 其 传 播 到 订 阅 服 务 器 上 瞯 需 要 遵 守 ACID 属 性 的 事 务 瞯 订 阅 服 务 器 可 靠 和 / 或 频 繁 地 连 接 到 发 布 服 务 器 上 事 务 复 制 用 事 务 日 志 捕 获 已 发 布 表 中 发 生 的 增 量 更 改 SQ L Server 2000 系 统 监 视 INSER T U PDA T E 和 DELE T E 语 句 或 其 他 数 据 修 改, 并 将 这 些 更 改 存 储 到 分 发 数 据 库
184 第 7 章 数 据 复 制 171 中, 这 里 分 发 数 据 库 相 当 于 一 个 可 靠 的 队 列 然 后 将 更 改 传 播 到 订 阅 服 务 器 上, 并 按 其 发 生 次 序 加 以 应 用 合 并 复 制 合 并 复 制 是 从 发 布 服 务 器 向 订 阅 服 务 器 分 发 数 据 的 过 程, 该 复 制 类 型 使 发 布 服 务 器 和 订 阅 服 务 器 得 以 在 连 接 或 未 连 接 时 更 新 数 据, 然 后 在 连 接 时 合 并 所 有 站 点 的 更 新 合 并 复 制 使 许 多 不 同 的 站 点 得 以 自 主 工 作, 然 后 在 晚 一 些 时 候 再 将 更 新 合 并 成 一 个 统 一 的 结 果 首 先 在 订 阅 服 务 器 上 应 用 初 始 快 照, 然 后 SQ L Server 2000 在 发 布 服 务 器 上 和 订 阅 服 务 器 上 跟 踪 已 发 布 数 据 的 更 改 数 据 或 是 连 续 的 或 是 按 调 度 时 间 或 是 按 需 在 服 务 器 之 间 同 步 由 于 更 新 是 在 多 个 服 务 器 上 进 行 的, 所 以 同 一 数 据 可 能 由 发 布 服 务 器 或 者 由 多 个 订 阅 服 务 器 进 行 了 更 新, 于 是, 合 并 更 新 时 就 可 能 出 现 冲 突 合 并 复 制 包 含 默 认 或 自 定 义 冲 突 解 决 选 项, 可 在 配 置 合 并 复 制 时 加 以 定 义 当 冲 突 发 生 时, 合 并 代 理 程 序 唤 醒 调 用 一 个 冲 突 解 决 程 序, 并 决 定 接 受 和 向 其 他 站 点 传 播 哪 些 数 据 满 足 下 述 条 件 时 适 合 使 用 合 并 复 制 : 瞯 多 个 订 阅 服 务 器 需 要 在 不 同 时 刻 更 新 数 据, 并 将 这 些 更 改 传 播 到 发 布 服 务 器 和 其 他 订 阅 服 务 器 瞯 订 阅 服 务 器 需 要 接 收 数 据, 脱 机 更 改 数 据, 然 后 将 更 改 同 步 到 发 布 服 务 器 和 其 他 订 阅 服 务 器 瞯 当 数 据 在 多 个 站 点 更 新 时, 用 户 不 希 望 看 到 许 多 冲 突 ( 因 为 数 据 先 筛 选 成 分 区, 然 后 出 版 到 不 同 的 订 阅 服 务 器 ; 或 者 因 为 使 用 了 应 用 程 序 ) 但 是, 如 果 确 实 发 生 了 冲 突, 则 违 反 ACID 属 性 是 可 以 接 受 的 合 并 复 制 是 由 快 照 代 理 程 序 与 合 并 复 制 代 理 程 序 实 现 的, 可 以 分 为 四 个 步 骤 : (1) 由 快 照 代 理 程 序 初 始 化 发 布 服 务 器 和 订 阅 服 务 器 (2) 合 并 代 理 程 序 使 用 那 些 由 快 照 代 理 为 了 建 立 订 阅 数 据 库 而 复 制 的 文 件 (3) 合 并 代 理 程 序 从 发 布 服 务 器 中 取 出 变 化, 然 后 把 这 些 变 化 应 用 到 订 阅 服 务 器 中 (4) 合 并 代 理 程 序 从 所 有 的 订 阅 服 务 器 中 取 出 变 化, 然 后 把 这 些 变 化 应 用 到 发 布 服 务 器 中 7.3 配 置 复 制 配 置 复 制 是 标 识 企 业 内 的 发 布 服 务 器 分 发 服 务 器 和 订 阅 服 务 器 的 过 程, 使 用 SQ L Server 2000 工 具 配 置 发 布 服 务 器 分 发 服 务 器 和 订 阅 服 务 器 以 用 于 复 制, 并 且 将 来 在 必 要 时 修 改 或 禁 用 复 制 分 发 服 务 器 是 拥 有 分 发 数 据 库 的 服 务 器, 它 保 存 变 化 的 事 务 日 志 且 将 这 些 事 务 日 志 传 送 到 订 阅 服 务 器 上 发 布 服 务 器 可 以 指 定 要 发 布 的 数 据 所 在 的 数 据 库 指 定 远 程 分 发 服 务 器 允 许 订 阅 出 版 物 的 订 阅 服 务 器 建 立 订 阅 服 务 器 就 是 在 订 阅 服 务 器 上 选 择 发 布 服 务 器 和 接 收 服 务 器 配 置 复 制 的 步 骤 如 下 : 瞯 标 识 分 发 服 务 器
185 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 所 示 在 该 对 话 框 中, 可 以 选 择 在 发 布 服 务 器 和 订 阅 服 务 器 之 间 同 步 化 数 据 和 分 发 数 据 库 所 在 的 分 发 服 务 器 并 且 在 这 里 选 择 本 地 服 务 器 作 为 分 发 服 务 器
186 第 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 中 的 下 一 步 按 钮, 出
187 174 SQL Server 数 据 库 应 用 技 术 图 7 唱 6 指 定 快 照 文 件 夹 图 7 唱 7 自 定 义 配 置 现 自 定 义 配 置 对 话 框, 如 图 7 唱 7 所 示 在 这 里 可 以 指 定 使 用 该 分 发 服 务 器 和 分 布 服 务 器 和 订 阅 服 务 器, 还 可 以 确 定 存 储 分 发 数 据 库 的 名 称 和 位 置 这 里 选 择 自 定 义 设 置 3. 为 发 布 服 务 器 指 定 分 发 数 据 库 单 击 图 7 唱 7 中 的 下 一 步 按 钮, 就 创 建 了 分 发 数 据 库, 然 后 就 可 以 给 发 布 服 务 器 指 定 分 发 数 据 库 了, 如 图 7 唱 8 所 示 (1) 单 击 下 一 步 按 钮, 出 现 如 图 7 唱 9 所 示 的 发 布 数 据 库 对 话 框, 这 里 选 择 student 数 据 库 作 为 发 布 数 据 库 (2) 单 击 下 一 步, 出 现 如 图 7 唱 10 所 示 的 激 活 订 阅 服 务 器 对 话 框, 在 这 里 启 用 该 订 阅 服 务 器
188 第 7 章 数 据 复 制 175 图 7 唱 8 启 用 发 布 服 务 器 图 7 唱 9 启 用 发 布 数 据 库 图 7 唱 10 启 用 订 阅 服 务 器
189 176 SQL Server 数 据 库 应 用 技 术 (3) 单 击 下 一 步, 则 出 现 向 导 的 确 认 对 话 框, 如 图 7 唱 11 所 示 最 后 单 击 完 成 按 钮, 完 成 配 置 发 布 和 分 发 数 据 库 的 操 作 这 时, 系 统 在 企 业 管 理 器 里 面 产 生 复 制 监 视 器 工 具, 如 图 7 唱 12 所 示 复 制 监 视 器 可 以 检 测 系 统 的 复 制 性 能 图 7 唱 11 向 导 的 确 认 7.4 建 立 和 使 用 复 制 创 建 发 布 图 7 唱 12 企 业 管 理 器 中 的 复 制 监 视 器 配 置 好 发 布 服 务 器 之 后, 就 可 以 在 发 布 服 务 器 上 指 定 要 发 布 的 数 据 所 在 的 数 据 库, 然 后 创 建 发 布 可 以 使 用 企 业 管 理 器 中 的 创 建 发 布 向 导 来 完 成 发 布 的 创 建 工 作 其 步 骤
190 第 7 章 数 据 复 制 177 如 下 1. 指 定 要 发 布 的 数 据 所 在 的 数 据 库 首 先, 在 企 业 管 理 器 中 选 择 数 据 库 服 务 器, 然 后 单 击 工 具 栏 上 的 工 具 按 钮, 单 击 其 中 的 向 导 子 菜 单, 然 后 展 开 选 择 向 导 对 话 框 中 的 复 制 容 器, 双 击 创 建 发 布 向 导 以 启 动 向 导, 出 现 如 图 7 唱 13 所 示 的 欢 迎 使 用 创 建 发 布 向 导 对 话 框 图 7 唱 13 欢 迎 使 用 创 建 发 布 向 导 单 击 下 一 步, 在 选 择 发 布 数 据 库 对 话 框 中, 选 择 包 含 发 布 数 据 库 和 对 象 的 数 据 库 student, 如 图 7 唱 14 所 示 图 7 唱 14 选 择 发 布 数 据 库 如 果 是 sysadmin 服 务 器 角 色 成 员 运 行 创 建 发 布 向 导, 向 导 将 显 示 所 有 用 户 数 据
191 178 SQL Server 数 据 库 应 用 技 术 库, 并 且 为 复 制 自 动 启 用 所 选 数 据 库 如 果 是 数 据 库 中 的 db_ow ner 固 定 数 据 库 角 色 成 员 运 行 创 建 发 布 向 导, 仅 有 先 前 为 复 制 启 用 的 数 据 库 才 会 出 现, 并 且 这 些 数 据 库 都 属 于 这 个 db_ow ner 单 击 图 7 唱 14 中 的 下 一 步 按 钮, 在 选 择 发 布 类 型 对 话 框 中, 选 择 发 布 类 型, 如 图 7 唱 15 所 示 可 以 选 择 快 照 发 布 事 务 发 布 或 合 并 发 布 图 7 唱 15 选 择 发 布 类 型 2. 创 建 快 照 发 布 在 图 7 唱 15 中 选 择 快 照 发 布, 单 击 下 一 步 按 钮, 系 统 弹 出 指 定 订 阅 服 务 器 的 类 型 对 话 框, 如 图 7 唱 16 所 示 图 7 唱 16 指 定 订 阅 服 务 器 的 类 型
192 第 7 章 数 据 复 制 179 选 择 运 行 SQ L Server 2000 的 服 务 器 在 这 里 如 果 选 择 运 行 SQ L Server 7.0 版 的 服 务 器 或 异 类 数 据 源, 那 么 这 些 类 型 的 订 阅 服 务 器 由 于 不 兼 容 将 不 会 在 向 导 中 显 示 单 击 图 7 唱 16 中 的 下 一 步 按 钮, 如 图 7 唱 17 所 示, 在 这 里 指 定 作 为 项 目 发 布 的 数 据 库 对 象 可 以 选 择 表 存 储 过 程 和 视 图 等 数 据 库 对 象 来 作 为 发 布 项 目 这 里 选 择 数 据 库 student 中 的 全 部 表 作 为 发 布 对 象 然 后 单 击 下 一 步 按 钮 图 7 唱 17 指 定 项 目 在 如 图 7 唱 18 所 示 的 自 定 义 发 布 的 属 性 对 话 框 中, 可 以 选 择 定 义 数 据 筛 选 启 用 匿 名 订 阅 和 为 快 照 代 理 程 序 配 置 自 定 义 调 度 来 自 定 义 发 布 图 7 唱 18 自 定 义 发 布 的 属 性
193 180 SQL Server 数 据 库 应 用 技 术 如 果 选 择 自 定 义 发 布, 则 出 现 如 图 7 唱 19 所 示 的 对 话 框, 可 以 选 择 水 平 或 垂 直 地 筛 选 发 布 中 的 项 目 筛 选 发 布 中 的 项 目 就 是 从 发 布 表 中 排 除 指 定 的 列 或 者 行 图 7 唱 19 筛 选 数 据 同 时 选 择 水 平 和 垂 直 筛 选 发 布, 系 统 弹 出 如 图 7 唱 20 所 示 的 对 话 框, 这 里 可 以 选 择 清 除 一 个 发 布 项 目 中 指 定 不 发 布 的 行 和 列 默 认 情 况 下 发 布 所 有 列 图 7 唱 20 筛 选 表 的 列 单 击 下 一 步 按 钮, 在 如 图 7 唱 21 所 示 的 对 话 框 里, 可 以 选 择 允 许 匿 名 订 阅, 匿 名 订 阅 主 要 为 了 Internet 发 布 或 发 布 到 大 量 订 阅 服 务 器 这 里 选 择 否, 只 允 许 署 名 订 阅
194 第 7 章 数 据 复 制 181 图 7 唱 21 允 许 匿 名 订 阅 单 击 下 一 步 按 钮, 在 如 图 7 唱 22 所 示 的 设 置 快 照 代 理 程 序 调 度 对 话 框 中, 可 以 接 受 默 认 调 度 或 单 击 更 改 按 钮 修 改 调 度 图 7 唱 22 设 置 快 照 代 理 程 序 调 度 最 后, 在 完 成 创 建 发 布 向 导 对 话 框 中, 可 以 查 看 所 有 的 发 布 选 项, 然 后 单 击 完 成 按 钮, 如 图 7 唱 23 所 示 上 面 是 创 建 快 照 发 布, 限 于 篇 幅, 事 务 发 布 和 配 置 合 并 发 布 请 读 者 自 行 练 习 订 阅 在 SQ L Server 2000 中, 可 以 通 过 强 制 订 阅 和 请 求 订 阅 来 订 阅 被 发 布 的 项 目
195 182 SQL Server 数 据 库 应 用 技 术 图 7 唱 23 向 导 的 确 认 1. 强 制 订 阅 强 制 订 阅 是 发 布 服 务 器 在 创 建 或 编 辑 发 布 的 同 时 建 立 的 订 阅 强 制 订 阅 可 以 在 发 布 服 务 器 里 定 义 强 制 订 阅, 并 且 一 次 可 以 为 一 个 发 布 建 立 多 个 订 阅 服 务 器 强 制 订 阅 通 常 用 在 发 生 数 据 更 改 时 必 须 立 即 发 送 更 改 到 订 阅 服 务 器 的 这 种 类 型 的 应 用 中 强 制 订 阅 主 要 运 用 在 需 要 较 高 的 安 全 性 或 者 是 在 分 发 服 务 器 上 产 生 更 高 的 处 理 器 开 销 时 且 不 会 影 响 系 统 的 整 体 性 能 的 场 合 2. 请 求 订 阅 请 求 订 阅 是 从 订 阅 服 务 器 建 立 的 订 阅 当 有 订 阅 请 求 时, 订 阅 服 务 器 对 订 阅 请 求 进 行 初 始 化 后, 发 布 对 订 阅 请 求 的 允 许 并 且 对 订 阅 进 行 注 册, 如 果 允 许 匿 名 订 阅, 则 无 需 进 行 注 册 订 阅 服 务 器 的 系 统 管 理 员 或 者 数 据 库 拥 有 者 决 定 接 受 哪 个 发 布 以 及 何 时 进 行 接 收 请 求 订 阅 最 适 用 于 需 要 低 安 全 性 的 发 布, 且 能 支 持 多 个 订 阅 服 务 器 ( 例 如 使 用 Internet 的 订 阅 服 务 器 ) 的 发 布 创 建 强 制 订 阅 创 建 了 发 布 以 后, 就 可 以 在 发 布 服 务 器 上 通 过 强 制 订 阅 向 导 配 置 强 制 订 阅 强 制 订 阅 是 在 发 布 服 务 器 中 央 配 置, 并 初 始 化 订 阅 可 以 在 企 业 管 理 器 的 工 具 栏 中 单 击 向 导, 展 开 选 择 向 导 对 话 框 的 复 制 容 器, 然 后 双 击 创 建 强 制 订 阅 向 导 启 动 向 导, 出 现 欢 迎 使 用 强 制 订 阅 向 导 对 话 框, 如 图 7 唱 24 所 示 这 里 将 显 示 本 向 导 中 的 高 级 选 项 的 复 选 框 选 上, 以 便 在 显 示 高 级 选 项 时 允 许 设 置 可 更 新 订 阅 选 项 以 及 配 置 可 用 复 制 代 理 程 序, 使 其 在 订 阅 服 务 器 而 不 是 在 分 发 服 务 器 中 运 行 单 击 下 一 步 按 钮, 在 如 图 7 唱 25 所 示 的 选 择 订 阅 服 务 器 对 话 框 中, 选 择 要 强 制 接 收 发 布 的 订 阅 服 务 器 如 果 是 sysadmin 服 务 器 角 色 成 员 运 行 强 制 订 阅 向 导, 可 以 在 空 闲 时 启 用 一 个 注 册
196 第 7 章 数 据 复 制 183 图 7 唱 24 向 导 的 欢 迎 界 面 图 7 唱 25 选 择 订 阅 服 务 器 实 例 如 果 数 据 库 的 db_ow ner 角 色 成 员 运 行 强 制 订 阅 向 导, 则 不 能 启 用 其 他 订 阅 服 务 器 单 击 下 一 步 按 钮, 如 图 7 唱 26 所 示 的 选 择 目 的 数 据 库 对 话 框 中, 为 发 布 选 择 目 的 数 据 库 在 初 始 化 之 前, 每 个 订 阅 服 务 器 必 须 有 目 的 数 据 库 单 击 浏 览 或 创 建 按 钮 以 确 认 或 新 建 订 阅 数 据 库 单 击 下 一 步 按 钮, 根 据 发 布 类 型, 在 如 图 7 唱 27 所 示 的 设 置 分 发 代 理 程 序 调 度 对 话 框 中 选 择 使 用 下 列 调 度 单 击 下 一 步 按 钮, 如 图 7 唱 28 所 示 的 初 始 化 订 阅 对 话 框 中 可 以 指 定 是 否 初 始 化 订 阅 和 何 时 初 始 化 订 阅 在 这 里 单 击 是, 初 始 化 架 构 和 数 据 选 项 按 钮, 并 且 选 择 启 动 快 照 代 理 程 序 来 立 即 开 始 初 始 化 处 理 复 选 框, 以 便 快 照 代 理 程 序 立 即 创 建 快 照, 然 后 初 始 化 订 阅, 而 不 是 等 下 一 次 快 照 代 理 程 序 的 快 照 调 度 运 行 时 再 初 始 化 如 果 没 有 创 建 快 照 文 件, 此 复 选 框 将 不 会 出 现
197 184 SQL Server 数 据 库 应 用 技 术 图 7 唱 26 选 择 目 的 数 据 库 图 7 唱 27 设 置 分 发 代 理 程 序 调 度 图 7 唱 28 初 始 化 订 阅
198 第 7 章 数 据 复 制 185 单 击 下 一 步 按 钮, 在 如 图 7 唱 29 所 示 的 启 动 要 求 的 服 务 对 话 框 中,SQ L Server 代 理 验 证 所 要 求 的 服 务 正 在 分 发 服 务 器 上 运 行, 如 果 要 求 的 服 务 没 有 运 行, 默 认 情 况 下, 当 向 导 完 成 时,SQ L Server 代 理 将 启 动 服 务 如 果 想 手 动 启 动, 则 清 除 复 选 框 图 7 唱 29 启 动 要 求 的 服 务 最 后, 在 完 成 强 制 订 阅 向 导 对 话 框 中 ( 图 7 唱 30), 查 看 订 阅 选 项, 然 后 单 击 完 成 按 钮, 以 创 建 强 制 订 阅 图 7 唱 30 强 制 订 阅 向 导 确 认 7.5 通 过 Internet 执 行 复 制 互 联 网 Internet 技 术 加 快 了 人 们 之 间 的 思 想 交 流 知 识 传 递 商 业 竞 争 在 数 据 库 技 术 领 域 如 何 充 分 利 用 Internet 技 术, 是 当 前 各 种 关 系 型 数 据 库 的 主 要 特 点 SQ L Server
199 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 种 预 配 置 的 复 制 警 报 要 使 用 这 些 警 报, 必 须 先 启 用 警 报, 并 且 配 置 要 通 知 操 作 员 右 击 复 制 警 报 中 的 警 报, 单
200 第 7 章 数 据 复 制 187 图 7 唱 32 查 看 发 布 服 务 器 的 属 性 图 7 唱 33 快 照 代 理 程 序 的 状 态 击 属 性, 然 后 在 复 制 警 报 属 性 对 话 框 里 启 用 警 报 并 选 择 要 通 知 的 操 作 员, 完 成 配 置, 如 图 7 唱 34 所 示
201 188 SQL Server 数 据 库 应 用 技 术 图 7 唱 34 复 制 警 报 实 训 1. 实 训 目 的 (1) 了 解 数 据 库 复 制 的 概 念 (2) 学 会 使 用 企 业 管 理 器 配 置 复 制 (3) 学 会 使 用 企 业 管 理 器 实 现 复 制 操 作 (4) 掌 握 发 布 分 发 和 订 阅 服 务 器 的 概 念 作 用 以 及 和 物 理 服 务 器 的 对 应 关 系 2. 实 训 的 知 识 准 备 复 制 是 把 一 个 系 统 中 的 数 据 通 过 网 络 发 布 到 另 外 一 个 或 者 多 个 地 理 位 置 不 同 的 系 统 中 的 过 程 要 求 充 分 理 解 数 据 复 制 的 基 本 概 念 和 特 点, 能 够 使 用 企 业 管 理 器 配 置 发 布 管 理 器 分 发 服 务 器, 以 及 建 立 订 阅 和 使 用 复 制 监 视 器 3. 实 训 内 容 和 步 骤 (1) 使 用 企 业 管 理 器 实 现 复 制 操 作 需 要 网 络 环 境 支 持 (2) 配 置 发 布 管 理 器 和 分 发 服 务 器 1 在 企 业 管 理 器 中, 展 开 服 务 器, 右 击 复 制 项, 选 择 配 置 发 布 和 分 发 向 导 项, 单 击 下 一 步
202 第 7 章 数 据 复 制 在 分 发 服 务 器 配 置 窗 口 中, 第 一 个 单 选 框 表 示 发 布 服 务 器 和 分 发 服 务 器 为 同 一 台 主 机 ; 第 二 个 单 选 框 表 示 使 用 另 外 一 台 已 经 在 本 地 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
203 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) 数 据 库 复 制 中 的 服 务 器 组 件 是
204 第 7 章 数 据 复 制 191 (2) 复 制 类 型 分 成 和 三 种 复 制 类 型 (3) 在 SQ L Server 2000 中, 可 以 通 过 和 来 订 阅 被 发 布 的 项 目 (4) SQ L Server 2000 复 制 使 用 的 执 行 与 复 制 和 分 发 数 据 相 关 的 任 务 (5) 各 种 复 制 的 实 现 是 通 过 和 的 代 理 复 制 (6) 在 进 行 复 制 以 前, 首 先 必 须, 然 后 才 可 以 进 行 定 义 出 版 物 出 版 条 目 等 工 作 (7) 复 制 监 视 器 可 以 监 视 和 (8) 复 制 监 视 器 可 以 用 来 建 立 和 监 视 复 制 警 报, 也 可 以 用 来 和
205 第 8 章 视 图 及 其 应 用 视 图 (View) 作 为 一 种 数 据 库 对 象, 为 用 户 提 供 了 一 种 检 索 数 据 表 数 据 的 方 式 用 户 通 过 视 图 来 浏 览 数 据 表 中 感 兴 趣 的 部 分 或 全 部 数 据, 而 数 据 的 物 理 存 放 位 置 仍 然 在 表 中 本 章 将 介 绍 视 图 的 概 念, 以 及 创 建 修 改 和 删 除 视 图 的 方 法 8.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 的 记 录 不 重 复 存 储 在 用 户 看 来, 视 图 是 通 过 不 同 路 径 去 看 一 个 实 际 表, 就 像 一 个 窗 口 一 样, 我 们 通 过 窗 户 去 看 外 面 的 高 楼, 可 以 看 到 高 楼 的 不 同 部 分, 而 透 过 视 图 可 以 看 到 数 据 库 中 自 己 感 兴 趣 的 内 容 使 用 视 图 的 优 点 和 缺 点 1. 使 用 视 图 的 优 点 (1) 数 据 保 密 对 不 同 的 用 户 定 义 不 同 的 视 图, 使 用 户 只 能 看 到 与 自 己 有 关 的 数 据
206 第 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 语 句 使 用 视 图 创 建 向 导 程 序, 下 面 分 别 加 以 介 绍 使 用 企 业 管 理 器 创 建 视 图 使 用 企 业 管 理 器 创 建 视 图 的 方 法 如 下 : (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) 此 时 在 新 建 视 图 窗 口 中, 可 看 到 相 应 的 表 或 视 图, 然 后 从 中 间 表 格 的 列 中 的 下
207 194 SQL Server 数 据 库 应 用 技 术 图 8 唱 1 带 快 捷 菜 单 的 Enterprise Manager 图 8 唱 2 新 建 视 图 窗 口 图 8 唱 3 添 加 表 对 话 框
208 第 8 章 视 图 及 其 应 用 195 拉 列 表 中 选 择 要 使 用 的 列 名 或 者 直 接 从 最 上 面 的 图 表 框 中 选 择 相 应 的 列, 或 把 它 拖 入 中 间 的 表 格 在 列 区 中 选 择 将 包 括 在 视 图 的 数 据 列, 此 时 相 应 的 SQ L Server 脚 本 便 显 示 在 SQ L Script 区 (8) 对 每 一 列 的 输 出 列 进 行 选 中 或 取 消 选 中, 以 便 控 制 该 列 是 否 要 在 视 图 中 出 现 (9) 如 果 需 要 对 某 一 列 进 行 分 组, 可 右 击 该 列, 从 弹 出 菜 单 中 选 择 Group by 选 项 (10) 在 标 准 列 中, 输 入 选 择 的 条 件, 该 条 件 与 W HERE 子 句 中 的 条 件 是 对 应 的 如 果 在 该 列 中 指 定 了 分 组, 则 该 条 件 与 H A VING 子 句 中 的 条 件 相 对 应 (11) 单 击 该 窗 口 工 具 栏 中 的 红 色 惊 叹 号 (!) 按 钮 来 预 览 结 果, 或 者 单 击 保 存, 并 输 入 视 图 的 名 称, 完 成 视 图 的 创 建, 如 图 8 唱 4 所 示 图 8 唱 4 创 建 新 视 图 的 预 览 结 果 使 用 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 短 语, 如 果 需 要 排 序, 则 可 在 视 图 定 义 后, 对 视 图 查 询 时 再 进 行 排 序
209 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
210 第 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
211 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)
212 第 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) 用 户 在 这 个 视 图 上 检 索 可 以 直 接 得 到 课 表 中 的 相 关 信 息, 就 好 像 在 一 个 表 中 操 作 一 样 使 用 创 建 视 图 向 导 程 序 具 体 操 作 步 骤 如 下 : (1) 单 击 开 始 程 序 Microsoft SQ L Server 企 业 管 理 器, 打 开 SQ L Server Enterprise Manager 窗 口 (2) 展 开 服 务 器 组, 选 择 要 创 建 视 图 的 服 务 器 (3) 从 图 8 唱 6 所 示 工 具 向 导 选 项, 打 开 选 择 向 导 对 话 框, 如 图 8 唱 7 所 示 图 8 唱 6 从 工 具 下 拉 式 菜 单 中 选 择 向 导 (4) 在 选 择 向 导 对 话 框 中, 展 开 数 据 库 项, 双 击 创 建 视 图 向 导 项, 则 出 现 创 建 视 图 向 导 对 话 框, 如 图 8 唱 8 所 示
213 200 SQL Server 数 据 库 应 用 技 术 图 8 唱 7 选 择 向 导 对 话 框 图 8 唱 8 创 建 视 图 向 导 窗 口 (5) 按 照 创 建 视 图 向 导 中 的 提 示 进 行 操 作, 完 成 对 视 图 的 创 建 8.3 视 图 定 义 的 查 询 与 修 改 查 看 和 修 改 视 图 定 义 在 创 建 好 视 图 后, 可 以 查 看 和 修 改 其 定 义 或 对 其 进 行 重 命 名 要 查 看 和 修 改 视 图 的 定 义, 既 可 使 用 企 业 管 理 器, 也 可 使 用 T ransact 唱 SQ L 语 句 来 完 成, 下 面 分 别 加 以 介 绍
214 第 8 章 视 图 及 其 应 用 使 用 企 业 管 理 器 查 看 和 修 改 视 图 定 义 在 SQ L Server 中, 通 过 企 业 管 理 器 查 看 和 修 改 视 图 定 义 主 要 执 行 以 下 步 骤 : 方 法 1 : (1) 启 动 企 业 管 理 器, 登 录 到 指 定 的 服 务 器 (2) 打 开 欲 管 理 视 图 的 数 据 库 文 件 夹, 选 中 视 图 图 标, 此 时 在 右 面 的 窗 格 中 显 示 当 前 数 据 库 的 所 有 视 图 (3) 如 图 8 唱 9 所 示, 在 右 窗 格 中 右 键 单 击 要 查 看 的 视 图, 在 弹 出 菜 单 中 选 择 属 性 菜 单 项, 打 开 如 图 8 唱 10 所 示 查 看 属 性 窗 口 图 8 唱 9 右 击 欲 看 视 图, 在 弹 出 菜 单 中 单 击 属 性 菜 单 项 图 8 唱 10 查 看 属 性 对 话 框
215 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
216 第 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 获 取 视 图 详 细 信 息
217 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 语 句 的 语 法 格 式 如 下 :
218 第 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 ]
219 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 视 图 的 删 除 当 不 再 需 要 一 个 视 图 时, 可 对 其 进 行 删 除 操 作 删 除 一 个 视 图 的 方 法 与 删 除 一 个 表 的 方 法 是 类 似 的, 既 可 以 使 用 企 业 管 理 器, 也 可 以 使 用 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 在 数 据 字 典 中 的 定 义, 而 与 视 图 有 关 的 基 本 表 中 的 数 据 不 会 受 到 任 何 影 响, 由 此 视 图 导 出 的 其 他 视 图 的 定 义 不 会 删 除, 但 已 无 任 何 意 义 用 户 应 该 把 这 些 视 图 删 除
220 第 8 章 视 图 及 其 应 用 通 过 视 图 查 询 与 更 新 数 据 通 过 视 图 查 询 数 据 视 图 定 义 后, 对 视 图 的 查 询 操 作 如 同 对 基 本 表 的 查 询 操 作 一 样 例 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
221 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 目 前 多 数 关 系 数 据 库 系 统 对 行 列 子 集 视 图 的 查 询 均 能 进 行 正 确 转 换 但 对 非 行 列 子 集 的 查 询 就 不 一 定 能 转 换 了, 因 此 这 类 查 询 应 该 直 接 对 基 表 进 行 通 过 视 图 更 新 数 据 更 新 视 图 是 指 通 过 视 图 插 入 (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 : ;name : 李 里 ;tech_title : 副 教 授 ) INSERT INTO teacher_view VALUES ( , 李 里, 副 教 授 ) 系 统 在 执 行 此 语 句 时, 首 先 从 数 据 字 典 中 找 到 teacher_view 的 定 义, 然 后 把 此 定 义 和 插 入 操 作 结 合 起 来, 转 换 成 等 价 的 对 基 本 表 teacher_info 的 插 入 相 当 于 执 行 以 下 操 作 : INSERT INTO teacher_info(teacher_id,name, tech_title) VALUES ( , 李 里, 副 教 授 ) (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 中 李 里 教 师 的 记 录
222 第 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 = 请 读 者 自 己 将 上 述 语 句 转 换 为 对 表 数 据 的 更 新 语 句 例 8.27 计 算 机 系 增 加 了 一 个 新 生 ( 学 号 为 , 姓 名 为 吴 新, 性 别 为 女 ) INSERT INTO stud_computer VALUES( , 吴 新, 女 ) 请 读 者 自 己 将 上 述 语 句 转 换 为 对 表 数 据 的 插 入 语 句 例 8.28 删 除 计 算 机 系 学 生 吴 新, 学 号 是 DELETE FROM stud_computer WHERE stud_id = 请 读 者 自 己 将 上 述 语 句 转 换 为 对 表 数 据 的 删 除 语 句 在 关 系 数 据 库 中, 并 不 是 所 有 视 图 都 是 可 更 新 的, 因 为 有 些 视 图 的 更 新 不 能 惟 一 地 有 意 义 地 转 换 成 对 相 应 表 的 更 新 例 如, 前 面 例 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 查 看 视 图 的
223 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 ( , 张 艳 燕, 12/06/1986, 女, 北 京 市 海 淀 区, 010 唱 , ,565) 4 张 艳 燕 从 管 理 工 程 系 转 到 计 算 机 工 程 系 在 查 询 分 析 器 窗 口 中 输 入 如 下 语 句 并 执 行 : stud_info_female SET stud_id = substring(stud_id,1,2) substring(stud_id,5,6) WHERE name = 张 艳 燕 5 把 张 艳 燕 从 表 stud_info 中 删 除 在 查 询 分 析 器 窗 口 中 输 入 如 下 语 句 并 执 行 : stud_info_female WHERE name = 张 艳 燕 自 行 练 习 : 尝 试 在 视 图 stud_grade_average 中 插 入 修 改 删 除 数 据 记 录, 然 后 检 查 数 据 表 stud_grade 中 的 变 化 情 况 课 后 作 业 1. 选 择 最 适 合 的 答 案 (1) 用 哪 个 选 项 建 立 的 视 图, 保 证 通 过 视 图 加 到 表 中 的 行 可 以 通 过 视 图 访 问? ( )
224 第 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 = 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 语 句 的 作 用
225 212 SQL Server 数 据 库 应 用 技 术 CREATE VIEW ser_view AS SELECT 倡 FROM stud_info WHERE substring(stud_id,3,2) = 04 INSERT INTO ser_view VALUES ( , 张 虹, 11/02/1986, 男, 北 京 市 丰 台 区, 010 唱 , ,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 = WHERE name = 刘 娜 (7) 写 出 建 立 院 系 代 码 表 (dept_code) 教 研 室 信 息 表 (staffroom_info) 和 教 师 基 本 信 息 表 (teacher_info) 的 视 图 命 令, 视 图 中 的 列 为 教 师 姓 名 所 属 院 系 名 称 所 属 教 研 室 名 称
226 第 9 章 存 储 过 程 与 触 发 器 SQ L Server 应 用 操 作 中, 存 储 过 程 和 触 发 器 扮 演 相 当 重 要 的 角 色, 基 于 其 预 编 译 并 存 储 在 SQ L Server 数 据 库 中 的 特 性, 不 仅 能 提 高 应 用 效 率, 确 保 一 致 性, 更 能 提 高 系 统 执 行 速 度 同 时, 使 用 触 发 器 来 完 成 业 务 规 则, 达 到 简 化 程 序 设 计 的 目 的 本 章 将 介 绍 存 储 过 程 和 触 发 器 的 作 用, 并 讨 论 使 用 企 业 管 理 器 和 T ransact 唱 SQ L 语 句 创 建 修 改 删 除 存 储 过 程 和 触 发 器 的 方 法 9.1 存 储 过 程 概 述 什 么 是 存 储 过 程 当 开 发 一 个 应 用 程 序 时, 为 了 易 于 修 改 和 扩 充, 经 常 会 将 负 责 不 同 功 能 的 语 句 集 中 起 来 而 且 按 照 用 途 分 别 独 立 放 置, 以 便 能 够 反 复 调 用, 而 这 些 独 立 放 置 且 拥 有 不 同 功 能 的 语 句, 即 是 过 程 (Procedure) SQ L Server 的 存 储 过 程 包 含 一 些 T ransact 唱 SQ L 语 句 并 以 特 定 的 名 称 存 储 在 数 据 库 中 ( 存 储 过 程 也 是 一 种 数 据 库 对 象 ) 可 以 在 存 储 过 程 中 声 明 变 量 有 条 件 执 行 以 及 其 他 各 项 强 大 的 程 序 设 计 功 能 SQ L Server 的 存 储 过 程 与 其 他 程 序 设 计 语 言 的 过 程 类 似, 同 样 能 按 下 列 方 式 运 行 : (1) 它 能 够 包 含 执 行 各 项 数 据 库 操 作 的 语 句, 并 且 可 以 调 用 其 他 的 存 储 过 程 (2) 能 够 接 受 输 入 参 数, 并 以 输 出 参 数 的 形 式 将 多 个 数 据 值 返 回 给 调 用 程 序 (Ca11ing Procedure) 或 批 处 理 (Batch) (3) 向 调 用 程 序 或 批 处 理 返 回 一 个 状 态 值, 以 表 明 成 功 或 失 败 ( 以 及 失 败 的 原 因 ) 存 储 过 程 (Stored Procedure) 是 一 组 为 了 完 成 特 定 功 能 的 SQ L 语 句 集, 经 编 译 后 存 储 在 数 据 库 中 用 户 通 过 指 定 存 储 过 程 的 名 字 并 给 出 参 数 ( 如 果 该 存 储 过 程 带 有 参 数 ) 来 执 行 它 存 储 过 程 类 型 1. 系 统 存 储 过 程 存 储 过 程 在 运 算 时 生 成 执 行 方 式, 其 后 再 运 行 时 执 行 速 度 很 快 SQ L Server 不 仅 提 供 了 用 户 自 定 义 存 储 过 程 的 功 能, 而 且 也 提 供 了 许 多 可 作 为 工 具 使 用 的 系 统 存 储 过 程 系 统 存 储 过 程 (System Stored Procedures) 主 要 存 储 在 master 数 据 库 中 并 以 sp_ 为
227 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 命 令 删 除 他 所 创 建 的 本 地 临 时 存 储 过 程 由 于 本 地 临 时 存 储 过 程 的 适 用 范 围 仅 限 于 创 建 它 的 连 接, 因 此 不 需 担 心 其 名 称 会 和
228 第 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 中 存 储 过 程 的 好 处 1. 允 许 模 块 化 的 程 序 设 计 存 储 过 程 一 旦 创 建 完 成 并 存 储 于 数 据 库 中, 即 可 在 应 用 程 序 中 反 复 调 用, 因 此 利 用 存 储 过 程 完 成 某 些 例 行 操 作 是 最 恰 当 不 过 了 一 般 来 说, 要 将 存 储 过 程 的 创 建 和 维 护 操 作 交 由 专 人 负 责, 由 于 各 个 用 于 完 成 特 定 操 作 的 存 储 过 程 均 独 立 放 置, 因 此 根 本 不 需 担 心 当 修 改 存 储 过 程 时 会 影 响 到 应 用 程 序 的 程 序 代 码 此 外, 通 过 在 存 储 过 程 中 编 写 业 务 逻 辑 和 策 略, 不 仅 可 以 让 不 同 的 应 用 程 序 共 享, 同 时 可 要 求 所 有 的 客 户 端 使 用 相 同 的 存 储 过 程 从 而 达 到 数 据 访 问 和 更 新 的 一 致 性 2. 更 快 的 执 行 速 度 当 执 行 批 处 理 和 T ransact 唱 SQ L 程 序 代 码 时,SQ L Server 必 须 先 检 查 语 法 是 否 正 确
229 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 创 建 存 储 过 程 是 一 种 较 为 快 速 的 方 法, 但 对 于 初 学 者, 使 用 企 业 管 理 器 更 易 理 解, 更 为 简 单 创 建 和 执 行 不 带 参 数 的 存 储 过 程 1. 使 用 企 业 管 理 器 创 建 存 储 过 程 (1) 启 动 企 业 管 理 器, 登 录 到 要 使 用 的 服 务 器 (2) 在 企 业 管 理 器 的 左 窗 格 中, 展 开 要 创 建 存 储 过 程 的 数 据 库 文 件 夹, 单 击 存 储 过 程 文 件 夹, 此 时 在 右 窗 格 中 显 示 该 数 据 库 的 所 有 存 储 过 程 (3) 右 击 存 储 过 程 文 件 夹, 在 弹 出 的 快 捷 菜 单 中 选 择 新 建 存 储 过 程, 此 时 打 开 新 建 存 储 过 程 对 话 框 (4) 在 文 本 编 辑 框 中 输 入 存 储 过 程 的 正 文 内 容 (5) 单 击 检 查 语 法 按 钮, 检 查 语 法 是 否 正 确 (6) 单 击 确 定 按 钮 保 存
230 第 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_var} parameter = variable [OUTPUT] [DEFAULT]} [,...n]][with RECOMPILE] 其 中, 各 个 参 数 意 义 如 下 : return_status 是 一 个 可 选 的 整 型 变 量, 保 存 存 储 过 程 的 返 回 状 态 2 procedure_name 是 拟 调 用 的 存 储 过 程 名 称,@ procedure_name_var 是 局 部 定 义 变 量 名, 代 表 存 储 过 程 名 称 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
231 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 级
232 第 9 章 存 储 过 程 与 触 发 器 创 建 和 执 行 带 参 数 的 存 储 过 程 由 于 不 带 参 数 的 存 储 过 程 的 创 建 非 常 简 单, 所 以 采 用 直 接 创 建 的 办 法 但 是, 对 于 创 建 比 较 复 杂 的 存 储 过 程, 当 存 储 过 程 时, 需 要 确 定 存 储 过 程 的 三 个 组 成 部 分 : (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 为 所 创 建 的 存 储 过 程 的 名 字 parameter 用 来 指 定 输 入 和 输 出 参 数 的 名 称, 参 数 的 名 称 是 以 字 开 始, 而 且 其 名 称 必 须 符 合 SQ L Server 的 命 名 规 则 data_type 用 来 指 定 输 入 参 数 的 数 据 类 型 输 入 参 数 可 以 是 任 何 的 数 据 类 型 ( 包 括 text ntext image 和 用 户 定 义 数 据 类 型 ) 当 然, 输 入 参 数 的 数 据 类 型 也 就 决 定 了 这 一 输 入 参 数 所 能 接 收 数 据 值 的 类 型 和 范 围 例 如, 输 入 参 数 的 数 据 类 型 是 smallint, 则 它 只 能 接 收 ~ 之 间 的 整 数 值, 将 不 符 合 此 条 件 的 数 据 值 传 递 给 它 都 会 发 生 错 误 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 中 插 入 一 条 记 录, 新 记 录 的 值 由 参 数 提 供
233 220 SQL Server 数 据 库 应 用 技 术 USE student GO CREATE PROCEDURE teacher_proc2 no nam sex age title tel sala num char(10)) AS INSERT INTO teacher _ info VALUES 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 no = nam = 李 铁 sex = age = 49,@ title = 高 tel = sala = num = 为 了 说 明 使 用 参 数 名 传 递 参 数 值 时 可 以 以 任 意 顺 序 指 定 参 数 值, 将 两 个 参 数 的 次 序 进 行 了 颠 倒, 此 外 由 于 目 的 地 的 查 询 值 与 该 参 数 的 默 认 值 一 致, 所 以 也 没 有 对 该 输 入 参 数 的 参 数 值 进 行 指 定 (2) 按 位 置 传 送 参 数 值 在 执 行 存 储 过 程 的 语 句 中, 不 参 照 被 传 递 的 参 数 而 直 接 给 出 参 数 的 传 递 值 当 存 储 过 程 含 有 多 个 输 入 参 数 时, 传 递 值 的 顺 序 必 须 与 存 储 过 程 中 定 义 的 输 入 参 数 的 顺 序 相 一 致 语 法 命 令 如 下 : [EXEC[UTE]] proc_name [value1,value2,...] 其 中 各 参 数 的 意 义 为 : proc_name 为 存 储 过 程 名 ;value1,value2,... 为 传 递 给 各 输
234 第 9 章 存 储 过 程 与 触 发 器 221 入 参 数 的 值 按 位 置 传 送 参 数 值 时, 也 可 以 忽 略 允 许 空 值 和 具 有 默 认 值 的 参 数, 但 是 不 能 因 此 破 坏 输 入 参 数 的 指 定 次 序 因 此, 在 一 个 含 有 四 个 输 入 参 数 的 存 储 过 程 中, 用 户 可 以 忽 略 第 三 和 第 四 个 参 数, 但 无 法 在 忽 略 第 三 个 参 数 的 情 况 下 而 指 定 第 四 个 参 数 的 输 入 值 例 9.5 使 用 按 位 置 传 送 参 数 值 的 方 法 来 执 行 teacher_proc2 存 储 过 程, 实 现 向 数 据 表 teacher_info 中 插 入 一 条 记 录 具 体 命 令 如 下 : USE student GO EXEC teacher_proc , 李 烙 铁, 女,48, 讲 师, ,250.0, 这 里 由 于 使 用 的 是 按 位 置 传 送 参 数 值 的 方 法, 所 以 不 可 以 将 参 数 的 次 序 进 行 颠 倒 此 外 由 于 目 的 地 的 查 询 值 与 该 参 数 的 默 认 值 一 致, 也 可 以 不 对 该 输 入 参 数 的 参 数 值 进 行 指 定 2. 具 有 默 认 值 的 存 储 过 程 例 9.6 针 对 教 师 基 本 信 息 表 teacher_info, 创 建 一 个 名 称 为 teacher_proc3 的 存 储 过 程, 执 行 存 储 过 程 时 将 向 数 据 表 teacher_info 中 插 入 一 条 记 录, 新 记 录 的 值 由 参 数 提 供, 如 果 未 提 供 职 称 tech_title 的 值 时, 由 参 数 的 默 认 值 代 替 USE student GO CREATE PROCEDURE teacher_proc3 no nam sex age title char(10) = tel varchar sala decimal(7),@ num char(10)) AS INSERT INTO teacher_info no,@ nam,@ sex,@ age,@ title,@ tel,@ sala,@ num) GO EXECU TE no = nam = 张 小 sex = age = tel = sala = num = 例 9.7 在 student 数 据 库 上 新 建 一 个 名 为 stud_proc1 的 存 储 过 程, 该 存 储 过 程 定 义 了 两 个 日 期 时 间 类 型 的 输 入 参 数 和 一 个 字 符 型 输 入 参 数, 返 回 所 有 出 生 日 期 在 两 个 输 入 日 期 之 间, 性 别 与 输 入 的 字 符 型 参 数 相 同 的 学 生 信 息, 其 中 字 符 型 输 入 参 数 指 定 的 默 认 值 为 女 具 体 命 令 如 下 : USE student GO CREATE PROC startdate datetime,@ enddate datetime,@ sex char(2) = 女 AS IF startdate IS NULL enddate IS NULL sex IS NULL) BEGIN RAISERROR ( NULL value are invalid,5,5)
235 222 SQL Server 数 据 库 应 用 技 术 RET URN END SELECT 倡 FROM stud_info WHERE (birthday startdate 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] 其 中 各 参 数 的 意 义 如 下 : parameter_name 存 储 过 程 的 输 出 参 数 名, 必 须 以 符 为 前 缀 存 储 过 程 通 过 该 参 数 返 回 结 果 2 datatype 指 明 输 出 参 数 的 数 据 类 型, 它 既 可 以 是 系 统 提 供 的 数 据 类 型, 也 可 以 是 用 户 自 定 义 的 数 据 类 型, 但 必 须 是 除 了 text 和 image 以 外 的 数 据 类 型 3 default 指 定 输 出 参 数 的 默 认 值, 如 果 执 行 存 储 过 程 时 未 对 输 出 参 数 进 行 赋 值, 则 存 储 过 程 在 返 回 输 出 参 数 的 变 量 值 时, 使 用 default 值 4 O U T P U T 关 键 字 指 明 参 数 为 输 出 参 数 输 出 参 数 必 须 位 于 所 有 输 入 参 数 说 明 之 后 例 9.8 在 student 数 据 库 上 新 建 一 名 为 stud_proc2 的 存 储 过 程, 其 功 能 是 输 入 两 个 日 期 型 数 据, 并 使 用 输 出 参 数 返 回 这 两 个 出 生 日 期 之 间 的 所 有 学 生 人 数
236 第 9 章 存 储 过 程 与 触 发 器 223 USE student GO CREATE PROCEDURE startdate datetime,@ enddate datetime,@ recordcount int OU TPU T AS startdate IS NULL enddate IS NULL BEGIN RAISERROR( NULL value are invalid,5,5) RET URN END SELECT 倡 FROM stud_info WHERE birthday startdate enddate recordcount 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_var} } parameter_name = variable[output]}][,...n] [WITH RECOMPILE] 其 中 各 参 数 的 意 义 如 下 : 1 procedure_name : 需 执 行 的 存 储 过 程 的 名 字 ; 2 parameter_name = 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 recordnumber int / 倡 声 明 为 局 部 变 量, 用 来 存 放 输 出 参 数 的 值 倡 / EXEC stud_proc2 01/01/1986, 12/31/1986,@ recordnumber OU TPU T PRINT The order count is : + recordnumber)
237 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, 输 入 性 别 的 值 后, 返 回 对 应 性 别 的 学 生 人 数, 但 需 保 证 其 在 每 次 被 执 行 时 都 被 重 编 译 处 理 具 体 命 令 如 下 :
238 第 9 章 存 储 过 程 与 触 发 器 225 USE student GO CREATE PROCEDURE stud_proc3 in_sex out_num INT OU TPU T) WIT H RECOMPILE AS BEGIN in_sex = 男 out_num = count(gender) FROM stud_info WHERE gender = 男 ; ELSE out_num = count(gender) FROM stud_info WHERE gender = 女 END 执 行 所 定 义 的 存 储 过 程 为 : man_num int EXEC stud_proc3 man_num OU TPUT 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 时, 对 其 进 行 重 编 译 处 理 man_num int EXEC stud_proc3 man_num OU TPUT WIT H RECOMPILE man_num 3 通 过 系 统 存 储 过 程 设 定 重 编 译 选 项 EXEC sp_recompile OBJECT 其 中,sp_recompile 为 用 于 重 编 译 存 储 过 程 的 系 统 存 储 过 程,OBJEC T 为 当 前 数 据 库 中 的 存 储 过 程 触 发 器 表 或 视 图 的 名 称 例 9.12 对 student 数 据 库 中 stud_info 表 上 的 所 有 存 储 过 程 或 触 发 器 进 行 重 编 译 处 理 EXEC sp_recompile stud_info
239 226 SQL Server 数 据 库 应 用 技 术 9.3 修 改 和 删 除 存 储 过 程 查 看 存 储 过 程 存 储 过 程 被 创 建 以 后, 它 的 名 字 存 储 在 系 统 表 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 都 无 法 查 看 到 存 储 过 程 的 源 代 码 修 改 存 储 过 程 修 改 存 储 过 程 通 常 是 指 编 辑 它 的 参 数 和 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 命 令 具 体 语 法 如 下 :
240 第 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
241 228 SQL Server 数 据 库 应 用 技 术 例 9.15 将 存 储 过 程 teacher_proc1 修 改 为 teacher_info_proc1 sp_rename teacher_proc1, teacher_info_proc1 另 外, 通 过 企 业 管 理 器 也 可 修 改 存 储 过 程 的 名 字, 其 操 作 过 程 与 Window s 下 修 改 文 件 名 字 的 操 作 类 似 即 首 先 选 中 需 修 改 名 字 的 存 储 过 程, 然 后 右 击, 在 弹 出 菜 单 中 选 取 重 命 名 选 项, 最 后 输 入 新 存 储 过 程 的 名 字 删 除 存 储 过 程 1. 使 用 企 业 管 理 器 使 用 企 业 管 理 器 删 除 一 个 或 多 个 存 储 过 程, 请 先 将 它 们 选 取, 然 后 右 击 其 中 一 个 被 选 取 的 存 储 过 程, 并 从 快 捷 菜 单 中 选 取 删 除 命 令, 接 着 再 单 击 除 去 对 象 对 话 中 的 全 部 除 去 按 钮 2. 使 用 DROP PROCEDURE 语 句 删 除 存 储 过 程 使 用 DROP 命 令,DROP 命 令 可 将 一 个 或 多 个 存 储 过 程 或 者 存 储 过 程 组 从 当 前 数 据 库 中 删 除 具 体 语 法 如 下 : DROP PROC[EDURE] procedure_name[,...n] 其 中 各 参 数 的 意 义 与 修 改 存 储 过 程 命 令 中 参 数 的 意 义 相 同 例 9.16 将 存 储 过 程 teacher_info_proc1 从 数 据 库 中 删 除 DROP PROCEDURE teacher_info_proc1 9.4 触 发 器 的 创 建 和 管 理 触 发 器 概 述 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 约 束 或 触 发 器 来 实 现 但
242 第 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) 维 护 非 规 范 化 数 据 用 户 可 以 使 用 触 发 器 来 保 证 非 规 范 数 据 库 中 的 低 级 数 据 的 完 整 性 维 护 非 规 范 化 数 据 与 表 的 级 联 是 不 同 的 表 的 级 联 指 的 是 不 同 表 之 间 的 主 外 键 关 系, 维 护 表 的 级 联 可 以 通 过 设 置 表 的 主 键 与 外 键 的 关 系 来 实 现 而 非 规 范 数 据 通 常 是 指 在 表 中 的 派 生 的 冗 余 的 数 据 值, 维 护 非 规 范 化 数 据 应 该 通 过 使 用 触 发 器 来 实 现 触 发 器 的 创 建 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]
243 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)
244 第 9 章 存 储 过 程 与 触 发 器 231 当 用 户 向 表 teacher_info 中 插 入 数 据 时 将 触 发 触 发 器, 但 是 数 据 仍 能 被 插 入 表 中, 如 向 表 中 加 入 如 下 记 录 内 容 : INSERT INTO teacher_info VALUES( , 目 火 柴, 男, 55, 政 工 师, ,9999, ) 用 户 可 以 用 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 = 在 查 询 分 析 器 的 消 息 返 回 窗 口 中 将 出 现 报 错 信 息 用 户 此 时 再 用 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 子 句 恢 复 原 来 数 据 的 方 法, 来 实 现 字 段 不 被 修 改 ) 命 令 如 下 :
245 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 = 运 行 结 果 显 示 : 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 = 执 行 后 返 回 的 消 息 : 所 影 响 的 行 数 为 1 行, 检 索 表 teacher_info 可 以 看 到 职 称 列 的 内 容 确 实 被 更 新 了 通 过 如 下 的 命 令 对 teacher_info 建 立 如 下 查 询 : SELECT teacher_id, name, tech_title FROM teacher_info WHERE teacher_id =
246 第 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 管 理 触 发 器 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 来 查 看 某 张 特 定 表 上 存 在 的 触 发 器 的 某 些 相 关 信 息 具 体 命 令 的 语 法 如 下 :
247 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) 通 过 企 业 管 理 器 修 改 触 发 器 定 义 通 过 企 业 管 理 器 修 改 触 发 器 定 义 的 操 作 步 骤 与 查 看 触 发 器 信 息 一 样 修 改 完 触 发 器 后 要 使 用 检 查 语 法 选 项 对 语 句 进 行 检 查
248 第 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 触 发 器 的 表 中 插 入 大 量 数 据 当 一 个 触 发 器 被 禁 止 后, 该 触 发 器 仍 然 存 在 于 表 上, 只 是 触 发 器 的 动 作 将 不 再 执 行, 直 到 该 触 发 器 被 重 新 启 用 禁 止
249 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 nam varchar(8) OU TPU title char(10) OUTPU T) AS nam = title = tech_title FROM teacher_info WHERE teacher_id no
250 第 9 章 存 储 过 程 与 触 发 器 237 执 行 已 经 定 义 的 存 储 过 程 : nam varchar(6) / 倡 声 明 为 局 部 变 量, 用 来 存 放 姓 名 的 值 倡 / title char(10) / 倡 声 明 为 局 部 变 量, 用 来 存 放 职 称 的 值 倡 / EXECU TE teacher_select ,@ nam OU TPUT,@ title OUTPU T SELECT 姓 名 :,@ nam, 职 称 :,@ title 2 建 立 一 个 插 入 教 师 记 录 的 存 储 过 程 teacher_insert, 在 查 询 分 析 器 中 输 入 存 储 过 程 的 代 码 并 执 行 CREATE PROCEDURE teacher_insert no nam sex age title tel sala num char(10)) AS INSERT INTO teacher_info no,@ nam,@ sex,@ age,@ title,@ tel,@ sala,@ num) GO EXEC teacher_insert , 聂 小 蛋, 男,40, 研 究 员, ,250.0, 在 企 业 管 理 器 中 检 查 新 记 录 是 否 已 经 插 入 至 教 师 基 本 信 息 表 中 3 建 立 一 个 修 改 教 师 记 录 的 存 储 过 程 teacher_update, 并 执 行 之 CREATE PROCEDURE teacher_update no nam sex age title tel sala 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
251 238 SQL Server 数 据 库 应 用 技 术 在 查 询 分 析 器 运 行 EXEC 命 令 调 用 存 储 过 程 teacher_delete, 删 除 teacher_info 中 的 teacher_id 为 的 教 师 记 录 自 行 练 习 : 编 写 一 个 存 储 过 程 对 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( , 聂 晓 基, 男,40, 讲 师, ,250.0, ) 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
252 第 9 章 存 储 过 程 与 触 发 器 239 在 查 询 分 析 器 中 输 入 上 述 语 句 后, 可 以 使 用 下 述 命 令 加 以 验 证 DELETE FROM teacher_info WHERE teacher_id = 自 行 练 习 : 编 写 一 个 触 发 器, 在 对 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 列 应 满 足 参 照 完 整 性 规 则, 请 用 触 发 器 实 现 两 个 表 间 的 参 照 完 整 性
253 第 10 章 SQL Server 的 程 序 设 计 本 章 将 主 要 介 绍 包 括 批 处 理 流 程 控 制 事 务 处 理 锁 游 标 在 内 的 T ranscat 唱 SQ L 的 程 序 设 计 知 识, 它 们 是 灵 活 应 用 T ransact 唱 SQ L 语 句 的 关 键 10.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
254 第 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( , 黄 铭 ) GO 在 查 询 分 析 器 的 运 行 窗 口 中 运 行 上 面 命 令 后, 在 运 行 结 果 窗 口 中 将 返 回 如 下 消 息 : 在 关 键 字 INSER T 附 近 有 语 法 错 误, 这 说 明 第 二 个 批 处 理 是 无 效 的, 原 因 在 于 一 个 批 处 理 中,CREA T E VIEW 必 须 是 其 中 的 惟 一 语 句 如 果 在 INSER T 命 令 之 前 加 一 个 GO 语 句, 那 么, 上 述 批 处 理 就 可 以 正 常 执 行 了 例 10.3 一 个 无 效 批 处 理 的 例 子 stud_var IN T GO stud_var = 25 GO stud_var GO 运 行 结 果 如 图 10 唱 1 所 示, 因 stud_var 在 第 一 个 批 处 理 中 定 义, 但 是 在 第 二 个 批 处 理 中 引 用 stud_var, 在 第 三 个 批 处 理 中 又 引 stud_var, 所 以 运 行 出 错 流 程 控 制 图 10 唱 1 无 效 批 处 理 的 例 子 流 程 控 制 语 句 是 通 过 判 断 指 定 的 某 些 值 来 控 制 程 序 运 行 方 向 的 语 句 T ransact 唱 SQ L 语 言 使 用 的 流 程 控 制 语 句 与 常 见 的 程 序 设 计 语 言 类 似, 主 要 有 以 下 几 种 控 制 命 令
255 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) = ) > = 60 BEGIN PRINT pass END 例 10.5 统 计 2004 级 计 算 机 工 程 系 计 算 机 应 用 技 术 专 业 02 班 的 学 生 人 数, 如 果 不 超 过 45 人, 则 向 数 据 表 stud_info 中 加 入 新 的 学 生 记 录 p_total IN T BEGIN p_total = COUNT( 倡 ) FROM stud_info WHERE LEFT(stud_id,8) = IF p_total < 45) INSERT IN TO stud_info VALUES ( , 谢 背 光, 05 唱 14 唱 1986, 男, 广 东 省 湛 江 市, 0789 唱 , ,565) END 例 10.6 从 数 据 表 stud_grade 中 读 出 学 生 陈 红 的 成 绩, 将 百 分 制 转 换 成 等 级 制 score NU step CHAR(1) BEGIN / 倡 从 关 系 stud_grade 中 读 出 学 生 陈 红 的 一 个 成 绩 送 变 score 倡 / score = grade FROM stud_grade WHERE name = 陈 红 IF score > = 90 score < = 100) step = A ;
256 第 10 章 SQL Server 的 程 序 设 计 243 ELSE IF score > = 80) step = B ELSE IF score > = 70) step = C ELSE IF score > = 60) step = D ELSE step = E 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 表 中 查 询 所 有 同 学 考 试 成 绩 情 况, 凡 成 绩 为 空 者 输 出 未
257 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 整 除 的 数 的 个 数 及 总 和 x SMALLINT,@ y SMALLINT,@ nums SMALLINT x = 0 y = 1 nums = 0 WHILE y < = 100) BEGIN IF y % 3 = 0) BEGIN x x y nums nums + 1 END y y + 1 END PRINT x) +, + nums)
258 第 10 章 SQL Server 的 程 序 设 计 WAITFOR 语 法 形 式 : WAITFOR {DELAY time TIME time } WAITFOR 命 令 用 来 暂 时 停 止 程 序 执 行, 直 到 所 设 定 的 等 待 时 间 已 过 或 所 设 定 的 时 间 已 到 才 继 续 往 下 执 行 其 中 time 必 须 为 DATETIME 类 型 的 数 据, 但 不 能 包 括 日 期 其 中,DELAY 用 来 设 定 等 待 的 时 间, 最 多 可 达 24 小 时 ;TIME 用 来 设 定 等 待 结 束 的 时 间 点 例 等 待 1 小 时 2 分 零 3 秒 后 才 执 行 SELEC T 语 句 WAITFOR DELAY 01 :02 :03 SELECT 倡 FROM stud_info 6.GOTO 语 法 形 式 : GOTO label GO T O 命 令 用 来 改 变 程 序 执 行 的 流 程, 使 程 序 跳 到 标 有 标 识 符 的 指 定 的 程 序 行 再 继 续 往 下 执 行 作 为 跳 转 目 标 的 标 识 符 可 为 数 字 与 字 符 的 组 合, 但 必 须 以 : 结 尾 在 GO T O 命 令 行, 标 识 符 后 不 必 跟 : 例 求 的 总 和 sum i SMALLINT i = 1 sum = 0 BEG : IF i < = 100) BEGIN sum sum i i i + 1 GOTO BEG END 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 系 统 将 返 回 绝 对 值 最 大 的 数 值 ; 如 果 此
259 246 SQL Server 数 据 库 应 用 技 术 时 用 户 定 义 了 返 回 值, 则 返 回 用 户 定 义 的 值 RE T URN 语 句 不 能 返 回 N U LL 值 10.2 事 务 处 理 事 务 概 述 1. 事 务 的 概 念 一 个 事 务 是 由 一 系 列 的 数 据 库 查 询 操 作 和 更 新 操 作 构 成 的 从 用 户 的 观 点 来 看, 根 据 业 务 规 则, 这 些 操 作 是 一 个 整 体, 不 能 分 割, 要 么 所 有 的 操 作 都 顺 利 完 成, 要 么 一 个 也 不 要 做, 绝 不 能 只 完 成 了 部 分 操 作, 而 还 有 一 些 操 作 没 有 完 成 事 务 是 数 据 库 运 行 中 的 一 个 逻 辑 工 作 单 位, 由 DBM S 中 的 事 务 管 理 子 系 统 负 责 事 务 的 处 理 例 将 student 数 据 库 中 学 生 基 本 信 息 表 (stud_info) 的 学 号 stud_id 由 修 改 为 因 为 学 号 出 现 在 学 生 基 本 信 息 表 (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 = WHERE course_id = UPDATE stud_grade SET stud_id = WHERE course_id = COM MIT TRAN stud_transaction 唱 提 交 事 务 2. 事 务 的 特 性 事 务 作 为 一 个 逻 辑 工 作 单 元, 其 中 包 括 一 系 列 的 操 作, 这 些 语 句 将 被 作 为 一 个 整 体 进 行 处 理 当 事 务 执 行 遇 到 错 误 时, 将 取 消 事 务 做 的 所 有 操 作 (1) 原 子 性 (Atomicity) 一 个 事 务 中 的 所 有 操 作 是 一 个 逻 辑 上 不 可 分 割 的 单 位 事 务 必 须 作 为 工 作 的 最 小 单 位, 即 原 子 单 位, 其 所 进 行 的 操 作 要 么 全 部 执 行, 要 么 全 部 不 执 行 (2) 一 致 性 (Consistency) 事 务 结 束 时, 必 须 使 所 有 数 据 处 于 一 致 性 状 态 数 据 库 处 于 一 致 性 状 态 是 指 数 据 库 中 的 数 据 满 足 各 种 完 整 性 规 则 在 相 关 数 据 库 中, 事 务 必 须 遵 守 数 据 库 的 约 束 和 规 则 要 求, 以 保 持 所 有 数 据 的 完 整 性 (3) 隔 离 性 (Isolation) 为 了 提 高 事 务 的 吞 吐 率, 大 多 数 DBM S 允 许 同 时 执 行 多 个 事 务, 就 像 分 时 操 作 系 统 为 了 充 分 利 用 系 统 资 源, 同 时 执 行 多 个 进 程 一 样 一 个 事 务 所 作 的 修 改 必 须 与 其 他 事 务 所 作 的 修 改 隔 离 事 务 查 看 数 据 所 处 的 状 态, 要 么 是 另 一 并 发 事 务 修 改 它 之 前 的 状 态, 要 么 是 另 一 事 务 修 改 它 之 后 的 状 态, 事 务 不 会 查 看 中 间 状 态 的 数 据
260 第 10 章 SQL Server 的 程 序 设 计 247 (4) 持 久 性 (Durability) 一 个 事 务 一 旦 完 成 了 全 部 操 作, 它 对 数 据 库 的 所 有 更 新 操 作 的 结 果 应 反 映 到 数 据 库 中 事 务 完 成 后, 其 对 数 据 库 的 修 改 将 永 久 保 持 事 务 的 这 4 个 特 性 一 般 简 称 为 事 务 的 ACID 特 性, 可 以 说 对 数 据 库 中 的 数 据 保 护 是 围 绕 着 实 现 事 务 的 特 性 而 达 到 的 事 务 管 理 1. 事 务 管 理 语 句 (1) 使 用 BEGIN T RA NSAC TION 语 句 建 立 事 务 BEGIN TRAN[SACTION] 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] [ tran_name_variable] ] 事 务 结 束 后 没 有 遇 到 错 误, 事 务 中 的 所 有 数 据 修 改 在 数 据 库 中 都 将 永 久 有 效, 占 用 的 资 源 将 被 释 放 (3) 使 用 COM MI T WORK 语 句 标 识 事 务 结 束 COMMIT [WORK] 表 示 一 个 事 务 的 正 常 结 束 该 语 句 成 功 执 行 后,SQ L Server 将 从 上 一 个 事 务 结 束 后 到 该 语 句 之 间 的 所 有 SQ L 语 句 对 数 据 库 的 操 作 保 存 到 数 据 库 中 (4) 使 用 ROLLBACK T RA NSAC TION 语 句 回 滚 到 事 务 的 指 定 点 ROLLBACK [TRAN[SACTION] tran_name_variable savepoint_variable] ] 事 务 执 行 过 程 中 遇 到 错 误, 修 改 的 所 有 数 据 都 被 回 滚 到 事 务 指 定 位 置 的 状 态, 占 用 的 资 源 将 被 释 放 (5) 使 用 ROLLBACK WORK 语 句 回 滚 到 事 务 的 起 点 ROLLBACK [WORK] 表 示 一 个 事 务 的 非 正 常 结 束 该 语 句 执 行 后,SQ L Server 将 从 上 一 个 事 务 结 束 后 到 该 语 句 之 间 的 所 有 SQ L 语 句 对 数 据 库 的 操 作 撤 销, 数 据 库 恢 复 到 事 务 执 行 前 的 状 态 (6) 使 用 SA VE T RA NSAC TION 语 句 设 置 保 存 点 SAVE [TRAN[SACTION] [savepoint_name]]
261 248 SQL Server 数 据 库 应 用 技 术 SQ L Server 允 许 在 事 务 处 理 上 设 置 保 存 点 保 存 点 允 许 在 一 个 事 务 处 理 内 部 做 些 工 作, 而 后 基 于 特 定 条 件 回 滚 这 些 工 作 保 存 点 (savepoint _ name) 类 似 于 C 语 言 中 的 GO T O 语 句 的 标 号 2. 参 数 说 明 1 transaction_name 是 分 配 给 事 务 的 名 称 tran_ name_ variable 是 用 户 定 义 的 含 有 事 务 名 称 的 变 量 名 称, 必 须 用 char varchar nchar 或 nvarchar 数 据 类 型 声 明 该 变 量 3 WIT H M ARK[ description ] 指 定 在 日 志 中 标 记 事 务,description 是 描 述 该 标 记 的 字 符 串 如 果 使 用 了 WIT H M ARK, 则 必 须 指 定 事 务 名 4 savepoint_name 是 在 事 务 内 建 立 的 一 个 保 存 点 标 记 savepoint_variable 是 用 户 定 义 的 含 有 保 存 点 名 称 的 变 量 名 称, 必 须 用 char varchar nchar 或 nvarchar 数 据 类 型 声 明 该 变 量 3. 简 单 例 子 例 命 名 一 个 事 务 student_manager1, 事 务 将 为 课 程 号 最 后 两 位 为 06 的 多 媒 体 技 术 课 程 的 所 有 学 生 成 绩 扣 10 % USE student GO tranname VARCH AR(20) tranname = student_manager1 BEGIN tranname GO UPDATE stud_grade SET grade = grade 倡 0.90 WHERE course_id LIKE % 06 GO COM MIT tranname 例 使 用 事 务 处 理 方 式 对 表 stud_grade 执 行 更 新 操 作, 成 功 则 提 交 事 务, 失 败 则 取 消 事 务 USE student GO BEGIN TRAN student_manager2 UPDATE stud_grade SET grade = ROUND(SQRT(grade) 倡 10,0) WHERE course_id LIKE % ERROR!= 0 ROLLBACK TRAN student_manager2 ELSE COM MIT TRAN student_manager2 从 例 10 唱 14 中 可 以 看 到 事 务 是 类 似 于 具 有 一 个 入 口 两 个 出 口 的 一 种 控 制 结 构 CO M MI T 是 一 个 出 口, 表 示 事 务 的 所 有 操 作 都 完 成 了 ROLLBACK 是 另 一 个 出 口, 通 过 撤 销 所 有 的 已 经 做 过 的 操 作 达 到 一 个 操 作 也 没 做 的 效 果
262 第 10 章 SQL Server 的 程 序 设 计 事 务 模 式 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 语 句 可 以 关 闭 隐 性 事 务 模 式 例 隐 式 事 务 处 理 过 程 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( , 计 算 机 应 用 技 术 ) 唱 打 开 事 务 GO INSERT INTO specialty_code VALUES( , 计 算 机 网 络 技 术 ) GO INSERT INTO specialty_code VALUES( , 计 算 机 控 制 技 术 ) GO INSERT INTO specialty_code VALUES( , 多 媒 体 技 术 ) GO INSERT INTO specialty_code VALUES( , 计 算 机 软 件 技 术 ) GO INSERT INTO specialty_code VALUES( , 计 算 机 通 信 技 术 ) GO COM MIT TRANSACTION GO SELECT COUNT( 倡 ) FROM specialty_code INSERT INTO specialty_code VALUES( , 计 算 机 管 理 技 术 ) SELECT 倡 FROM specialty_code COM MIT TRANSACTION GO SET IMPLICIT_TRANSACTIONS OFF 唱 关 闭 隐 式 事 务
263 250 SQL Server 数 据 库 应 用 技 术 3. 自 动 事 务 模 式 在 自 动 事 务 模 式 下, 每 个 T ransact 唱 SQ L 语 句 在 成 功 执 行 完 成 后, 都 被 自 动 提 交 ; 如 果 遇 到 错 误, 则 自 动 回 滚 该 语 句 该 模 式 为 系 统 默 认 的 事 务 管 理 模 式 事 务 日 志 事 务 日 志 用 来 记 录 事 务 的 每 一 次 对 数 据 库 的 更 新 操 作, 包 括 用 户 的 更 新 操 作 以 及 由 此 引 起 的 系 统 内 部 的 更 新 操 作 有 了 事 务 日 志,DBM S 就 可 以 根 据 事 务 日 志 进 行 事 务 故 障 恢 复 和 系 统 故 障 恢 复, 并 结 合 备 份 进 行 介 质 故 障 恢 复 了 1. 事 务 日 志 的 内 容 通 常, 事 务 日 志 中 需 要 登 记 的 主 要 内 容 包 括 : (1) 各 个 事 务 的 开 始 (BEGIN T RA NSAC TION) 标 记 ; (2) 各 个 事 务 的 结 束 (CO M MI T 或 ROL LBACK) 标 记 ; (3) 各 个 事 务 的 所 有 更 新 操 作, 每 个 记 录 的 内 容 包 含 : 瞯 事 务 标 识 ( 标 明 是 哪 个 事 务 ) 瞯 操 作 的 类 型 ( 插 入 删 除 或 修 改 ) 瞯 操 作 对 象 ( 记 录 内 部 标 识 ) 瞯 更 新 前 数 据 的 旧 值 ( 对 插 入 操 作 而 言, 此 项 为 空 值 ) 瞯 更 新 后 数 据 的 新 值 ( 对 删 除 操 作 而 言, 此 项 为 空 值 ) 2. 事 务 日 志 文 件 (Logging) 事 务 日 志 用 于 保 持 数 据 库 的 一 致 性 事 务 日 志 文 件 必 须 遵 循 两 条 原 则 : (1) 事 务 的 次 序 严 格 按 并 发 事 务 执 行 的 时 间 次 序 (2) 必 须 先 写 日 志 事 务 文 件, 后 写 数 据 库 文 件 10.3 锁 机 制 锁 作 为 一 种 安 全 机 制, 用 以 控 制 多 个 用 户 的 并 发 操 作, 可 以 防 止 用 户 读 取 正 在 由 其 他 用 户 更 改 的 数 据 或 者 多 个 用 户 同 时 修 改 同 一 数 据, 从 而 确 保 事 务 完 整 性 和 数 据 库 一 致 性 锁 的 控 制 方 法 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 锁 这 就
264 第 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 释 放 所 有 锁 查 看 锁 的 信 息 使 用 系 统 存 储 过 程 sp_lock 查 看 锁 的 信 息, 其 语 法 形 式 是 : [EXEC] sp_lock spid1 = ] spid1 spio2 = ] spid2 ] 参 数 说 明 : spid1 = ] spid1 : 指 定 进 程 标 识 号 该 进 程 标 识 号 存 储 在 master.dbo. sysprocesses 中 如 果 没 有 指 定 spid1, 则 显 示 所 有 锁 的 信 息
265 252 SQL Server 数 据 库 应 用 技 术 spio2 = ] spid2 : 另 外 一 个 进 程 标 识 号 例 显 示 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 转 换 死 锁 一 般 来 说, 对 数 据 库 的 修 改 由 一 个 事 务 组 成, 此 事 务 读 取 记 录, 获 取 资 源 的 共 享 锁, 然 后 修 改 行, 最 后 将 锁 转 换 为 排 它 锁 但 是 采 用 这 种 方 法 时, 如 果 两 个 事 务 获 得 了 资 源 上 的 共 享 锁, 然 后 试 图 同 时 更 新 数 据, 并 均 要 将 锁 转 换 为 排 它 锁, 此 时 两 个 事 务 都 会 等 待 对 方 释 放 共 享 锁, 形 成 死 锁 前 面 讨 论 的 修 改 锁 就 是 为 了 避 免 这 种 死 锁 现 象, 因 为 一 次 只 有 一 个 事 务 可 以 获 得 资 源 的 更 新 锁, 如 果 事 务 修 改 资 源, 则 直 接 将 修 改 锁 转 换 为 排 它 锁 否 则, 锁 转 换 为 共 享 锁 通 常, 根 据 使 用 不 同 的 锁 类 型 锁 定 资 源 然 而 当 某 组 资 源 的 两 个 或 多 个 线 程 之 间 有 循 环 相 关 性 时, 就 会 发 生 死 锁 现 象 在 数 据 库 中 解 决 死 锁 常 用 的 方 法 有 : (1) 要 求 每 个 事 务 一 次 就 将 要 使 用 的 数 据 全 部 加 锁, 否 则 就 不 能 继 续 执 行 (2) 预 先 规 定 一 个 锁 顺 序, 所 有 事 务 都 按 这 个 顺 序 实 行 加 锁, 这 样 也 不 会 发 生 死 锁 例 如, 通 过 SE T DEADLOCK PRIORI T Y 语 句 设 置 会 话 的 优 先 级, 如 果 设 置 为 LOW 说 明 该 会 话 的 优 先 级 较 低, 出 现 死 锁 时 首 先 中 断 该 会 话 的 事 务
266 第 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 代 码 可 以 获 得 数 据 集 中 最 紧 密 的 数 据 的 一 种 方 法 游 标 的 定 义 及 其 优 点 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) 和 面 向 行 的 程 序 设 计 之 间 的 桥 梁, 使 这 两 种 处 理 方 式 通 过 游 标 沟 通 起 来
267 254 SQL Server 数 据 库 应 用 技 术 使 用 游 标 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]
268 第 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) 有 两 个 全 局 变 量 可 以 提 供 关 于 游 标 活 动 的 信 息 FE T CH_S T A T U S 保 存 着 最 后 FE T C H 语 句 执 行 后 的 状 态 信 息, 如 表 10 唱 2 所 示 表 10 唱 2 FETCH 语 句 的 状 态 值 值 含 义 0 表 示 成 功 完 成 fetch 语 句 表 示 fetch 语 句 有 错 误, 或 者 当 前 游 标 指 针 已 在 结 果 集 中 的 最 后 一 行, 结 果 集 中 不 再 有 数 据 表 提 取 的 行 不 存 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 语 句 中 使 用 游 标 来 更 新 或 删 除 表 或 视 图 中 的 行, 但 不 能 用 来 插 入 新 行
269 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 语 句 的 执 行
270 第 10 章 SQL Server 的 程 序 设 计 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 会 自 动 先 关 闭 这 个 游 标, 然 后 再 释 放 它 注 意 : 关 闭 游 标 并 不 改 变 游 标 的 定 义, 可 以 不 用 再 次 声 明 一 个 被 关 闭 的 游 标 而 重 新 打 开 它 但 释 放 游 标 就 释 放 了 与 该 游 标 有 关 的 一 切 资 源, 也 包 括 游 标 的 声 明, 就 不 能 再 使 用 该 游 标 了 游 标 示 例 例 本 例 说 明 了 一 个 游 标 是 如 何 工 作 的 例 子 中 显 示 的 游 标 结 果 集 是 由 SQ L 语 句 创 建 的, 用 于 查 询 sysobjects 系 统 表, 从 而 获 得 student 数 据 库 中 的 所 有 用 户 表 名 并 通 过 游 标, 逐 行 处 理 每 个 表, 调 用 sp_spaceused 系 统 存 储 过 程 获 得 每 个 表 的 空 间 使 用 情 况 最 后 关 闭 和 释 放 游 标 USE student GO 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 table_name FETCH_STAT US = 0) BEGIN EXEC table_name
271 258 SQL Server 数 据 库 应 用 技 术 FETCH NEXT FROM tnames_cursor table_name END CLOSE tnames_cursor DEALLOCATE tnames_cursor 例 统 计 多 媒 体 技 术 课 程 考 试 成 绩 的 各 分 数 段 的 分 布 情 况 DECLARE course_cursor CURSOR FOR 唱 声 明 游 标 SELECT grade FROM stud_grade WHERE course_id = (SELECT course_id FROM lesson_info WHERE course_name = 多 媒 体 技 术 ) p_100 SMALLINT,@ p_90 SMALLINT,@ p_80 SMALLINT p_70 p_60 p_others SMALLINT p_grade SMALLINT p_100 = 0 p_90 = 0 p_80 = 0 p_70 = 0 p_60 = 0 p_others = 0 p_grade = 0 OPEN course_cursor 唱 打 开 游 标 LOOP : FETCH NEXT FROM course_cursor p_grade 唱 使 用 游 标 提 取 数 据 IF p_grade = 100) p_100 p_ ELSE IF p_grade > = 90) p_90 p_ ELSE p_grade > = 80) p_80 p_ ELSE IF p_grade > = 70) p_70 p_ ELSE IF p_grade > = 60) p_60 p_ ELSE p_others p_others + FETCH_STAT US = 0) GOTO LOOP PRINT p_100) +, + p_90) +, + p_80) +, PRINT p_70) +, + p_60) +, + p_others) CLOSE course_cursor 唱 关 闭 游 标 倡 / DEALLOCATE course_cursor 唱 释 放 游 标 倡 / 实 训 1. 实 训 目 的 (1) 了 解 SQ L Server 程 序 设 计 的 方 法 (2) 学 会 批 处 理 流 程 控 制 事 务 处 理 锁 游 标 的 使 用 方 法
272 第 10 章 SQL Server 的 程 序 设 计 实 训 的 知 识 准 备 充 分 理 解 批 处 理 流 程 控 制 事 务 处 理 锁 游 标 等 基 本 概 念, 知 晓 如 何 使 用 事 务, 以 及 在 什 么 情 况 下 需 要 使 用 事 务 掌 握 简 单 事 务 处 理 语 句 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 由 修 改 为 因 为 课 程 编 号 出 现 在 课 程 信 息 表 (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 由 修 改 为 , 以 达 到 数 据 保 持 一 致 性 的 目 的 USE student GO BEGIN TRAN stud_transaction / 倡 开 始 一 个 事 务 倡 / UPDATE lesson_info SET course_id = WHERE course_id = SAVE TRAN stud_savepoint / 倡 保 存 能 回 滚 的 点 倡 / UPDATE teach_schedule SET course_id = WHERE course_id = UPDATE stud_grade SET course_id = WHERE course_id = UPDATE teacher_info SET course_id = WHERE course_id = 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, 那 将 使 事 务 中 所 有
273 260 SQL Server 数 据 库 应 用 技 术 的 修 改 都 被 取 消 (4) 制 造 死 锁 1 在 查 询 分 析 器 输 入 并 执 行 下 列 语 句 : USE student SET DEADLOCK_PRIORITY LOW / 倡 指 定 当 前 会 话 为 死 锁 首 选 牺 牲 品 倡 / BEGIN TRANSACTION UPDATE stud_info SET mark = 565 WHERE stud_id = / 倡 第 1 个 事 务 倡 / 2 单 击 工 具 栏 上 的 新 建 查 询 图 标, 新 建 一 个 查 询 分 析 器 窗 口, 在 新 的 查 询 分 析 器 中 输 入 并 执 行 下 列 语 句 : BEGIN TRANSACTION UPDATE stud_grade SET grade = 65 WHERE stud_id = / 倡 第 2 个 事 务 倡 / 3 切 换 到 第 一 个 查 询 分 析 器 窗 口, 输 入 并 执 行 下 列 语 句 : UPDATE stud_grade SET grade = 67 WHERE stud_id = / 倡 第 1 个 事 务 倡 / 此 时, 事 务 1 和 事 务 2 都 锁 住 了 stud_grade 表 中 stud_id = 的 记 录, 所 以 第 1 个 事 务 被 第 2 个 事 务 阻 止, 但 还 没 有 发 生 死 锁 4 切 换 到 第 二 个 查 询 分 析 器 窗 口, 输 入 并 执 行 下 列 语 句 : UPDATE stud_info SET mark = 568 WHERE stud_id = / 倡 第 2 个 事 务 倡 / 此 时, 由 于 事 务 1 等 待 事 务 2 释 放 stud_grade 表 中 stud_id = 记 录 的 锁, 而 事 务 2 又 等 待 事 务 1 释 放 stud_info 表 中 stud_id = 记 录 的 锁, 这 样 互 相 等 待 而 造 成 死 锁 因 为 第 一 个 事 务 的 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 的 值, 以 确 保 新 位 置 的 有 效 性 倡 FETCH_ST AT US = 0 BEGIN FETCH NEXT FROM stud_cursor END CLOSE stud_cursor / 倡 关 闭 游 标 倡 / DEALLOCATE stud_cursor
274 第 10 章 SQL Server 的 程 序 设 计 定 义 一 个 游 标 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) 什 么 是 事 务? 如 果 要 取 消 一 个 事 务, 使 用 什 么 语 句?
275 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
276 第 10 章 SQL Server 的 程 序 设 计 263 courseno = course_id score = grade PRINT 学 号 no + 姓 名 name + 课 程 号 courseno + 成 绩 + STR score) END FETCH NEXT FROM stud_cursor no,@ name,@ courseno,@ score END (7) 请 用 适 当 的 语 句 完 善 下 列 程 序 USE student GO DECLARE teacher_cursor CURSOR FOR SELECT 倡 FROM teacher_info / 倡 打 开 游 标 倡 / FETCH NEXT FROM 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 tablename nvarchar(256) DECLARE tnames_cursor CURSOR FOR SELECT name FROM sysobjects WHERE objectproperty(id, IsUserTable ) = 1 ORDER BY name OPEN tnames_cursor
277 264 SQL Server 数 据 库 应 用 技 术 FETCH NEXT FROM tnames_cursor table_name FETCH_STAT US = 0 ) BEGIN EXEC tablename FETCH NEXT FROM tnames_cursor tablename END CLOSE tnames_cursor DEALLOCATE tnames_cursor (1) 此 例 中 的 游 标 名 是 什 么? (2) 此 例 中 的 游 标 类 型 是 什 么? (3) 此 例 中 的 游 标 所 指 示 的 结 果 集 是 什 么? (4) 请 说 明 EXEC tablename 命 令 的 作 用 (5) 请 说 明 FE T CH NEX T FRO M tnames _ cursor IN T table _ name 命 令 的 作 用 (6) 请 说 明 此 例 中 的 循 环 条 件
278 第 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 电 子 表 格 格 式,
279 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 工 作 表 和 导 入 文 本 文 件 的 整 个 过 程 导 入 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 所 示 的 指 定 表 复 制 或 查 询 的 对 话
280 第 11 章 数 据 转 换 服 务 267 图 11 唱 2 选 择 数 据 源 图 11 唱 3 选 择 目 的 图 11 唱 4 指 定 表 复 制 或 查 询
281 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 表 导 入 到 数 据 库 的 工 作
282 第 11 章 数 据 转 换 服 务 导 入 文 本 文 件 图 11 唱 7 导 入 / 导 出 向 导 摘 要 SQ L Server 2000 除 了 可 以 将 数 据 表 和 Excel 电 子 表 格 的 数 据 导 入 到 数 据 库 中, 还 可 以 将 文 本 文 件 中 的 数 据 导 入 到 SQ L Server 中 下 面 使 用 企 业 管 理 器 中 的 导 入 / 导 出 向 导 将 一 个 记 录 了 课 程 信 息 的 文 本 文 件 课 程 信 息.txt 导 入 到 数 据 库 student 中 的 表 aaaa 中 (1) 首 先 启 动 企 业 管 理 器 中 的 导 入 / 导 出 向 导, 在 如 图 11 唱 8 所 示 的 选 择 数 据 源 对 话 框 中 的 数 据 源 下 拉 框 中 选 择 文 本 文 件, 并 选 择 需 要 导 入 的 文 本 文 件 名 图 11 唱 8 选 择 数 据 源 (2) 单 击 下 一 步 按 钮, 在 如 图 11 唱 9 所 示 的 选 择 文 件 格 式 对 话 框 中, 必 须 根 据 图 中 的 文 件 预 览 来 选 择 是 带 分 隔 符 还 是 固 定 宽 度 的 源 文 件 格 式, 即 源 文 件 中 数 据 列 与 列 之 间 的 间 隔 方 式 如 果 选 择 与 源 文 件 不 一 致 将 会 导 致 错 误
283 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 所 示
284 第 11 章 数 据 转 换 服 务 271 图 11 唱 11 选 择 源 表 和 视 图 图 11 唱 12 保 存 调 度 和 复 制 包 图 11 唱 13 企 业 管 理 器 中 aaaa 数 据 表
285 272 SQL Server 数 据 库 应 用 技 术 11.3 导 出 数 据 SQ L Server 不 仅 可 以 将 数 据 导 入, 而 且 也 可 以 将 数 据 导 出 到 其 他 的 数 据 库 文 本 文 件 或 Excel 表 格, 等 下 面 介 绍 将 SQ L Server 数 据 库 中 的 数 据 分 别 导 出 到 Access 数 据 库 和 文 本 文 件 的 过 程 导 出 数 据 至 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 所 示
286 第 11 章 数 据 转 换 服 务 273 图 11 唱 15 选 择 目 的 图 11 唱 16 选 择 源 表 和 视 图 图 11 唱 17 Access 中 查 看 导 出 的 数 据
287 274 SQL Server 数 据 库 应 用 技 术 导 出 数 据 至 文 本 文 件 导 出 数 据 至 文 本 文 件 的 过 程 与 将 文 本 文 件 的 数 据 导 入 数 据 库 的 过 程 一 样, 不 同 的 是 导 入 / 导 出 的 源 和 目 的 不 同 将 数 据 库 导 出 到 文 本 文 件, 其 数 据 源 是 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 选 择 目 的
288 第 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 设 计 器 的 用 户 界 面 它 的 左 边 工
289 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 所 示
290 第 11 章 数 据 转 换 服 务 277 图 11 唱 24 配 置 数 据 源 和 数 据 目 的 (4) 接 着, 需 要 使 用 任 务 菜 单 或 者 任 务 工 具 栏 来 确 定 需 要 生 成 的 任 务 若 选 择 了 转 换 数 据 任 务, 并 分 别 单 击 数 据 源 和 数 据 目 的, 将 会 显 示 从 数 据 源 指 向 数 据 目 的 的 深 灰 色 箭 头 如 图 11 唱 25 所 示 图 11 唱 25 转 换 数 据 任 务 (5) 双 击 数 据 源 和 数 据 目 的 之 间 的 深 灰 色 箭 头, 就 可 以 打 开 该 任 务 的 对 话 框, 并 进 行 数 据 转 换 任 务 的 配 置, 如 图 11 唱 26 所 示 在 图 11 唱 26 所 示 的 源 标 签 页 中, 若 数 据 源 为 数 据 库, 则 可 以 提 供 选 择 指 定 表 视 图 或 使 用 T ransact 唱 SQ L 查 询, 过 滤 要 传 输 的 数 据 目
291 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 批 复 制 程 序 批 复 制 程 序 (bcp) 是 一 个 从 SQ L Server 导 入 / 导 出 数 据 的 命 令 行 形 式 的 程 序 它 可 以 在 运 行 bcp 的 机 器 上 把 表 或 视 图 中 的 数 据 导 出 到 一 个 文 件 中 该 文 件 可 以 被 发 送 到 另 一 台 计 算 机 或 另 一 个 位 置 上, 再 导 入 到 另 一 台 计 算 机 上 的 SQ L Server 数 据 库 中 1. 命 令 格 式 bcp {[[database_name.][owner].]{table_name view_name} query }
292 第 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 ( )] [ 唱 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 ( 新 行 ) 作 为 行 终 止 符
293 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 举 例 说 明 利 用 数 据 库 脚 本 和 bcp 命 令 将 student 数 据 库 复 制 到 其 他 机 器 上 (1) 将 student 数 据 库 生 成 SQ L 脚 本 1 展 开 服 务 器 组, 然 后 展 开 服 务 器 2 右 击 student 数 据 库, 然 后 单 击 所 有 任 务 下 的 生 成 SQ L 脚 本, 出 现 如 图 11 唱 27 所 示 的 对 话 框
294 第 11 章 数 据 转 换 服 务 281 图 11 唱 27 生 成 SQL 脚 本 唱 常 规 1 3 单 击 全 部 显 示, 再 选 中 编 写 全 部 对 象 脚 本 设 置 后 如 图 11 唱 28 所 示 图 11 唱 28 生 成 SQL 脚 本 唱 常 规 2 4 单 击 选 项 标 签 页, 如 图 11 唱 29 所 示, 选 中 编 写 数 据 库 脚 本 编 写 触 发 器 脚 本 编 写 主 键 外 键 默 认 值 和 检 查 约 束 脚 本 5 单 击 确 定 按 钮, 出 现 另 存 为 对 话 框, 表 示 将 脚 本 文 件 保 存 在 何 处, 这 里 将 其 保 存 在 C 根 目 录 下, 文 件 名 为 xsgl.sql 设 定 好 路 径 和 文 件 名 后, 单 击 保 存 按 钮 6 成 功 保 存 后, 出 现 编 写 脚 本 对 话 框, 单 击 确 定 按 钮 (2) 使 用 bcp 从 student 数 据 库 导 出 数 据
295 282 SQL Server 数 据 库 应 用 技 术 图 11 唱 29 生 成 SQL 脚 本 唱 选 项 在 M S 唱 DOS 命 令 运 行 如 下 命 令 : c : cd\ bcp student..stud_info out stud_info.txt 唱 n 唱 U sa 唱 P bcp student..teacher_info out teacher_info.txt 唱 n 唱 U sa 唱 P bcp student..stud_grade out stud_grade.txt 唱 n 唱 U sa 唱 P bcp student..lesson_info out lesson_info.txt 唱 n 唱 U sa 唱 P bcp student..teach_schedule out teach_schedule.txt 唱 n 唱 U sa 唱 P bcp student..dept_code out dept_code.txt 唱 n 唱 U sa 唱 P bcp student..specialty_code out specialty_code.txt 唱 n 唱 U sa 唱 P bcp student..staffroom_info out staffroom_info.txt 唱 n 唱 U sa 唱 P bcp student..classroom_info out classroom_info.txt 唱 n 唱 U sa 唱 P 可 以 将 上 述 命 令 以 批 处 理 文 件 ( 扩 展 名 为.bat) 形 式 保 存, 以 后 每 次 运 行 时 直 接 运 行 该 批 处 理 文 件 即 可 (3) 在 其 他 计 算 机 上 生 成 student 数 据 库 因 为 选 择 同 一 台 计 算 机 操 作, 所 以 采 取 模 拟 的 形 式 现 在 原 计 算 机 上 删 除 student 数 据 库, 再 重 新 生 成 (4) 利 用 生 成 的 SQ L 脚 本 创 建 数 据 库 在 查 询 分 析 器 的 主 菜 单 中 选 择 文 件 下 的 打 开 菜 单 项, 出 现 打 开 查 询 文 件 对 话 框, 找 到 刚 才 生 成 的 数 据 库 脚 本 文 件 xsgl.sql, 单 击 打 开 按 钮 ; 查 询 分 析 器 出 现 数 据 库 脚 本 文 件, 单 击 工 具 栏 的 运 行 按 钮 即 可 (5) 使 用 bcp 将 导 出 数 据 导 入 至 student 数 据 库 在 M S 唱 DOS 命 令 运 行 如 下 命 令 :
296 第 11 章 数 据 转 换 服 务 283 c : cd\ bcp student..stud_info in stud_info.txt 唱 n 唱 U sa 唱 P bcp student..teacher_info in teacher_info.txt 唱 n 唱 U sa 唱 P bcp student..stud_grade in stud_grade.txt 唱 n 唱 U sa 唱 P bcp student..lesson_info in lesson_info.txt 唱 n 唱 U sa 唱 P bcp student..teach_schedule in teach_schedule.txt 唱 n 唱 U sa 唱 P bcp student..dept_code in dept_code.txt 唱 n 唱 U sa 唱 P bcp student..specialty_code in specialty_code.txt 唱 n 唱 U sa 唱 P bcp student..staffroom_info in staffroom_info.txt 唱 n 唱 U sa 唱 P bcp student..classroom_info in classroom_info.txt 唱 n 唱 U sa 唱 P 同 样, 可 以 将 上 述 命 令 以 批 处 理 文 件 ( 扩 展 名 为.bat) 形 式 保 存, 以 后 每 次 运 行 时 直 接 运 行 该 批 处 理 文 件 即 可 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 中 的 一 样
297 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
298 第 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 中, 选 用 下 列 查 询 语 句 :
299 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 命 令 是 :
300 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 实 例, 否 则 系 统 将 拒 绝 用 户 的 连 接 然 后 需 要 检 验 用 户 是 否 有 访 问 服 务 器 上 数 据 库 的 权 限, 为 此 需 要 授 予 每 个 数 据 库 中 映 射 到 用 户 登 录 的 账 户 访 问 权 限, 权 限 认 证 就 可 以 控 制 用 户 在 数 据 库 中 进 行 的 操 作 身 份 验 证 在 验 证 阶 段, 系 统 对 用 户 登 录 进 行 验 证 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 表 中 查 找 该 账 号, 以 确 定 该 账 号 是 否 有 权 登 录 在 这 种 方 式 下, 用 户 不 必 提 供
301 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 验 证 模 式 权 限 认 证 为 了 防 止 不 合 理 的 使 用 而 造 成 数 据 的 泄 密 和 破 坏,SQ L Server 数 据 库 管 理 系 统 除 了
302 第 12 章 SQL Server 2000 的 安 全 管 理 289 使 用 身 份 验 证 方 法 来 限 制 用 户 进 入 数 据 库 系 统, 还 使 用 权 限 认 证 来 控 制 用 户 对 数 据 库 操 作 当 用 户 身 份 通 过 了 验 证 连 接 到 SQ L Server 实 例 后, 在 用 户 可 以 访 问 的 每 个 数 据 库 中 都 要 求 单 独 的 用 户 账 户, 对 于 没 有 账 户 的 数 据 库, 将 无 法 访 问 此 时, 用 户 虽 然 可 以 发 送 各 种 T ransact 唱 SQ L 语 句 命 令, 但 是 这 些 操 作 命 令 在 数 据 库 中 是 否 能 够 成 功 地 执 行, 还 取 决 于 该 用 户 账 户 在 该 数 据 库 中 对 这 些 操 作 的 权 限 设 置 如 果 发 出 操 作 命 令 的 用 户 没 有 执 行 该 语 句 的 权 限 或 者 没 有 访 问 该 对 象 的 权 限, 则 SQ L Server 将 不 会 执 行 该 操 作 命 令 所 以 若 没 有 通 过 数 据 库 中 的 权 限 认 证, 即 使 用 户 连 接 到 了 SQ L Server 示 例 上, 也 无 法 使 用 数 据 库 一 般 来 说, 数 据 库 的 所 有 者 或 者 对 象 的 所 有 者 可 以 对 其 他 数 据 库 用 户 授 予 或 者 解 除 权 限 12.2 创 建 和 管 理 安 全 账 户 创 建 安 全 账 户 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 用 户 账 户, 则 不 能 访 问 该 数 据 库, 除 非 它
303 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 系
304 第 12 章 SQL Server 2000 的 安 全 管 理 291 统 的 用 户 作 为 SQ L Server 的 登 录 账 号 不 过, 在 这 之 前 需 要 单 击 开 始 设 置 控 制 面 板 管 理 工 具 计 算 机 管 理, 右 击 本 地 用 户 和 用 户 用 户, 选 中 新 用 户, 如 图 12 唱 3 所 示, 在 图 12 唱 4 所 示 的 新 用 户 对 话 框 中, 输 入 用 户 名 和 密 码 等 图 12 唱 2 选 择 Windows 用 户 的 对 话 框 图 12 唱 3 Windows 中 计 算 机 管 理 窗 口 图 12 唱 4 Windows 中 创 建 新 用 户 窗 口
305 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 = encryptopt = ] encryption_option ] 其 loginame = ] login 为 登 录 账 号 名 passwd = ] passw ord 为 登 录 密 defdb = ] database 为 登 录 的 默 认 数 据 库 deflanguage = ] language 为 使 用 的 语 言, sid = ]sid 为 安 全 标 识 encryptopt = ] encryption_option 为 指 定 当 密 码 存 储 在
306 第 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 组 及 其 服 务 器, 在 数 据 库 文 件 夹 中, 展 开 某
307 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 在 数 据 库 用 户 属 性 对 话 框 中, 单 击 权 限 按 钮, 打 开 权 限 设 置 对 话 框 在 此 对
308 第 12 章 SQL Server 2000 的 安 全 管 理 295 话 框 中, 可 以 设 置 用 户 对 数 据 库 对 象 所 具 有 的 权 限 在 对 象 列 中, 显 示 了 数 据 库 中 所 有 的 对 象, 而 所 有 者 列 则 显 示 了 相 应 对 象 的 所 有 者 其 后 的 6 列 则 是 对 数 据 库 对 象 的 操 作, 具 体 含 义 如 下 : 瞯 SELEC T : 对 表 或 者 视 图 的 查 询 ; 瞯 INSER T : 在 表 或 者 视 图 中 插 入 记 录 ; 瞯 U PDA T E : 对 表 或 者 视 图 中 的 数 据 修 改 ; 瞯 DELE T E : 删 除 表 或 者 视 图 中 的 数 据 ; 瞯 EXEC : 执 行 存 储 过 程 ; 瞯 DRI : Declarative Referential Integrity, 可 对 表 的 外 键 加 上 限 制, 以 达 成 表 的 参 照 完 整 性 对 某 个 数 据 库 对 象 而 言, 如 果 选 中 对 应 的 复 选 框, 则 表 示 具 有 对 该 对 象 进 行 相 应 操 作 的 权 限 每 个 复 选 框 具 有 3 种 状 态 空 白 时 表 示 未 指 定 权 限, 或 权 限 还 原 到 未 设 置 状 态 ; 当 打 时 表 示 具 有 该 权 限 ; 当 打 时, 表 示 不 具 有 该 权 限 3 如 果 要 设 置 对 表 或 者 视 图 的 某 一 列 进 行 操 作 的 权 限, 可 在 列 表 中 选 择 表 或 者 视 图 对 象, 然 后 单 击 列 按 钮, 可 打 开 列 权 限 对 话 框 使 用 对 话 框 即 可 进 行 相 应 权 限 的 设 置 管 理 安 全 账 户 1. 查 看 服 务 器 的 登 录 账 号 (1) 使 用 企 业 管 理 器 查 看 登 录 账 号 进 入 企 业 管 理 器, 展 开 SQ L Server 组, 找 到 所 要 连 接 的 SQ L Server 服 务 器, 展 开 该 服 务 器 对 应 的 文 件 夹, 再 展 开 安 全 性 文 件 夹, 单 击 登 录 选 项, 即 可 看 到 系 统 创 建 的 默 认 登 录 账 号 及 已 建 立 的 其 他 登 录 账 号 (2) 使 用 存 储 过 程 查 看 登 录 账 号 使 用 sp_helplogins 可 查 看 登 录 账 号 语 法 格 式 : EXEC sp_helplogins 2. 修 改 登 录 账 户 属 性 (1) 使 用 企 业 管 理 器 修 改 登 录 账 户 属 性 在 创 建 登 录 之 后, 有 时 需 要 更 改 密 码 默 认 数 据 库 或 默 认 语 言 例 如, 用 户 可 能 忘 了 自 己 的 密 码, 或 者 出 于 安 全 考 虑 而 想 更 改 密 码, 或 者 需 要 定 期 使 用 另 一 个 数 据 库, 或 者 需 要 查 看 以 另 一 种 语 言 显 示 的 消 息 一 般 可 执 行 下 列 操 作 : 1 展 开 服 务 器 组, 然 后 展 开 服 务 器 2 展 开 安 全 性 项, 然 后 单 击 登 录 3 在 详 细 信 息 窗 格 中, 右 击 要 修 改 的 登 录, 从 弹 出 菜 单 中 选 择 属 性 选 项 4 单 击 常 规 标 签 页, 在 密 码 文 本 框 中 输 入 新 的 密 码 ; 或 者 在 数 据 库 列 表 中, 单 击 登 录 到 SQ L Server 实 例 之 后 登 录 所 连 接 的 新 的 默 认 数 据 库 ; 或 者 在 语 言 列 表 中, 单
309 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 账 户 上, 可 执 行 下 列 代 码 :
310 第 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 删 除 登 录 和 用 户 1. 删 除 登 录 账 号 (1) 使 用 企 业 管 理 器 删 除 登 录 账 号 进 入 企 业 管 理 器, 展 开 SQ L Server 组, 找 到 所 要 连 接 的 SQ L Server 服 务 器, 展 开 该 服 务 器 对 应 的 文 件 夹, 再 展 开 安 全 性 文 件 夹, 单 击 登 录 选 项, 在 企 业 管 理 器 的 右 侧 窗 格 中 即 可 看 到 系 统 创 建 的 默 认 登 录 账 号 及 已 建 立 的 其 他 登 录 账 号 在 需 要 更 改 属 性 的 账 号 上 右 击, 在 出 现 的 快 捷 菜 单 中, 单 击 删 除 菜 单 项, 此 时 会 打 开 一 个 提 示 对 话 框, 单 击 是 按 钮 确 定 删 除 (2) 使 用 存 储 过 程 删 除 登 录 账 号 使 用 存 储 过 程 sp_droplogin 可 删 除 某 一 登 录 账 号 语 法 格 式 如 下 : sp_droplogin loginame = ] login loginame = ] login 为 被 删 除 的 登 录 账 号 例 从 数 据 库 student 中 删 除 stud_login 登 录 账 号 EXEC sp_droplogin stud_login 要 删 除 用 sp_grantlogin 或 sp_denylogin 创 建 的 Microsoft Window s 用 户 或 组 的 登 录 项, 可 以 使 用 sp_revokelogin 存 储 过 程, 其 语 法 格 式 如 下 : sp_revokelogin loginame = ] login
311 298 SQL Server 数 据 库 应 用 技 术 例 删 除 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 例 从 当 前 数 据 库 中 删 除 用 户 账 户 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 添 加 ) 例 从 数 据 库 student 中 删 除 stud_user 用 户 账 号 EXEC sp_grantdbaccess computer\stud_admin, stud_manager EXEC sp_dropuser stud_manager 12.3 管 理 数 据 库 用 户 和 角 色 服 务 器 角 色 角 色 (role) 是 一 组 用 户 所 构 成 的 组, 可 分 为 服 务 器 角 色 与 数 据 库 角 色 以 下 先 介 绍 服 务 器 角 色, 然 后 介 绍 数 据 库 角 色 服 务 器 角 色 是 负 责 管 理 与 维 护 SQ L Server 的 组, 一 般 只 会 指 定 需 要 管 理 服 务 器 的 登 录 账 号 属 于 服 务 器 角 色 SQ L Server 在 安 装 过 程 中 定 义 几 个 固 定 的 服 务 器 角 色, 其 具 体 权 限 如 下 : 1 sysadmin : 全 称 为 System Administrators, 可 以 在 SQ L Server 中 执 行 任 何 活 动
312 第 12 章 SQL Server 2000 的 安 全 管 理 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 服 务 器 角 色 数 据 库 角 色 角 色 是 一 个 强 大 的 工 具, 可 以 将 用 户 集 中 到 一 个 单 元 中, 然 后 对 该 单 元 应 用 权 限 对 一 个 角 色 授 予 拒 绝 或 废 除 的 权 限 也 适 用 于 该 角 色 的 任 何 成 员 可 以 建 立 一 个 角 色 来 代 表 单 位 中 一 类 工 作 人 员 所 执 行 的 工 作, 然 后 给 这 个 角 色 授 予 适 当 的 权 限 和 登 录 账 号 类 似, 用 户 账 号 也 可 以 分 成 组, 称 为 数 据 库 角 色 (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 个 固 定 数 据 库 角 色,
313 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 为 新 建 角 色 的 拥 有 者 例 在 student 数 据 库 中 创 建 一 名 称 为 myrole 的 角 色 USE student EXEC sp_addrole myrole, dbo 如 果 创 建 应 用 程 序 角 色, 需 要 使 用 sp_addapprole 存 储 过 程 语 法 格 式 为 : rolename = ] role password = ] password 语 句 将 在 当 前 数 据 库 中 添 加 一 个 特 殊 类 型 的 角 色 以 使 应 用 程 序 安 全 其 中 : rolename = ] role 为 新 角 色 的 名 称 passw ord = ] passw ord 激 活 角 色 所 需 的 密 码, passw ord 以 加 密 形 式 存 储 例 利 用 sp_addapprole 在 当 前 数 据 库 中 建 立 一 个 应 用 程 序 角 色 approle Use student EXEC sp_addapprole approle, application 应 用 程 序 角 色 创 建 后, 还 要 激 活 与 当 前 数 据 库 中 的 应 用 程 序 角 色 关 联 的 权 限 通 常 使 用 sp_setapprole 存 储 过 程 其 语 法 格 式 为 :
314 第 12 章 SQL Server 2000 的 安 全 管 理 301 sp_setapprole rolename = ] 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 使 用 的 加 密 样 式 例 在 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 为 将 要 从 当 前 数 据 库 中 删 除 的 角 色 的 名 称
315 302 SQL Server 数 据 库 应 用 技 术 例 删 除 数 据 库 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
316 第 12 章 SQL Server 2000 的 安 全 管 理 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) 暗 示 性 权 限 主 要 控 制 那 些 只 能 由 预 定 义 系 统 角 色 的 成 员 或 数 据 库 对 象 所 有 者 执 行 的 活 动 例 如, 数 据 库 对 象 所 有 者 可 以 对 所 拥 有 的 对 象 执 行 一 切 活 动, 拥 有 表 的 用 户 可 以 查 看 添 加 或 删 除 数 据, 更 改 表 定 义, 或 者 控 制 允 许 其 他 用 户 对 表 进 行 操 作 的 权 限 使 用 企 业 管 理 器 管 理 权 限 1. 给 用 户 授 予 数 据 库 中 的 语 句 权 限 在 企 业 管 理 器 中, 如 果 要 给 用 户 授 予 数 据 库 中 的 语 句 权 限, 可 按 下 列 步 骤 进 行 操 作 : 展 开 服 务 器 组, 然 后 展 开 服 务 器 ; 展 开 数 据 库 项, 右 击 将 被 授 予 语 句 权 限 的 用 户 所 在 的 数 据 库, 然 后 从 弹 出 菜 单 中 选 择 属 性 选 项 ; 单 击 权 限 标 签 页, 选 择 授 予 每 位 用 户 的 语 句 权 限 其 中, 选 中 标 记 表 示 授 予 权 限 如 图 12 唱 5 所 示 图 12 唱 5 授 予 用 户 的 语 句 权 限 2. 通 过 授 权 允 许 访 问 某 个 对 象 通 过 授 权 而 允 许 访 问 某 个 对 象, 可 按 下 列 步 骤 进 行 操 作 : 展 开 服 务 器 组, 然 后 展 开 服
317 304 SQL Server 数 据 库 应 用 技 术 务 器 ; 展 开 数 据 库 项, 然 后 展 开 对 象 所 属 的 数 据 库 ; 根 据 对 象 类 型, 单 击 表 视 图 存 储 过 程 等 对 象 ; 在 详 细 信 息 窗 格 中, 右 击 授 予 权 限 所 在 的 对 象, 从 弹 出 菜 单 中 选 择 所 有 任 务 管 理 权 限 选 项 ; 单 击 列 出 全 部 用 户 / 用 户 定 义 的 数 据 库 角 色 /public 选 项, 然 后 选 择 授 予 每 位 用 户 的 权 限, 其 中, 选 中 标 记 表 示 授 予 权 限, 如 图 12 唱 6 所 示 图 12 唱 6 针 对 某 个 对 象 给 用 户 授 权 3. 授 予 拒 绝 或 撤 销 用 户 定 义 角 色 在 多 个 对 象 上 的 权 限 如 果 要 授 予 拒 绝 或 废 除 用 户 定 义 角 色 在 多 个 对 象 上 的 权 限, 可 按 下 列 步 骤 进 行 操 作 : 展 开 服 务 器 组, 然 后 展 开 服 务 器 ; 展 开 数 据 库 项, 然 后 展 开 角 色 所 属 的 数 据 库 ; 单 击 角 色 ; 在 详 细 信 息 窗 格 中, 右 击 要 授 予 拒 绝 废 除 其 权 限 的 用 户 定 义 的 角 色, 然 后 从 弹 出 菜 单 中 选 择 属 性 选 项 ; 单 击 权 限 按 钮 ; 单 击 列 出 全 部 对 象 选 项, 然 后 选 择 在 每 个 对 象 上 授 予 拒 绝 或 废 除 的 权 限 如 图 12 唱 7 所 示 其 中, 选 中 标 志 表 示 授 予 权 限 ; 表 示 拒 绝 权 限 ; 空 框 表 示 废 除 权 限 使 用 Transact 唱 SQL 语 句 管 理 权 限 1. 授 予 权 限 授 予 权 限 的 操 作 可 通 过 GRA N T 语 句 来 完 成 下 面 就 授 予 语 句 权 限 和 授 予 对 象 权 限 分 别 加 以 介 绍 (1) 授 予 语 句 权 限 的 语 法 格 式 如 下 : GRANT {ALL statement [,...n]} TO security_account [,...n ] (2) 授 予 对 象 权 限 的 语 法 格 式 如 下 : GRANT
318 第 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 子 句, 则 获 得 某 种 权 限 的 用 户 只 能 使 用 该 权 限, 但 不 能 传 播 权 限 例 给 用 户 stud_user 和 teach_user 以 及 Window s 用 户 组 student\stud_ group 授 予 多 个 语 句 权 限, 可 执 行 下 列 代 码 : USE master GRANT CREATE DATABASE, CREATE TABLE TO stud_user, teach_user,[student\stud_group] 例 给 用 户 stud_user stud_manager 授 予 对 stud_info 表 的 所 有 权 限 首 先 给 public 角 色 授 予 SELEC T 权 限, 然 后, 将 特 定 的 权 限 授 予 stud_ user stud_ manager 用 户, 需 要 执 行 如 下 程 序 代 码 :
319 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] 例 拒 绝 给 用 户 stud_user 和 teach_user 以 及 Windows 用 户 组 student \ stud_group 授 予 的 多 个 语 句 权 限, 可 执 行 下 列 代 码 : USE master DENY CREATE DATABASE, CREATE TABLE TO stud_user, teach_user,[student\stud_group] 例 拒 绝 给 用 户 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
320 第 12 章 SQL Server 2000 的 安 全 管 理 撤 销 权 限 要 撤 销 以 前 给 当 前 数 据 库 内 的 用 户 授 予 或 拒 绝 的 权 限, 可 通 过 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}] 例 撤 销 授 予 用 户 账 户 stud_user 的 CREA T E T ABLE 权 限 REVOKE CREATE T ABLE FROM stud_user 例 撤 销 授 予 多 个 用 户 账 户 的 多 个 权 限 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) 学 会 创 建 和 管 理 服 务 器 角 色 和 数 据 库 角 色
321 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
322 第 12 章 SQL Server 2000 的 安 全 管 理 使 用 企 业 管 理 器 先 创 建 数 据 库 角 色 ( 标 准 角 色 ), 新 角 色 名 称 为 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 的 查 询 权 限
323 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 登 录, 并 指 定 密 码 以 及 名 为 student 的 默 认 数 据 库 EXEC sp_addlogin stud_login2, , 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
324 第 12 章 SQL Server 2000 的 安 全 管 理 创 建 一 个 名 字 为 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
325 第 13 章 备 份 与 还 原 任 何 系 统 都 不 可 避 免 会 出 现 各 种 形 式 的 故 障, 而 某 些 故 障 可 能 会 导 致 数 据 库 灾 难 性 的 损 坏, 所 以 做 好 数 据 库 的 备 份 工 作 极 为 重 要 备 份 可 以 创 建 在 磁 盘 磁 带 等 备 份 设 备 上, 与 备 份 对 应 的 是 还 原 本 章 将 着 重 讨 论 数 据 库 备 份 与 还 原 的 相 关 问 题 13.1 备 份 与 还 原 的 概 述 备 份 与 还 原 概 念 1. 数 据 库 备 份 备 份 是 在 某 种 介 质 上 ( 磁 带 磁 盘 等 ) 存 储 数 据 库 ( 或 者 其 中 一 部 分 ) 的 复 制 对 SQ L Server 数 据 库 或 事 务 日 志 进 行 备 份, 就 是 记 录 在 进 行 备 份 这 一 操 作 时 数 据 库 中 所 有 数 据 的 状 态, 以 便 在 数 据 库 遭 到 破 坏 时 能 够 及 时 地 将 其 还 原 执 行 备 份 操 作 必 须 拥 有 对 数 据 库 备 份 的 权 限 许 可,SQ L Server 只 允 许 系 统 管 理 员 数 据 库 所 有 者 和 数 据 库 备 份 执 行 者 备 份 数 据 库 数 据 库 备 份 前, 需 要 对 备 份 内 容 备 份 频 率 以 及 数 据 备 份 存 储 介 质 进 行 计 划 (1) 备 份 内 容 备 份 内 容 主 要 包 括 : 系 统 数 据 库 用 户 数 据 库 和 事 务 日 志 1 系 统 数 据 库 记 录 了 SQ L Server 系 统 配 置 参 数 用 户 资 料 以 及 所 有 用 户 数 据 库 等 重 要 信 息, 主 要 包 括 master msdb 和 model 数 据 库 2 用 户 数 据 库 中 存 储 了 用 户 的 数 据 由 于 用 户 数 据 库 具 有 很 强 的 区 别 性, 即 每 个 用 户 数 据 库 之 间 的 数 据 一 般 都 有 很 大 差 异, 所 以 对 用 户 数 据 库 的 备 份 尤 为 重 要 3 事 务 日 志 记 录 了 用 户 对 数 据 的 各 种 操 作, 平 时 系 统 会 自 动 管 理 和 维 护 所 有 的 数 据 库 事 务 日 志 相 比 数 据 库 备 份, 事 务 日 志 备 份 所 需 要 的 时 间 较 少, 但 是 还 原 需 要 的 时 间 较 长 (2) 备 份 频 率 数 据 库 备 份 频 率 一 般 取 决 于 修 改 数 据 库 的 频 繁 程 度 以 及 一 旦 出 现 意 外 丢 失 的 工 作 量 的 大 小, 还 有 发 生 意 外 丢 失 数 据 的 可 能 性 大 小 一 般 来 说, 在 正 常 使 用 阶 段, 对 系 统 数 据 库 的 修 改 不 会 十 分 频 繁, 所 以 对 系 统 数 据 库
326 第 13 章 备 份 与 还 原 313 的 备 份 也 不 需 要 十 分 频 繁, 只 要 在 执 行 某 些 语 句 或 存 储 过 程 导 致 SQ L Server 对 系 统 数 据 库 进 行 了 修 改 的 时 候 备 份 当 在 用 户 数 据 库 中 执 行 了 加 入 数 据 创 建 索 引 等 操 作 时, 应 该 对 用 户 数 据 库 进 行 备 份 此 外 如 果 清 除 了 事 务 日 志, 也 应 该 备 份 数 据 库 (3) 备 份 存 储 介 质 常 用 的 备 份 存 储 介 质 包 括 硬 盘 磁 带 和 命 名 管 道 等 备 份 应 该 按 照 需 要 经 常 进 行, 并 进 行 有 效 的 数 据 管 理 SQ L Server 备 份 可 以 在 数 据 库 使 用 时 进 行, 但 是 一 般 在 非 高 峰 活 动 时 备 份 效 率 更 高 注 意 : 备 份 是 一 种 十 分 耗 费 时 间 和 资 源 的 操 作, 不 能 频 繁 操 作 应 该 根 据 数 据 库 使 用 情 况 确 定 一 个 适 当 的 备 份 周 期 2. 数 据 库 还 原 备 份 可 以 防 止 数 据 库 遭 受 破 坏 介 质 失 效 或 用 户 错 误 备 份 是 还 原 数 据 库 最 容 易 和 最 能 防 止 意 外 的 有 效 方 法 没 有 备 份, 所 有 的 数 据 都 可 能 会 丢 失, 而 且 将 造 成 不 可 挽 回 的 损 失, 这 时 就 不 得 不 从 源 头 重 建 数 据 ; 有 了 备 份, 万 一 数 据 库 被 损 坏, 就 可 以 使 用 备 份 来 还 原 数 据 库 还 原 数 据 库 是 一 个 装 载 数 据 库 的 备 份, 然 后 应 用 事 务 日 志 重 建 的 过 程 应 用 事 务 日 志 之 后, 数 据 库 就 会 回 到 最 后 事 务 日 志 务 份 之 前 的 状 态 在 数 据 库 备 份 之 前, 应 该 检 查 数 据 库 中 数 据 的 一 致 性, 这 样 才 能 保 证 顺 利 地 还 原 数 据 库 备 份 在 数 据 库 的 还 原 过 程 中, 用 户 不 能 进 入 数 据 库, 当 数 据 库 被 还 原 后, 数 据 库 中 的 所 有 数 据 都 被 替 换 掉 如 果 数 据 库 做 过 完 全 备 份 和 事 务 日 志 备 份, 那 么 还 原 它 是 很 容 易 的 倘 若 保 持 着 连 续 的 事 务 日 志, 就 能 快 速 地 重 新 构 造 和 建 立 数 据 库 在 还 原 一 个 失 效 的 数 据 库 之 前, 调 查 失 效 背 后 的 原 因 是 很 重 要 的 如 果 数 据 库 的 损 坏 是 由 介 质 错 误 引 起 的, 那 么 就 需 要 替 换 失 败 的 介 质 倘 若 是 由 于 用 户 的 问 题 而 引 起 的, 那 么 就 需 要 针 对 发 生 的 问 题 和 今 后 如 何 避 免 采 取 相 应 的 对 策 还 原 数 据 库 是 一 个 装 载 最 近 备 份 的 数 据 库 和 应 用 事 务 日 志 来 重 建 数 据 库 到 失 效 点 的 过 程 定 点 还 原 可 以 把 数 据 库 还 原 到 一 个 固 定 时 间 点, 这 种 选 项 仅 适 用 于 事 务 日 志 备 份 当 还 原 事 务 日 志 备 份 时, 必 须 按 照 它 们 建 造 的 顺 序 还 原 备 份 与 还 原 方 式 1. 数 据 库 备 份 方 式 SQ L Server 2000 对 所 要 备 份 内 容 的 选 项 设 置, 提 供 了 四 种 不 同 的 方 式 : (1) 数 据 库 完 全 备 份 数 据 库 完 全 备 份 (Database 唱 complete) 是 整 个 数 据 库 的 一 个 复 制 该 备 份 复 制 在 一 个 文 件 里 (2) 差 异 备 份 或 称 增 量 备 份 数 据 库 增 量 备 份 (Database 唱 differential) 包 含 了 自 上 次 完 全 数 据 库 备 份 以 来 数 据 库 中 所 有 变 化 的 复 制 (3) 事 务 日 志 备 份 事 务 日 志 备 份 ( T ransaction log) 包 含 事 务 日 志 的 复 制, 它 包 括 数 据 库 里 所 发 生 的 每 个 数 据 改 动 前 后 的 映 像
327 314 SQL Server 数 据 库 应 用 技 术 (4) 数 据 库 文 件 和 文 件 组 备 份 数 据 库 文 件 和 文 件 组 备 份 (File and filegroup) 是 针 对 某 一 个 文 件 或 文 件 组 的 复 制 2. 数 据 库 还 原 方 式 还 原 方 式 依 赖 于 数 据 库 备 份 的 方 式 不 同 而 有 所 变 化 通 常, 首 先 还 原 最 近 的 数 据 库 完 全 备 份, 然 后 还 原 事 务 日 志 备 份 或 增 量 备 份 (1) 完 全 还 原 方 式 完 全 还 原 方 式 使 用 数 据 库 备 份 和 事 务 日 志 备 份 将 数 据 库 还 原 到 故 障 点 或 特 定 即 时 点 为 保 证 这 种 还 原 程 度, 包 括 大 容 量 操 作 ( 如 SELEC T IN T O CREA T E INDEX 和 大 容 量 装 载 数 据 ) 在 内 的 所 有 操 作 都 将 完 整 地 记 入 日 志 由 于 还 原 到 任 意 即 时 点, 这 样 数 据 文 件 的 丢 失 和 损 坏 不 会 导 致 工 作 损 失 但 是 如 果 事 务 日 志 ( 此 项 十 分 重 要 ) 损 坏, 则 必 须 重 新 做 最 新 的 日 志 备 份 后 进 行 的 修 改 (2) 简 单 还 原 方 式 简 单 还 原 方 式 将 数 据 库 还 原 到 上 次 备 份 处, 但 是 无 法 将 数 据 库 还 原 到 故 障 点 或 指 定 的 即 时 点 常 用 于 还 原 最 新 的 数 据 库 完 全 备 份 和 差 异 备 份 这 种 方 式 允 许 高 性 能 大 容 量 复 制 操 作, 以 及 可 以 回 收 日 志 空 间, 但 是 必 须 重 组 最 新 的 数 据 库 或 者 差 异 备 份 后 的 更 改 (3) 大 容 量 日 志 记 录 还 原 方 式 大 容 量 日 志 记 录 还 原 方 式 为 某 些 大 规 模 或 大 容 量 复 制 操 作 提 供 最 佳 性 能 和 最 少 的 日 志 使 用 空 间 与 完 全 还 原 方 式 类 似, 必 须 十 分 注 意 保 护 事 务 日 志 记 录 当 日 志 备 份 包 含 大 容 量 更 改 时, 大 容 量 日 志 记 录 还 原 方 式 只 允 许 数 据 库 还 原 到 事 务 日 志 备 份 的 结 尾 处 不 支 持 即 时 点 还 原 这 种 方 式 节 省 日 志 空 间, 使 用 最 小 日 志 空 间 但 是 如 果 日 志 损 坏 或 者 日 志 备 份 后 发 生 了 大 容 量 操 作, 则 必 须 重 做 自 上 次 备 份 后 所 做 的 更 改 13.2 数 据 库 的 备 份 备 份 设 备 在 进 行 备 份 以 前 必 须 创 建 或 指 定 备 份 设 备 备 份 设 备 是 用 来 存 储 数 据 库 事 务 日 志 或 文 件 和 文 件 组 备 份 的 存 储 介 质, 可 以 是 硬 盘 磁 带 或 管 道 备 份 设 备 在 硬 盘 中 是 以 文 件 的 方 式 存 储 的, 与 常 规 操 作 系 统 文 件 一 样 引 用 磁 盘 备 份 设 备 与 引 用 任 何 其 他 操 作 系 统 文 件 一 样 可 以 在 服 务 器 的 本 地 磁 盘 上 或 共 享 网 络 资 源 的 远 程 磁 盘 上 定 义 磁 盘 备 份 设 备, 磁 盘 备 份 设 备 根 据 需 要 可 大 可 小 最 大 的 文 件 大 小 相 当 于 磁 盘 上 可 用 的 闲 置 空 间 如 果 在 网 络 上 将 文 件 备 份 到 远 程 计 算 机 上 的 磁 盘, 使 用 命 名 规 则 的 名 称, 以 \\Servername\Sharename\Path\File 格 式 指 定 文 件 的 位 置 提 示 : 建 议 不 要 将 数 据 库 或 事 务 日 志 备 份 到 数 据 库 所 在 的 同 一 物 理 磁 盘 上 的 文 件 中 如 果 包 含 数 据 库 的 磁 盘 设 备 发 生 故 障, 由 于 备 份 位 于 同 一 发 生 故 障 的 磁 盘 上, 因 此 无 法 还 原 数 据 库 SQ L Server 使 用 物 理 设 备 名 称 或 逻 辑 设 备 名 称 标 识 备 份 设 备 物 理 备 份 设 备 是 操 作 系 统 用 来 标 识 备 份 设 备 的 名 称, 如 d : \backup\student.bak 逻 辑 备 份 设 备 是 用 来 标
328 第 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 为 备 份 设 备
329 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 使 用 企 业 管 理 器 进 行 备 份 (1) 启 动 企 业 管 理 器, 登 录 到 指 定 的 数 据 库 服 务 器, 打 开 数 据 库 文 件 夹, 右 击 所 要 进 行 备 份 的 数 据 库 图 标, 在 弹 出 的 快 捷 菜 单 中 选 择 所 有 任 务, 再 选 择 备 份 数 据 库 (2) 出 现 SQ L Server 备 份 对 话 框, 对 话 框 中 有 两 个 标 签 页, 即 常 规 和 选 项 标 签 页, 如 图 13 唱 2 所 示 (3) 在 常 规 标 签 页 中, 选 择 欲 备 份 数 据 库 的 名 称 备 份 的 名 称 描 述 信 息 备 份 的 类 型 备 份 的 介 质 备 份 的 执 行 时 间 其 中, 数 据 库 完 全 数 据 库 差 异 事 务 日 志 以 及 文 件 和 文 件 组, 分 别 表 示 完 全 备 份 增 量 备 份 事 务 日 志 和 文 件 及 文 件 组 的 备 份 (4) 在 目 的 组 可 以 设 置 备 份 设 备 名 称 添 加 按 钮 可 以 添 加 备 份 设 备 ; 删 除 按 钮 可 以 表 示 删 除 备 份 设 备 ; 内 容 按 钮 可 以 显 示 有 关 备 份 设 备 的 信 息 单 击 目 的 选 项 组 中 的 添 加 按 钮, 打 开 选 择 备 份 目 的 对 话 框, 在 此 对 话 框 中 可 以 选 择 备 份 设 图 13 唱 2 SQL Server 备 份 的 对 话 框 备, 或 者 设 置 一 个 文 件 名 称 来 备 份 数 据 库
330 第 13 章 备 份 与 还 原 317 例 如, 选 择 前 面 创 建 的 备 份 设 备 stud_ backup 设 置 完 成 后, 单 击 确 定 按 钮, 返 回 到 SQ L Server 备 份 对 话 框 (5) 在 重 写 组 中 可 以 选 择 是 否 保 存 备 份 设 备 中 原 有 的 备 份 如 果 需 要 保 留, 选 择 追 加 到 媒 体 项 ; 如 果 覆 盖 以 前 的 备 份, 则 选 择 重 写 现 有 媒 体 项 (6) 如 果 要 设 置 自 动 备 份 的 时 间, 可 选 择 调 度 复 选 框, 其 默 认 设 置 为 每 1 周 在 星 期 日 发 生, 在 0 :00 :00 可 以 单 击 后 面 带 有 3 个 省 略 号 的 按 钮 来 设 置 调 度 时 间, 此 时 会 打 开 编 辑 调 度 对 话 框 在 名 称 文 本 框 中 可 以 输 入 调 度 的 名 称, 在 调 度 类 型 迭 项 组 中 可 以 迭 择 调 度 类 型, 并 设 置 调 度 时 间 设 置 完 成 后, 单 击 确 定 按 钮, 返 回 SQ L Server 备 份 对 话 框 (7) 选 择 备 份 对 话 框 的 选 项 标 签 页, 进 入 其 对 话 框 在 选 项 组 有 5 个 复 选 框, 自 上 而 下 分 别 表 示 : 系 统 在 备 份 完 成 后 对 备 份 数 据 进 行 检 验 ; 在 备 份 完 成 后 磁 带 自 动 卸 带, 该 复 选 项 只 对 磁 带 介 质 有 效 ; 在 备 份 前 清 除 事 务 日 志 中 的 不 活 动 日 志 内 容 ; 在 备 份 前 检 查 备 份 介 质 集 的 名 称 和 有 效 日 期, 选 中 该 选 项 后, 可 以 在 文 本 框 中 输 入 要 检 查 的 备 份 介 质 集 名 称 ; 设 置 备 份 集 的 失 效 日 期 在 媒 体 集 标 签 组 中, 可 以 设 置 或 更 改 介 质 的 卷 标 如 果 选 定 初 始 化 并 标 识 媒 体 复 选 框, 表 示 初 始 化 介 质, 并 设 置 卷 标, 选 中 后 可 以 输 入 介 质 集 名 称 和 介 质 集 描 述 (8) 最 后, 在 SQ L Server 备 份 对 话 框 中, 单 击 确 定 按 钮, 即 可 开 始 备 份 使 用 向 导 进 行 备 份 图 13 唱 3 至 13 唱 10 是 使 用 向 导 进 行 备 份 的 操 作 过 程 读 者 可 以 按 照 向 导 的 提 示 一 步 一 步 地 完 成 备 份 的 设 置 (1) 在 企 业 管 理 器 中 展 开 服 务 器 组, 选 定 指 定 的 服 务 器 选 择 主 菜 单 的 工 具 菜 单 中 的 向 导 选 项, 打 开 如 图 13 唱 3 所 示 的 选 择 向 导 对 话 框 图 13 唱 3 选 择 向 导
331 318 SQL Server 数 据 库 应 用 技 术 (2) 展 开 管 理, 选 择 其 中 的 备 份 向 导 选 项 单 击 确 定 按 钮, 启 动 如 图 13 唱 4 所 示 的 创 建 数 据 库 备 份 向 导 图 13 唱 4 欢 迎 使 用 向 导 对 话 框 (3) 在 欢 迎 使 用 向 导 对 话 框 中, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 5 所 示 的 选 择 要 备 份 的 数 据 库 对 话 框 图 13 唱 5 选 择 要 备 份 的 数 据 库 对 话 框 (4) 在 数 据 库 下 拉 式 列 表 中 选 择 需 要 备 份 的 数 据 库, 选 择 完 毕 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 6 所 示 的 输 入 备 份 名 称 和 描 述 信 息 对 话 框
332 第 13 章 备 份 与 还 原 319 图 13 唱 6 输 入 备 份 名 称 和 描 述 信 息 对 话 框 (5) 键 入 备 份 名 称 和 描 述 信 息 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 7 所 示 的 选 择 备 份 类 型 对 话 框 图 13 唱 7 选 择 备 份 类 型 对 话 框 (6) 选 择 好 备 份 类 型 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 8 所 示 的 选 择 设 置 备 份 设 备 和 属 性 对 话 框 (7) 设 置 好 备 份 设 备 和 属 性 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 9 所 示 的 备 份 验 证 和 调 度 对 话 框
333 320 SQL Server 数 据 库 应 用 技 术 图 13 唱 8 设 置 备 份 设 备 和 属 性 对 话 框 图 13 唱 9 备 份 验 证 和 调 度 对 话 框 (8) 设 置 好 验 证 和 调 度 的 相 关 信 息 后, 单 击 下 一 步 按 钮, 出 现 如 图 13 唱 10 所 示 的 确 认 执 行 备 份 操 作 对 话 框 (9) 在 确 认 执 行 备 份 操 作 对 话 框 中, 显 示 了 备 份 设 置 信 息 摘 要 如 果 没 有 什 么 问 题, 单 击 完 成 按 钮, 就 可 以 开 始 创 建 备 份 了 使 用 查 询 分 析 器 进 行 备 份 使 用 T ransact 唱 SQ L 语 句 的 BACK U P 语 句 可 以 将 整 个 数 据 库 文 件 及 文 件 组 和 事 务
334 第 13 章 备 份 与 还 原 321 图 13 唱 10 确 认 执 行 备 份 操 作 对 话 框 日 志 备 份 到 存 储 介 质 上 ( 软 盘 硬 盘 磁 带 等 ) 1. 数 据 库 备 份 (1) 使 用 BACK U P 语 句 备 份 数 据 库 的 语 法 形 式 BACKUP DATABASE database_name_var} TO < backup_device > [,...n] [WITH [DESCMPTION = { text_varable}] [[,]DIFFERBNTIAL] [[,]INIT NOINIT] [[,]MEDIANAME = media_name_variable}] [[,]NAME = backup_set_name_var}] ] (2) 参 数 说 明 1 BACK U P DA T ABASE, 指 定 一 个 数 据 库 的 完 全 备 份 2 database_name_var} 为 欲 备 份 数 据 库 的 文 件 名 或 备 份 数 据 库 的 变 量 名 3 < backup_device >, 指 定 备 份 操 作 时 要 使 用 的 逻 辑 或 物 理 备 份 设 备 可 以 是 以 下 两 种 情 况 :{logical_backup_device_name} logical_backup_device_name_var} 或 者 {DISK TAPE } = physical_ backup_ device_ physical_ backup_ device_ name_var 第 一 种 情 况 表 示 指 定 由 sp_addumpdevice 创 建 的 备 份 设 备 的 逻 辑 名 称, 数 据 库 将 备 份 到 该 设 备 中 第 二 种 情 况 表 示 指 定 备 份 设 备 的 物 理 名 称 和 设 备 类 型, 在 执 行 BACK U P 语 句 之 前 不 必 存 在 指 定 的 物 理 设 备 4 DESCRIP TION = { text_variable}, 备 份 描 述 文 本, 最 长 可 以 有 255 个
335 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_variable}, 说 明 备 份 介 质 名 称, 最 多 为 128 个 字 符 假 如 指 定 了 MEDIA N A ME, 则 它 必 须 与 以 前 指 定 的 介 质 名 称 相 匹 配, 该 介 质 名 称 已 存 在 于 备 份 卷 中 假 如 没 有 指 定 M EDIA N A M E, 将 不 会 对 介 质 名 称 进 行 匹 配 检 查 8 N A M E = 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_name_var} < file_or_filegroup > [,...n] TO < backup_device > [,...n] [WITH [DESCRIPTION = { text variable}]] [[,]DIFFERENTIAL] [[,]{INIT NOINIT}] [[,]MEDIANAME = {media media_name_variable}] [[,]NAME = backup_set_name_var} ] (2) 参 数 说 明 < file_or_filegroup > 指 定 包 含 在 数 据 库 备 份 中 的 文 件 或 文 件 组 的 逻 辑 名, 可 以 指 定 多 个 文 件 或 文 件 组 例 如,file = logica_file_name_var} 给 一 个 或 多 个 包 含 在 数 据 库 备 份 中 的 文 件 命 名 ;filegroup = logical_ fi1egroup_name_var} 给 一 个 或 多 个 包 含 在 数 据 库 备 份 中 的 文 件 组 命 名 注 意 : 必 须 通 过 使 用 BACK U P LOG 提 供 事 务 日 志 的 单 独 备 份, 才 能 使 用 文 件 和 文 件 组 备 份 来 还 原 数 据 库 如 果 还 原 方 式 为 简 单 还 原 方 式, 则 不 允 许 文 件 和 文 件 组 备 份
336 第 13 章 备 份 与 还 原 备 份 事 务 日 志 (1) 使 用 BACK U P 语 句 备 份 事 务 日 志 的 语 法 形 式 BACKUP LOG database_name_var} TO < backup_device > [,...n] [WITH [BLOCKSIZE = blocksize_variable}] [[,]DESCMPTION = { text_varable}] [[,]FORMAT NOFORMAT] [[,]INIT NOINIT] [[,]MEDIANAME = media_name_variable}] [[,]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 的 备 份 设 备 上 用 户 可 以 通 过 事 务 日 志 备 份 来 记 录 数 据 库 的 变 化 不 过, 必 须 在 执 行 了 完 全 备 份 且 数 据 库 有 了 事 务 日 志 之 后, 才 能 进 行 事 务 日 志 的 备 份
337 324 SQL Server 数 据 库 应 用 技 术 13.3 数 据 库 的 还 原 数 据 库 备 份 后, 一 旦 系 统 发 生 崩 溃 或 者 执 行 了 数 据 库 的 误 操 作, 就 可 以 从 备 份 文 件 中 还 原 数 据 库 数 据 库 还 原 是 指 将 数 据 库 备 份 加 载 到 系 统 中 的 过 程 系 统 在 还 原 数 据 库 的 过 程 中, 自 动 执 行 安 全 性 检 查 重 建 数 据 库 结 构 以 及 完 整 数 据 库 内 容 使 用 企 业 管 理 器 还 原 数 据 库 使 用 SQ L Server 企 业 管 理 器 还 原 数 据 库 的 主 要 步 骤 如 下 : (1) 打 开 服 务 器 组, 然 后 展 开 服 务 器 (2) 打 开 数 据 库 文 件 夹, 右 击 需 要 进 行 备 份 的 数 据 库, 在 弹 出 的 快 捷 菜 单 中 选 择 所 有 任 务, 选 择 还 原 数 据 库 项, 进 入 还 原 数 据 库 备 份 对 话 框 的 常 规 标 签 页 (3) 在 还 原 为 数 据 库 中 可 以 选 择 需 要 还 原 的 数 据 库 (4) 在 还 原 组 中 有 3 个 单 选 按 钮, 可 以 选 择 还 原 方 法 : 瞯 数 据 库 选 择 该 选 项 时, 显 示 如 图 13 唱 11 所 示 的 对 话 框 在 其 中 可 以 选 择 需 要 显 示 的 指 定 数 据 库 的 备 份 集 以 及 首 先 需 要 还 原 的 数 据 库 备 份 图 13 唱 11 数 据 库 还 原 方 式 对 话 框 瞯 文 件 组 或 文 件 选 择 该 选 项 时, 显 示 如 图 13 唱 12 所 示 的 对 话 框 在 对 话 框 下 面 的 列 表 中 列 出 了 对 指 定 数 据 库 备 份 集 中 备 份 文 件 或 文 件 组 瞯 设 备 选 择 该 选 项 时, 显 示 如 图 13 唱 13 所 示 的 对 话 框, 在 设 备 栏 中 可 以 选 择 数 据 库 所 使 用 的 备 份 设 备 如 果 选 择 还 原 备 份 集 单 选 按 钮, 则 可 以 选 择 还 原 类 型 ( 还 原 数 据 库 完 全 备 份 还 原 增 量 备 份 还 原 日 志 备 份 或 还 原 文 件 及 文 件 组 ) ; 如 果 选 择 读 取 备 份 集 信 息 并 添 加 到 历 史
338 第 13 章 备 份 与 还 原 325 图 13 唱 12 文 件 组 或 文 件 还 原 方 式 对 话 框 图 13 唱 13 从 设 备 还 原 的 对 话 框 备 份 记 录 单 选 按 钮, 表 示 读 取 备 份 集 信 息 并 添 加 备 份 历 史 记 录 (5) 选 择 选 项 标 签 页, 进 入 如 图 13 唱 14 所 示 对 话 框, 其 中 上 面 三 个 复 选 按 钮 分 别 表 示 : 在 还 原 每 个 备 份 后 均 退 出 磁 带 ; 在 还 原 每 个 备 份 前 进 行 提 示 ; 在 现 有 数 据 库 上 强 制 还 原
339 326 SQL Server 数 据 库 应 用 技 术 图 13 唱 14 还 原 选 项 设 置 对 话 框 在 列 表 框 中 可 以 指 定 要 还 原 的 数 据 库 文 件 名 称 另 外, 还 可 以 指 定 还 原 完 成 后 的 状 态 使 用 查 询 分 析 器 还 原 数 据 库 在 查 询 分 析 器 中 使 用 RES T ORE 命 令, 可 以 将 数 据 库 备 份 或 者 事 务 处 理 日 志 备 份 由 存 储 介 质 还 原 到 SQ L Server 系 统 中 RES T ORE 与 BACK U P 语 句 相 对 应,RES T ORE 语 句 也 有 三 种 形 式, 分 别 用 于 还 原 数 据 库 完 全 备 份 还 原 文 件 及 文 件 组 备 份 和 还 原 事 务 日 志 备 份 1. 还 原 数 据 库 备 份 (1) 使 用 RES T ORE 语 句 还 原 数 据 库 备 份 的 语 法 形 式 RESTORE database_name_var} [FROM < backup_device > [,...n]] [WITH [FILE = file_number] [MEDIANAME = 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_var} 还 原 数 据 库 文 件 名 或 变 量 名
340 第 13 章 备 份 与 还 原 FRO M < backup_device > 指 定 从 备 份 设 备 中 还 原,backup_device 为 还 原 操 作 时 要 使 用 的 逻 辑 或 物 理 备 份 设 备 可 以 是 以 下 两 种 情 况 : {logical_backup_device_name} logical_backup_device_name_var} 或 者 {DISK TAPE } = physical_ backup_ device_ physical_ backup_ device_ name_var 第 一 种 情 况 表 示 指 定 由 sp_addumpdevice 创 建 的 备 份 设 备 的 逻 辑 名 称, 数 据 库 将 备 份 到 该 设 备 中 第 二 种 情 况 表 示 指 定 备 份 设 备 的 物 理 名 称 和 设 备 类 型 4 FILE = file_number 标 识 要 处 理 的 备 份 集, 用 户 可 以 在 备 份 集 中 指 定 一 个 备 份 还 原 默 认 为 < backup_device > 上 的 第 一 个 备 份 集 5 M EDIA N A M E = 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 还 原 数 据 库 的 差 异 备 份
341 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_name_var} < file_or_file group > [,...n] [FROM < backup_device > [,...n]] [WITH [MEDIANAME = media_name_variable}] [[,]MOVE logical_file_name TO operating_system_file_name ] [,...n] [[,]NORECOVERY] [[,]REPLACE] [[,]RESTART] ] (2) 参 数 说 明 < file_or_filegroup > 指 定 包 括 在 要 还 原 的 数 据 库 中 的 逻 辑 文 件 或 文 件 组 的 名 称, 可 以 指 定 多 个 文 件 或 文 件 组 其 中 : file = logical_file_name_var} 为 命 名 一 个 或 更 多 包 括 在 要 还 原 的 数 据 库 中 的 文 件 ;filegroup = logical_filegroup_name_var}, 命 名 一 个 或 更 多 包 括 在 欲 还 原 的 数 据 库 中 的 文 件 组 (3) 简 单 例 子
342 第 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 database_name_var} [FROM < backup_device > [,...n]] [WITH [MOVE logical_file_name TO operating_systemfle_name ][,...n] [[,]MEDIANAME = media_name_variable}] [[,]{NORECOVERY RECOVERY STANDBY = undo_file_name}] [[,]RESTART] [[,]STOPAT = 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_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) 简 单 例 子 例 将 事 务 日 志 还 原 到 标 记 处 BEGIN TRANSACTION stud_update WIT H MARK Updace grade values GO USE student GO UPDATE stud_grade
343 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 例 将 事 务 日 志 还 原 到 名 为 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
344 第 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 dbname = student 唱 从 服 务 器 分 离 student 数 据 库 EXEC dbname = N filename1 = N c :\Program Files\ Microsoft SQL Server\ filename2 = N c :\Program Files\ Microsoft SQL Server\ MSSQL\Data\student_log.ldf 这 种 方 法 应 该 说 是 有 很 高 的 成 功 率 的, 不 过 student 数 据 库 附 加 到 服 务 器 后, 数 据 库 成 为 只 读 的 如 果 只 有 mdf 没 有 ldf 文 件 的 话, 建 议 使 用 系 统 存 储 过 程 sp_attach_single_ file, 将 只 有 一 个 数 据 文 件 的 数 据 库 附 加 到 当 前 服 务 器
345 332 SQL Server 数 据 库 应 用 技 术 EXEC dbname = student EXEC dbname = 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) 在 服 务 器 之 间 移 动 数 据 库 的 两 个 系 统 存 储 过 程 是
346 第 14 章 SQL Server 编 程 接 口 桌 面 ( 计 算 机 与 用 户 交 互 的 图 形 化 界 面 ) 程 序 设 计 的 基 本 方 法, 通 常 使 用 程 序 设 计 语 言 作 为 前 台, 与 后 台 的 数 据 库 进 行 链 接, 通 过 桌 面 用 户 调 用 包 括 数 据 库 在 内 的 各 种 资 源, 完 成 管 理 信 息 系 统 的 应 用 本 章 将 讨 论 通 过 ODBC 或 ADO 访 问 SQ L Server 数 据 库, 以 及 通 过 Visual Basic PowerBuilder C++ Builder 6 程 序 设 计 语 言 对 数 据 库 中 的 数 据 对 象 进 行 操 作 处 理 14.1 通 过 ODBC 访 问 SQL Server 数 据 库 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 驱 动 程 序 这
347 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 就 可 以 了, 它 会 自 动 获 得 所 有 的 信 息 下 面 分 别 介 绍 如 何 配 置 各 种 不 同 的 数
348 第 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
349 336 SQL Server 数 据 库 应 用 技 术 3 出 现 如 图 14 唱 3 所 示 的 创 建 到 SQ L Server 的 新 数 据 源 设 置 界 面, 在 数 据 源 名 称 文 本 框 里 输 入 sqlserverlink, 在 数 据 源 描 述 文 本 框 里 输 入 SQ L Server 连 接, 在 您 想 连 接 哪 一 个 SQ L Server 服 务 器? 文 本 框 里 输 入 这 里 的 服 务 器 名 是 指 本 地 服 务 器, 当 然 也 可 以 是 远 程 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 的 对 话 框 在 该 对 话 框 中, 可 根 据 需 要 更 改 默 认 数 据 库 的 名 称, 或 者 添 加 附 加 数 据 库 文 件 名 等 例 如, 在 改 变 默 认 的 数 据 库 为 的
350 第 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 在 运 行 状 态
351 338 SQL Server 数 据 库 应 用 技 术 图 14 唱 7 ODBC Microsoft SQL Server 安 装 图 14 唱 8 SQL Server ODBC 数 据 源 测 试 通 过 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 数 据 库 中 设 置 好 的 数 据 库 名 来 设 置 例 如 : 数 据 源 名 称 为
352 第 14 章 SQL Server 编 程 接 口 339 图 14 唱 9 建 立 好 的 数 据 源 sqlserverlink, 描 述 为 SQ L Server 连 接, 用 户 名 称 为 sa, 密 码 为 空 (2) 打 开 Excel, 在 数 据 菜 单 下, 选 获 取 外 部 数 据, 单 击 新 建 数 据 库 查 询 出 现 选 择 数 据 源 对 话 框 如 图 14 唱 10 所 示 图 14 唱 10 Excel 的 数 据 菜 单 (3) 在 如 图 14 唱 11 所 示 的 选 择 数 据 源 对 话 框 中, 选 择 前 面 已 设 置 好 的 数 据 源
353 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, 选 择 一 列 名 则 单 击 > 按 钮 一 次 单 击 下 一 步 按 钮, 进 入
354 第 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 强 大 的 编 辑 功 能, 对 这 些 数 据 进 行
355 342 SQL Server 数 据 库 应 用 技 术 图 14 唱 16 查 询 向 导 唱 完 成 图 14 唱 17 导 入 数 据 图 14 唱 18 Excel 的 工 作 表
356 第 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 窗 口 通 过 Visual Basic 访 问 SQL Server 数 据 库 Visual Basic 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 界 面, 在 菜 单 栏 选 择 文 件 打 开 数 据 库
357 344 SQL Server 数 据 库 应 用 技 术 图 14 唱 20 选 择 可 视 化 数 据 管 理 器 图 14 唱 21 打 开 ODBC 数 据 源 犗 犇 犅 犆 菜 单 命 令 (3) 出 现 如 图 14 唱 22 所 示 的 ODBC 登 录 界 面, 在 DSN(D) : 文 本 框 里 选 择 已 建 立 好 的 数 据 源 sqlserverlink, 在 UID(U) : 文 本 框 里 输 入 sa, 在 密 码 (P) : 文 本 框 里 默 认 为
358 第 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
359 346 SQL Server 数 据 库 应 用 技 术 ServerSample, Caption 属 性 为 学 生 基 本 信 息, 存 盘 保 存 表 单 文 件 和 工 程 文 件 图 14 唱 24 选 择 新 建 工 程 图 14 唱 25 设 置 表 单 属 性 (3) 在 菜 单 栏 里 选 择 工 程 部 件 菜 单 命 令, 将 需 要 的 数 据 库 控 件 添 加 进 来, 如 图 14 唱 26 所 示 (4) 出 现 如 图 14 唱 27 所 示 的 部 件 对 话 框, 选 中 控 件 标 签 页, 在 下 拉 列 表 框 里 单 击 选 中 Microsoft ADO Data Control 6.0(OLEDB), 单 击 确 定 按 钮
360 第 14 章 SQL Server 编 程 接 口 347 图 14 唱 26 选 择 添 加 部 件 图 14 唱 27 选 择 添 加 控 件 (5) 单 击 选 中 General 工 具 箱 里 出 现 的 ADODC 控 件, 在 表 单 任 意 位 置 按 住 鼠 标 左 键 拖 动 出 一 个 区 域, 出 现 ADODC 控 件, 在 该 控 件 上 右 击, 在 出 现 的 快 捷 菜 单 里 选 择 ADODC 属 性 菜 单 命 令, 如 图 14 唱 28 所 示 (6) 出 现 如 图 14 唱 29 所 示 的 属 性 页 对 话 框, 在 通 用 标 签 页 里 有 3 种 指 定 数 据 库 的 方 式 选 择 使 用 ODBC 数 据 资 源 名 称 单 选 按 钮, 在 下 拉 列 表 框 里 选 择 建 立 好 名 为 sqlserverlink 的 数 据 源
361 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, 这 样 在 设 计 时 该 控 件 是 可 见 的, 但 在 运 行 时 是 不 可 见 的
362 第 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 控 件, 设 计 好
363 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 控 件, 其 属 性 窗 口 中
364 第 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 所 示 单 击 窗 口 中 的 运 行 按 钮 就 可 以 执 行 该 实 例 了 通 过 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, 单 击 鼠 标 右 键,
365 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 文
366 第 14 章 SQL Server 编 程 接 口 353 本 框 中, 输 入 sa, 在 Passw ord 文 本 框 中, 设 置 为 空, 其 他 按 照 默 认 设 置 即 可, 如 图 14 唱 37 所 示 图 14 唱 37 Connection 标 签 页 4 选 择 设 置 界 面 中 的 System 标 签 页 ( 如 图 14 唱 38 所 示 ), 可 以 设 置 在 PB 中 显 示 的 数 据 库 目 标, 一 般 按 照 默 认 值 即 可 图 14 唱 38 System 标 签 页
367 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 所 示
368 第 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 中 已 建 立 的 数 据 表 进 行 操 作
369 356 SQL Server 数 据 库 应 用 技 术 14.2 使 用 ADO 操 作 数 据 库 中 的 数 据 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 数 据 库 链 接 的 设 置 代 码 可 以 写 为 :
370 第 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 = Conn.Execute (SqlStr) // 执 行 修 改 操 作 5 关 闭 数 据 对 象 和 链 接 在 使 用 了 ADO 对 象 之 后, 一 定 要 记 住 关 闭 它, 因 为 它 使 用 了 服 务 器 的 资 源, 如 果 不 释 放 的 话 将 导 致 服 务 器 资 源 浪 费 并 影 响 服 务 器 性 能 通 过 调 用 方 法 close 实 现 关 闭, 然
371 358 SQL Server 数 据 库 应 用 技 术 后 再 释 放 它, 例 如 : Conn.close 在 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 in_sex CHAR(2) AS BEGIN in_sex = 男 SELECT 倡 FROM stud_info WHERE gender = 男 ; ELSE END GO SELECT 倡 FROM stud_info WHERE gender = 女 在 VB 中 定 义 一 个 Command 对 象, 然 后 调 用 Execute 方 法 执 行 存 储 过 程 如 下 :
372 第 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
373 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 = 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 = 语 句 是 将 数 值 赋 给 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 = 语 句 检 索 结 果 ; 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
374 第 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
375 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 名 称, 第 三 个 参 数 表 明 的 是 将 使 用 一 个 键 集 游 标, 第 四 个 参 数 表 明
376 第 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 是 一 个 实 际 参 数, 用 来 控 制 数 据 显 示 的 方 向 在 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 数 据 库 的 具 体 步 骤 如 下 :
377 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 按 钮, 单 击 测 试 连 接 按
378 第 14 章 SQL Server 编 程 接 口 365 图 14 唱 45 选 择 数 据 库 驱 动 程 序 图 14 唱 46 配 置 数 据 库 连 接 参 数 钮 进 行 测 试, 如 果 选 择 的 SQ L Server 服 务 器 正 常 工 作 的 话, 会 出 现 一 个 显 示 测 试 连 接 成 功 的 对 话 框 即 完 成 C++ Builder 6 与 SQ L Server 数 据 库 的 连 接 (5) 在 窗 体 Form1 中 再 添 加 ADO Table 控 件 ( ADO Table1) DataSource 控 件
379 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
380 第 14 章 SQL Server 编 程 接 口 367 图 14 唱 50 TableName 设 置 图 14 唱 51 DataSet 设 置 图 14 唱 52 DataSource 设 置 图 14 唱 53 Database Login 检 验 图 14 唱 54 程 序 运 行 窗 口
381 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 的 方 式 有
382 第 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) 请 为 下 列 程 序 片 段 中 每 个 语 句 进 行 功 能 注 释
383 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 控 件 就 是, 可 以 将 它 作 为, 这 样 可 以 同 时 浏 览
384 第 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
385 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
386 附 录 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 编 程 接 口 等
387 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 索 引 及 其 应 用 数 据 查 询 4 2 ~ 4 7 数 据 复 制 视 图 及 其 应 用 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 应 用 程 序 与 开 发 人 民 邮 电 出 版 社 李 赫 雄, 许 宏 泰 等 编 著 数 据 库 应 用 基 础 高 等 教 育 出 版 社 蒋 文 蓉, 肖 满 生 主 编 数 据 库 技 术 新 进 展 清 华 大 学 出 版 社 李 昭 原 编 著 数 据 库 系 统 及 应 用 高 等 教 育 出 版 社 崔 巍 编 著
388 附 录 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 语 言 的 运 用, 以 及 管 理 信 息 系 统 的 分 析 设 计 方 法 有 初 步 了 解, 对 管 理 信 息 系 统 项 目 的 组 织 策 划 资 源 管 理 团 队 精 神 也 有 一 定 的 认 识
389 附 录 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) 编 程 接 口 的 基 本 内 容
390 附 录 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 管 理 信 息 系 统 需 求 分 析 数 据 库 的 设 计 与 优 化 应 用 程 序 界 面 的 规 划 系 统 的 设 计 编 写 Visual Basic 代 码 并 调 试 编 写 SQL 代 码 程 序 调 试 ODBC 或 ADO 数 据 库 连 接 和 程 序 联 调, 演 示 与 答 辩 合 计
391 378 SQL Server 数 据 库 应 用 技 术 6. 实 训 成 果 将 数 据 库 应 用 技 术 和 面 向 对 象 程 序 设 计 结 合 起 来 进 行 实 训, 可 以 使 学 生 从 系 统 的 需 求 分 析 开 始, 经 历 数 据 库 的 设 计 优 化, 到 功 能 规 划 窗 体 设 计 界 面 设 计 报 表 设 计 编 码 调 试 等 整 个 开 发 过 程, 使 学 生 对 MIS 整 个 开 发 过 程 有 一 个 较 全 面 的 认 识 提 高 学 生 的 知 识 综 合 应 用 能 力, 体 验 学 习 成 果, 激 发 学 生 后 续 课 程 学 习 兴 趣 成 果 形 式 包 括 实 训 报 告 书 开 发 的 管 理 信 息 系 统 源 代 码 以 及 使 用 说 明 文 档 其 中 实 训 报 告 书 应 说 明 具 体 数 据 库 设 计 调 试 运 行 输 出 结 果 操 作 步 骤 遇 到 的 关 键 问 题 及 解 决 办 法 实 训 启 示 与 感 想 等 7. 实 训 考 核 实 训 考 核 是 检 查 学 生 的 实 训 成 果, 检 测 学 生 对 枟 SQ L Server 数 据 库 应 用 技 术 枠 课 程 知 识 的 理 解 程 度, 以 及 应 用 数 据 库 进 行 数 据 管 理 的 能 力 为 了 确 保 检 验 的 真 实 性, 实 训 结 束 前 要 进 行 答 辩 和 演 示, 并 将 实 训 报 告 书 管 理 信 息 系 统 源 代 码 和 使 用 说 明 文 档, 交 到 服 务 器 上 的 共 享 文 件 夹 中, 实 训 指 导 老 师 根 据 以 上 内 容 来 评 定 成 绩, 实 训 成 绩 参 考 下 列 公 式 计 算 实 训 成 绩 = 管 理 信 息 系 统 源 代 码 和 使 用 说 明 文 档 答 辩 和 演 示 实 训 报 告 书 大 纲 说 明 (1) 实 训 是 在 课 堂 学 习 以 及 相 关 先 行 课 程 学 习 后 的 基 础 上 安 排 的 实 训, 要 求 学 生 已 具 备 一 定 的 程 序 设 计 和 业 务 流 程 的 应 用 基 础 (2) 实 训 内 容 要 求 以 一 个 管 理 信 息 系 统 ( 例 如, 学 生 成 绩 管 理 系 统 人 事 管 理 系 统 物 流 管 理 系 统 等 ) 为 题 材 进 行 实 际 开 发 才 有 意 义, 才 能 锻 炼 学 生 在 开 发 管 理 信 息 系 统 的 过 程 中 所 需 的 综 合 能 力 和 培 养 学 生 团 队 精 神 和 团 队 协 作 的 能 力 (3) 实 训 完 成 后, 必 须 测 试 系 统 功 能 和 书 写 实 训 报 告, 并 进 行 演 示 和 答 辩 9. 附 录 (1) 人 事 管 理 系 统 人 事 管 理 系 统 应 有 数 据 录 入 数 据 校 验 数 据 修 改 数 据 浏 览 各 种 模 糊 查 询 ; 可 以 选 择 增 加 打 印 功 能, 如 附 图 1 所 示 (2) 学 校 教 材 管 理 系 统 功 能 要 求 : 本 系 统 能 对 学 校 所 有 班 级 的 教 材 进 行 征 订, 对 教 材 的 入 库 出 库 进 行 管 理, 能 进 行 各 种 条 件 的 查 询 打 印, 还 应 具 有 教 材 库 存 预 警 机 制 ( 教 材 库 存 不 够 用 或 教 材 征 订 过 剩, 都 能 给 予 提 示 ) 基 本 要 求 : 学 生 可 以 首 先 到 学 校 教 材 科 进 行 需 求 调 查, 然 后 画 出 教 材 管 理 系 统 数 据 流 图 功 能 流 程 图 数 据 库 的 设 计 再 进 行 程 序 设 计 调 试, 以 达 到 本 系 统 的 功 能 要 求 (3) 高 校 学 生 成 绩 管 理 系 统 功 能 要 求 : 学 生 成 绩 管 理 是 教 学 管 理 的 一 个 重 要 环 节, 本 系 统 能 够 进 行 学 生 成 绩 登 记 成 绩 的 更 正 成 绩 的 查 询 成 绩 的 汇 总 及 排 序, 对 已 毕 业 学 生 成 绩 能 存 入 历 史 库 中, 对 于 保 存 一 定 年 限 的 成 绩 能 进 行 清 除 要 求 有 良 好 的 界 面, 具 有 良 好 实 用 性
392 附 录 B 枟 SQL Server 数 据 库 应 用 技 术 枠 课 程 实 训 大 纲 379 附 图 1 基 本 要 求 : 学 生 可 以 先 到 所 在 的 系 与 有 关 老 师 联 系, 进 行 需 求 调 查, 然 后 画 出 成 绩 管 理 系 统 数 据 流 图, 功 能 流 程 图, 数 据 库 的 设 计 再 进 行 程 序 设 计 调 试, 以 达 到 本 系 统 的 功 能 要 求
393 参 考 文 献 1 蒋 文 蓉, 肖 满 生 主 编. 数 据 库 应 用 基 础. 北 京 : 高 等 教 育 出 版 社, 宋 贤 斌, 王 庆 岭 主 编. 数 据 库 应 用 程 序 开 发. 北 京 : 高 等 教 育 出 版 社, 徐 人 凤, 曾 建 华 编. SQL Server 2000 数 据 库 及 应 用. 北 京 : 高 等 教 育 出 版 社, 王 育 平, 于 丽 杰, 韩 晓 军 编 著. 数 据 库 技 术 及 其 在 网 络 中 的 应 用. 北 京 : 清 华 大 学 出 版 社, Silberschatz 等 著, 杨 冬 青 等 译. 数 据 库 系 统 概 念 化. 北 京 : 机 械 工 业 出 版 社, Abraham Silberschatz,Henry F. Korth,S. Sudarshan 著, 杨 冬 青, 唐 世 渭 等 译. 数 据 库 系 统 概 念. 北 京 : 机 械 工 业 出 版 社 崔 巍 编 著. 数 据 库 系 统 及 应 用. 北 京 : 高 等 教 育 出 版 社, Hector Garcia 唱 Molina,Jeffrey D. Ullman,Jennifer Widom 著, 杨 冬 青, 唐 世 渭, 徐 其 钧 等 译. 数 据 库 系 统 实 现. 北 京 : 机 械 工 业 出 版 社, 萨 师 煊, 王 珊 编 著. 数 据 库 系 统 概 论 ( 第 3 版 ). 北 京 : 高 等 教 育 出 版 社, 周 绪, 管 丽 娜, 白 海 波 编 著. SQL Server 2000 中 文 版 入 门 与 提 高. 北 京 : 清 华 大 学 出 版 社, 卫 海 编 著. 快 速 学 习 SQL Server 2000 中 文 版. 北 京 : 中 国 铁 道 出 版 社, 黄 维 通 编 著. SQL Server 2000 简 明 教 程. 北 京 : 清 华 大 学 出 版 社, 李 存 斌 主 编. 数 据 库 应 用 技 术. 北 京 : 中 国 水 利 水 电 出 版 社, 于 松 涛, 徐 振 成 编 著. SQL Server 2000 数 据 库 管 理 与 开 发. 北 京 : 人 民 邮 电 出 版 社, 郑 阿 奇 主 编. SQL Server 2000 实 用 教 程. 北 京 : 电 子 工 业 出 版 社, 章 立 民 主 编. SQL Server 2000 中 文 版 完 全 实 战. 北 京 : 中 国 铁 道 出 版 社, 王 行 言, 汤 荷 美, 黄 维 通 编 著. 数 据 库 技 术 及 应 用. 北 京 : 高 等 教 育 出 版 社, 赵 杰, 李 涛, 朱 慧 编 著. SQL Server 数 据 库 管 理 设 计 与 实 现 教 程. 北 京 : 清 华 大 学 出 版 社,2004
untitled
21 Visual FoxPro Visual FoxPro 6.0 11 Visual FoxPro Visual FoxPro CIP Visual FoxPro 2004 21 ISBN 7-03-014834-7 V Visual FoxPro TP311.138 CIP 2004 143035 16 100717 http://www.sciencep.com * 2004 12 7871092
,,,,,,, : , (CIP) /,,. :, ( ) ISBN F CIP (2004) : : /
,,,,,,, : 010-62782989 13901104297 13801310933, (CIP) /,,. :,2004.8 ( ) ISBN 7-302-08602-8... - - -.F272.92-62 CIP (2004) 041531 : : http:/ / www.tup.com.cn : 100084 : 010-62770175 : 010-62776969 : : :
幻灯片 1
沈 阳 工 业 大 学 2014 年 6 月 第 7 章 数 据 库 技 术 基 础 主 要 内 容 : 7.1 数 据 库 概 述 数 据 库 基 本 概 念 数 据 模 型 逻 辑 数 据 模 型 数 据 库 系 统 的 产 生 和 发 展 常 用 的 数 据 库 管 理 系 统 7.2 Access 2010 数 据 库 创 建 及 维 护 创 建 Access 2010 数 据 库 创 建
( CIP ) 2003. - :, 2003.1 ISBN 7-5014 - 2617-1... - - - - -.D926.13 CIP (2001)086873 2003 7871092 16 15.75 196 2003 1 1 2003 1 1 ISBN 7-5014 - 2617-1D
: ( CIP ) 2003. - :, 2003.1 ISBN 7-5014 - 2617-1... - - - - -.D926.13 CIP (2001)086873 2003 7871092 16 15.75 196 2003 1 1 2003 1 1 ISBN 7-5014 - 2617-1D1240 : 30.00 ,, :,,, ;,,, ;,,, ;,,,,,, 2003 1 ),,
Ps22Pdf
: : ( CIP).,. :, 2000. 4 ISBN 7-5371- 3677-7............ - - - - - -. I211 CIP ( 2000) 08781 ( 100 : 830001) 850 1168 32 1100 35000 2000 4 1 2000 4 1 : 1 2000 ISBN7 5371 3677 7/ I 1347 : 3988 00 ,, ( )
未命名-14
20 世 纪 军 政 巨 人 百 传 偷 袭 珍 珠 港 山 本 五 十 六 传 [ 日 ] 阿 川 弘 之 著 张 承 译 时 代 文 艺 出 版 社 图 书 在 版 编 目 (CIP) 数 据 20 世 纪 军 政 巨 人 百 传 宋 长 琨 主 编, 长 春 : 时 代 文 艺 出 版 社,2001.12 ISBN 7-5387 -1629-7 Ⅰ. 20. Ⅱ. 宋. Ⅲ. 军 政 人 物
( CIP ) /,. - :,2005.10 ISBN 7-5601-3285-5............ - - - - - -.K878.2 CIP (2005) 077921 : : ( ) ( 421 ) : 8801230 1/ 32 : 6.125 : 154 ISBN 7-5601-
( CIP ) /,. - :,2005.10 ISBN 7-5601-3285-5............ - - - - - -.K878.2 CIP (2005) 077921 : : ( ) ( 421 ) : 8801230 1/ 32 : 6.125 : 154 ISBN 7-5601-3285-5 2005 10 1 2005 10 1 : 1-1000 : 12.00 ,,,, 1995
(CIP) /.:, 1998.6(2001.11 ) ISBN 7 5338 2936 0..........I207.2 CIP (2001)080091 (347 310006) ( ) 8501168 1/ 32 13 2 299000 12013770 1998 6 1 2001 11 2
(CIP) /.:, 1998.6(2001.11 ) ISBN 7 5338 2936 0..........I207.2 CIP (2001)080091 (347 310006) ( ) 8501168 1/ 32 13 2 299000 12013770 1998 6 1 2001 11 2 ISBN 7 5338 2936 0/ G2913 : 18.00 1 5 5 14 25 33 34
(CIP) / : 2006 8 ISBN7 218 05313 0 Ⅰ Ⅱ Ⅲ (1466 1560) - Ⅳ B248 99 CIP (2006)077534 850 11681/32 5 3 200 20068 120068 1 ISBN7 218 05313 0/B 190 20 00 (0
(CIP) / : 2006 8 ISBN7 218 05313 0 Ⅰ Ⅱ Ⅲ (1466 1560) - Ⅳ B248 99 CIP (2006)077534 850 11681/32 5 3 200 20068 120068 1 ISBN7 218 05313 0/B 190 20 00 (020 83795749) ( : ) 2 (1466) 40 ( ) 16 27 29 40 63
1
CIP /. - 2005. 12 ISBN 7-80171 - 425-3 Ⅰ. Ⅱ. Ⅲ. - Ⅳ. C933. 2 CIP 2005 124813 1 100007 787 1092 1 /16 2005 12 1 2006 1 1 1-3000 ISBN 7-80171 - 425-3 /C28 998. 00 1 2 2006 1 1139 1139 1139 1140 1143 1146
Ps22Pdf
,2006.2 ( CIP ) ISBN 7-204 - 04505 - X / :..........I106 CIP (2006)015695 * ( 20 ) : 8501168 1/ 32 :400 : 4800 2006 2 2 2006 2 1 :3000 ISBN 7-204 - 04505 - X/ I810 (38 ) : 998.00 ,,,,, :,,,,,,,,,,,,,,,,,,,,,,,,,
( CIP ) /. - :, 1999.10 ( ) ISBN 7-200 - 03791-5... - - - - -. K291 CIP ( 1999 ) 32637 * ( 6 ) : 100011 * 199 1 199 1 ISBN :
( CIP ) /. - :, 1999.10 ( ) ISBN 7-200 - 03791-5... - - - - -. K291 CIP ( 1999 ) 32637 * ( 6 ) : 100011 * 199 1 199 1 ISBN : , 1616,, 295 1635, 276 1644, 267, ( 1840 ), 1616 ( ) 1661 ( ), 1662 ( ) 1795
Ps22Pdf
,2006.2 ( CIP ) ISBN 7-204 - 04505 - X / :..........I106 CIP (2006)015695 * ( 20 ) : 8501168 1/ 32 :400 : 4800 2006 2 2 2006 2 1 :3000 ISBN 7-204 - 04505 - X/ I810 (38 ) : 998.00 ,!,,!,,,,,?,,,,,,!,,!
Ps22Pdf
,2006.2 ( CIP ) ISBN 7-204 - 04505 - X / :..........I106 CIP (2006)015695 * ( 20 ) : 8501168 1/ 32 :400 : 4800 2006 2 2 2006 2 1 :3000 ISBN 7-204 - 04505 - X/ I810 (38 ) : 998.00 ,,,,,,,,,,,,,,,,,,,,,,,?,,,!,,,,?,,,,,,,,
(CIP),. - :, ISBN E296 CIP ( 2003) ( ) : : : : 6 1 : : : : 32 ( ) : 680 : : 5000 : :
( ) 2003 (CIP),. - :,2003.9 ISBN 7-80136 - 915-7... - -.E296 CIP ( 2003) 067822 ( ) : : : : 6 1 : 100080 : : : 32 (8801230 ) : 680 : 29.75 : 5000 : 2003 12 1 : 2003 12 1 ISBN 7-80136 - 915-7K781 : 49.80
( CIP) /. - :, ( ) ISBN I CIP ( 2002) ( ) : : : ( ) 1 : : : /32 : 208 : 5, 400 :
2006 ( CIP) /. - :, 2002. 6 ( ) ISBN7-80176 - 023-9... - -. I106. 2 CIP ( 2002) 035734 ( ) : : : ( 100089) 1 : : : 8501168 1 /32 : 208 : 5, 400 : 2002 6 1 : 2006 5 3 : ISBN7-80176 - 023-9 : 636. 00 ( 26.
,,, 19, 370,,,,,,, (CIP) /. :, ISBN R28 CIP (2002 ) * * : / 16 : : : 1 4
,,, 19, 370,,,,,,, (CIP) /. :, 2002. 2 ISBN 7-5624-2576-0.......... R28 CIP (2002 ) 007159 * * : 787 1092 1/ 16 : 16. 25 : 424 2002 2 1 2002 2 1 : 1 4000 ISBN 7-5624-2576-0/ R 161 :22. 00 ,,,,,,,,,,, :
Ps22Pdf
( ) / / ( CIP) /, :, 2005. 8 (, 2., ) ISBN 7-5634 - 2116-5......... - - -. I565. 44 CIP ( 2005 ) 102498 : : : : ( ) ( 105 : 133002) 8501168 1 /32 10 240 2006 2 2 1 ISBN 7-5634 - 2116-5 / I294 12 : 237.
( CIP ) /. - :, ( ) ISBN F CIP ( 1999 ) * ( 6 ) : * ISBN :
( CIP ) /. - :, 1999.10 ( ) ISBN 7-200 - 03791-5... - -. F727. 1 CIP ( 1999 ) 32679 * ( 6 ) : 100011 * 199 1 199 1 ISBN : ,,, ; ;,,,,,,, 6 ;,,, ( ) 938 ( ),,,,,, 1153 ( ),,, 1272 ( 9 ),, 1403 ( ), 1420
战神(上).doc
项 目 策 划 : 阎 安 丛 书 统 筹 : 龙 的 天 空 责 任 编 辑 : 阎 安 特 约 编 辑 : 孙 健 李 文 雅 责 任 印 制 : 刘 志 恒 图 书 在 版 编 目 (CIP) 数 据 战 神 / 秋 凡 著. 北 京 : 海 洋 出 版 社,2005.8 ( 幻 城 系 列 ) ISBN 7-5027-6388-0 Ⅰ. 战 Ⅱ. 秋 Ⅲ. 科 学 幻 想 小 说 中 国 当
Ps22Pdf
) ( ) 2006 ( C I P ) :, 2002. 6 ( ) ISBN7-80176 - 022-0 /. -... - -. I207. 37 CIP ( 2002 ) 035745 ( ) : : : ( 100089) 1 : : : 8501168 1 /32 : 2, 715 : 104. 5 : 2002 6 1 : 2006 5 3 : ISBN7-80176 - 022-0
Ps22Pdf
) ( ) 2006 ( C I P ) :, 2002. 6 ( ) ISBN7-80176 - 022-0 /. -... - -. I207. 37 CIP ( 2002 ) 035745 ( ) : : : ( 100089) 1 : : : 8501168 1 /32 : 2, 715 : 104. 5 : 2002 6 1 : 2006 5 3 : ISBN7-80176 - 022-0
Ps22Pdf
( ) ( ) 2006 ( C I P ) /. - :, 2002. 6 ( ) ISBN7-80176 - 022-0... - -. I207. 37 CIP ( 2002 ) 035745 ( ) : : : ( 100089) 1 : : : 8501168 1 /32 : 2, 715 : 104. 5 : 2002 6 1 : 2006 5 3 : ISBN7-80176 - 022-0
Ps22Pdf
( ) ( ) 2006 ( C I P ) /. - :, 2002. 6 ( ) ISBN7-80176 - 022-0... - -. I207. 37 CIP ( 2002 ) 035745 ( ) : : : ( 100089) 1 : : : 8501168 1 /32 : 2, 715 : 104. 5 : 2002 6 1 : 2006 5 3 : ISBN7-80176 - 022-0
第6章 数据库技术基础
第 六 章 数 据 库 技 术 基 础 本 章 要 点 数 据 库 系 统 概 述 关 系 数 据 库 数 据 库 设 计 数 据 库 系 统 概 述 数 据 管 理 技 术 的 发 展 数 据 管 理 技 术 的 发 展 分 三 个 阶 段 : 人 工 管 理 阶 段 文 件 系 统 管 理 阶 段 数 据 库 系 统 管 理 阶 段 数 据 库 系 统 概 述 数 据 库 数 据 库 管 理 系
TopTest_Adminstrator.doc
壹 前 言... 3 貳 系 統 簡 介... 4 一 TKB multimedia Top-Test 系 統 架 構...4 1. 使 用 者 介 面 層 (Presentation tier)...5 2. 商 業 邏 輯 層 (business logic tier)...5 3. 資 料 服 務 層 (data services tier)...5 二 TKB Multimedia Top-Test
untitled
http://idc.hust.edu.cn/~rxli/ 1.1 1.2 1.3 1.4 1.5 1.6 2 1.1 1.1.1 1.1.2 1.1.3 3 1.1.1 Data (0005794, 601,, 1, 1948.03.26, 01) (,,,,,) 4 1.1.1 Database DB 5 1.1.1 (DBMS) DDL ( Create, Drop, Alter) DML(
學 科 100% ( 為 單 複 選 題, 每 題 2.5 分, 共 100 分 ) 1. 請 參 閱 附 圖 作 答 : (A) 選 項 A (B) 選 項 B (C) 選 項 C (D) 選 項 D Ans:D 2. 下 列 對 於 資 料 庫 正 規 化 (Normalization) 的 敘
ITE 資 訊 專 業 人 員 鑑 定 資 料 庫 系 統 開 發 與 設 計 實 務 試 卷 編 號 :IDS101 注 意 事 項 一 本 測 驗 為 單 面 印 刷 試 題, 共 計 十 三 頁 第 二 至 十 三 頁 為 四 十 道 學 科 試 題, 測 驗 時 間 90 分 鐘 : 每 題 2.5 分, 總 測 驗 時 間 為 90 分 鐘 二 執 行 CSF 測 驗 系 統 -Client
CIP ) / :,2006.2 ISBN 7-80702 - 188-8..........K.23 CIP (2006) 080136 :960 640mm 1/ 16 : 55 :1080 2006 3 2 1 :5000 ISBN 7-80702 - 188-8/ K 23 ( 3 ) :
CIP ) / :,2006.2 ISBN 7-80702 - 188-8..........K.23 CIP (2006) 080136 :960 640mm 1/ 16 : 55 :1080 2006 3 2 1 :5000 ISBN 7-80702 - 188-8/ K 23 ( 3 ) : 260.00 ( 1 ) ( 1 ) ( 1 ) ( 2 ) ( 3 ) ( 3 ) ( 4 ) (
Ps22Pdf
: : (CIP) / :, 2006.3 ISBN 7-5385 - 2026-0..........I222 CIP (2006) 021873 :8501168mm 1/ 32 :200 :3000 2006 1 2 : 2000 ISBN 7-5385 - 2026-0/ I393 :498.00 ( 22 ) : : : ,,,,,,,,,,, : 7 8, 8 8, 8 9, 9 10
Ps22Pdf
: : (CIP) / :, 2006.3 ISBN 7-5385 - 2026-0..........I222 CIP (2006) 021873 :8501168mm 1/ 32 :200 :3000 2006 1 2 : 2000 ISBN 7-5385 - 2026-0/ I393 :498.00 ( 22 ) : : : ,,,,,,,,,,, : 7 8, 8 8, 8 9, 9 10
Ps22Pdf
( CIP). :, 2006 ISBN 7-224-07586-8... ( ). E289. 413 - - CIP (2006) 022989 ( 147 : 710003) 787mm 1092mm 16 29 24 650 2006 3 1 2006 3 1 1 1000 ISBN 7-224-07586-8 E 57 128.00 ISBN 7-224-07586-8 E 57 : 128.00
(CIP) :, 2003 ISBN 7 81010 715 1 /...........R151.2 CIP (2002) 105855 ( 530 200032) 850 mm1168 mm 1/ 32 11.25 283 1 4 100 2003 4 1 2003 4 1 ISBN 7 810
(CIP) :, 2003 ISBN 7 81010 715 1 /...........R151.2 CIP (2002) 105855 ( 530 200032) 850 mm1168 mm 1/ 32 11.25 283 1 4 100 2003 4 1 2003 4 1 ISBN 7 81010 715 1/ R680 22.00 ,,,,,,,,,,,,,,,,,,,,, 20,,,,,,,,,,,,,,,,,,,,
6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM
CHAPTER 6 SQL SQL SQL 6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM 3. 1986 10 ANSI SQL ANSI X3. 135-1986
序号
简 介 创 立 于 1984 年 5 月, 植 根 于 闻 名 遐 尔 的 高 等 学 府, 得 古 越 文 化 悠 久 历 史 之 厚 蕴, 承 浙 大 几 代 学 人 求 是 创 新 之 精 神, 通 过 28 年 发 展, 已 成 长 为 一 个 具 有 图 书 期 刊 数 字 电 子 音 像 的 全 方 位 立 体 化 出 版 功 能 的, 集 理 工 农 医 和 人 文 社 科 多 学 科
( CIP ) /. - :, ( ) ISBN , -. K CIP ( 1999 ) * ( 6 ) : * ISBN :
( CIP ) /. - :, 1999.10 ( ) ISBN 7-200 - 03791-5..., -. K892. 41 CIP ( 1999 ) 32680 * ( 6 ) : 100011 * 199 1 199 1 ISBN : 1997 2 10, :, :,,,,,,,,,,,, 1984,,,,,,, 1 ,,?,, 2 ( 1 ) ( 3 ) 1. ( 3 ) 2. ( 7 )
(CIP) /. :, 2004.1 ISBN7-81060 - 342-6......... - -.TS971-49 CIP (2003) 085575 818 : 200433 / : 021-65493093 : 850 1168 1/ 32 : 9.625 : 255 2004 1 1 2
(CIP) /. :, 2004.1 ISBN7-81060 - 342-6......... - -.TS971-49 CIP (2003) 085575 818 : 200433 / : 021-65493093 : 850 1168 1/ 32 : 9.625 : 255 2004 1 1 2004 1 1 : 13 000 ISBN 7-81060 - 342-6/ T012 : 19.70
: ( ) ( ) : () ( ) ( )
: ( ) ( ) : () ( ) ( ) ( CIP ) /,. - :,2004. 4 ISBN 7-81100 - 114-4... - -. G861. 1 CIP (2004) 020066 100084 8501168 1/ 32 6 2004 4 1 1 6000 ISBN 7-81100 - 114-4/ G105 13. 00 ( ) , 2002 8,,,,,,,,,,,,,,,,,,,
目錄
資 訊 素 養 線 上 教 材 單 元 五 資 料 庫 概 論 及 Access 5.1 資 料 庫 概 論 5.1.1 為 什 麼 需 要 資 料 庫? 日 常 生 活 裡 我 們 常 常 需 要 記 錄 一 些 事 物, 以 便 有 朝 一 日 所 記 錄 的 事 物 能 夠 派 得 上 用 場 我 們 能 藉 由 記 錄 每 天 的 生 活 開 銷, 就 可 以 在 每 個 月 的 月 底 知
前言
作 为 新 中 国 最 早 设 立 的 专 业 教 育 出 版 机 构, 高 等 教 育 出 版 社 始 终 坚 持 植 根 教 育 弘 扬 学 术 繁 荣 文 化 服 务 社 会 的 办 社 理 念, 开 拓 创 新, 砥 砺 前 行, 伴 随 着 新 中 国 教 育 事 业 的 不 断 发 展 壮 大, 经 过 60 年 的 奋 斗, 高 教 社 已 经 发 展 成 为 以 出 版 高 等 教
2005 ( CIP ) / ISBN :, K CIP ( 2005 ) : : : : 66 : : http: www. lnupress. cn
2005 ( CIP ) /. 2005. 4 ISBN 7-5610 - 4798-3 - :,......... - -. K260. 7 CIP ( 2005 ) 030596 : : : : 66 : 110036 : 024-86864613 http: www. lnupress. cn E mail: mailer @lnupress. cn : 148mm 210mm : 8. 75
(CIP) /,,. :, 2004.3 ISBN 7-81060 - 387-6............... - -.759-44 CIP (2004) 013241 818 : 200433 / : 021-65493093 : 7871092 1/ 32 : 4.25 : 962 2004
( ),! (CIP) /,,. :, 2004.3 ISBN 7-81060 - 387-6............... - -.759-44 CIP (2004) 013241 818 : 200433 / : 021-65493093 : 7871092 1/ 32 : 4.25 : 962 2004 3 1 2004 3 1 : 14 000 ISBN 7-81060 - 387-6/ R280
天津天狮学院关于修订2014级本科培养方案的指导意见
目 录 天 津 天 狮 院 关 于 修 订 2014 级 本 科 培 养 方 案 的 指 导 意 见...1 金 融 类 专 业...9 金 融 专 业 培 养 方 案...9 保 险 专 业 培 养 方 案...14 人 力 资 源 管 理 专 业 培 养 方 案...19 劳 动 与 社 会 保 障 专 业 培 养 方 案...24 工 商 管 理 类 专 业...29 市 场 营 销 专 业
( ) 182 ( CIP) /,. 2. :, 2005 ISBN 7-81078 -596-6............ - - -. F842. 3 CIP ( 2005) 141447 2005 ( ) : 12 : 100029 : http: / / www. uibep. com : 1
) ( ) 182 ( CIP) /,. 2. :, 2005 ISBN 7-81078 -596-6............ - - -. F842. 3 CIP ( 2005) 141447 2005 ( ) : 12 : 100029 : http: / / www. uibep. com : 140mm 203mm 16 401 2006 1 2 2006 1 1 ISBN 7-81078-
: : ( ) : / : ISBN / X144 : : CIP (2005)
: : ( ) : / : ISBN 7801145207/ X144 : 3. 00 : 2005 5 CIP (2005) 048169 1?,?,,?,!,,,,, 1 3 4 6 8 10 10 16 20 1 ,,,, 20 21 22 24 25 26 27 28 29 30?,,,,,!,, 30 31 5 33 2 35 35 36 37 42,,, ;, ;,, 42 46 48
( )
( ) ( CIP ) /. :, 2006 ISBN 7-80135 - 721-3................ I11 CIP ( 2006) 015417 2006 7 1 1 : 850 1168 1 /32 : 190 : 3958 ISBN 7-80135 - 721-3 : 696. 00 ( 29. 00) ( ADD: 10 ) P. C: 100024 Tel: 010-65477339
( )
( ) ( CIP ) /. :, 2006 ISBN 7-80135 - 721-3................ I11 CIP ( 2006) 015417 2006 7 1 1 : 850 1168 1 /32 : 190 : 3958 ISBN 7-80135 - 721-3 : 696. 00 ( 29. 00) ( ADD: 10 ) P. C: 100024 Tel: 010-65477339
Microsoft Word - 书目文件.doc
计 算 机 类 算 法 与 程 序 设 计 类 1 11025 数 据 结 构 ( 第 三 版 ) 十 一 五 国 家 级 规 划 教 材 刘 振 鹏 等 28.00 2010.5 本 科 2 11563 数 据 结 构 习 题 解 答 与 实 验 指 导 ( 第 三 版 ) 石 强 等 21.00 2010.7 本 科 3 07628 数 据 结 构 与 算 法 王 昆 仑 35.00 2007.6
Ps22Pdf
( ) 1 2006 ( CIP) /. - :, 2002. 6 ( ) ISBN7-80176 - 024-7... - -. I106. 6 CIP ( 2002) 035735 ( ) : : : ( 100089) 1 : : : 850 1168 1 /32 : 126 : 3, 273 : 2002 6 1 : 2006 5 3 : ISBN7-80176 - 024-7 : 397.
( )
( ) , 2006 /. : ISBN7-80135 - 721-3................ I11 CIP ( 2006) 015417 2006 7 1 1 : 850 1168 1 /32 : 190 : 3958 ISBN7-80135 - 721-3 : 696. 00 ( 29. 00) ( ADD: 10 ) P. C: 100024 Tel: 010-65477339 010-65740218
;; 70, (2004 ),,,,: ;, (CIP) /. :, 2004 ISBN H1 CIP (2004 ) : : /
;; 70, (2004 ),,,,: 010-62782989 13901104297 13801310933 ;, (CIP) /. :, 2004 ISBN 7-302-08959-0... - - -.H1 CIP (2004 )063339 : : http:/ / www.tup.com.cn : 100084 : 010-62770175 : 010-62776969 : : : :
1 SQL Server 2005 SQL Server Microsoft Windows Server 2003NTFS NTFS SQL Server 2000 Randy Dyess DBA SQL Server SQL Server DBA SQL Server SQL Se
1 SQL Server 2005 DBA Microsoft SQL Server SQL ServerSQL Server SQL Server SQL Server SQL Server SQL Server 2005 SQL Server 2005 SQL Server 2005 o o o SQL Server 2005 1 SQL Server 2005... 3 2 SQL Server
( CIP) /. :, 2003 ISBN 7 81010 776 3.......... R24 65 CIP ( 2003) 102280 ( 2 ) 1200 ( 201203) 850 mm 1168 mm 1 /16 30. 5 881 5 301 10 400 2003 12 2 20
2 ) ( CIP) /. :, 2003 ISBN 7 81010 776 3.......... R24 65 CIP ( 2003) 102280 ( 2 ) 1200 ( 201203) 850 mm 1168 mm 1 /16 30. 5 881 5 301 10 400 2003 12 2 2003 12 3 ISBN 7 81010 776 3 / R 739 64. 00 ( ) )
Ps22Pdf
( CIP) :, 2002. 6 ( ) ISBN7-80176 - 023-9 /. -... - -. I106. 2 CIP ( 2002) 035734 ( ) : : : ( 100089) 1 : : : 8501168 1 /32 : 208 : 5, 400 : 2002 6 1 : 2006 5 3 : ISBN7-80176 - 023-9 : 636. 00 ( 26. 50
epub 61-2
2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +
Name of Government Department
運 輸 署 2014 年 度 專 上 學 生 暑 期 實 習 計 劃 一 般 要 求 申 請 人 必 須 為 (a) 香 港 特 別 行 政 區 永 久 性 居 民 ; 以 及 (b) 於 2013/14 及 2014/15 學 年 在 本 地 或 海 外 專 上 院 校 攻 讀 全 日 制 經 評 審 專 上 課 程 ( 註 : 2014 年 應 屆 畢 業 生 之 申 請 恕 不 考 慮 ) 薪
9l1.s92
客 家 文 丛 客 家 之 子 林 碧 红 主 编 谭 元 亨 编 著 黎 娟 华 南 理 工 大 学 出 版 社 广 州 图 书 在 版 编 目 (CIP) 数 据 客 家 之 子 / 谭 元 亨, 黎 娟 等 编 著. 广 州 : 华 南 理 工 大 学 出 版 社, 2006 畅 1 ( 客 家 研 究 文 丛 客 家 与 梅 州 书 系 ) ISBN 7 5623 2292 9 Ⅰ. 客 Ⅱ.
Ps22Pdf
( CIP ) / : 2006.2 ISBN 7-80702 - 295-7..........I.40 CIP (2006)080154 :8501168mm 1/ 32 : 110 :2900 2006 3 1 :5000 ISBN 7-80702 - 295-7/ I40 : 380.00 ,,,,,,,,,,,,, : ;, ;, :,,, 2006 2 ( 1 ) ( 5 ) (12 )
Ps22Pdf
(CIP) /. :, 2005 ISBN 7-5375 - 3325-3.... R247.1 TS972.161 CIP (2005) 152967 / / 330 / 050061 / / / / / 880 1230 1/ 32 / 15 / 370 / 2006 1 1 / 2006 1 1 / 24.80 ,,,,,,,,,,,,,,,, ;,,,,, 2006 1 ( ) ( ) (
( CIP) /,. :, 2004 ISBN K828.2 CI P ( 2004 ) ( ) : : :890mm 1240mm 1/ 32 : 5.5 : 16 :
( CIP) /,. :, 2004 ISBN 7-313 - 03771-6............. K828.2 CI P ( 2004 ) 057767 ( 877 200030 ) : 64071208 : :890mm 1240mm 1/ 32 : 5.5 : 16 :157 2004 6 1 2004 6 1 :1-20 000 ISBN7-313 - 03771-6/ K 021 :15.00
Ps22Pdf
( CIP ) / :,2006.2 ISBN 7-204 - 04505 - X..........I106 CIP (2006)015695 * (20 ) : 8501168 1/ 32 :400 : 4800 2006 2 2 2006 2 1 :3000 ISBN 7-204 - 04505 - X/ I810 (38 ) : 998.00 26, 26 38, 10 20, ;, 18
Ps22Pdf
( CIP) / - :, 2005. 4 ISBN 7-5063 - 3246-9 - - I247. 5 CIP ( 2005) 026773 : : : : : 10 : 100026 : 86-10 - 65930756 ( ) E - mail: 86-10 - 65004079 ( ) 86-10 - 65389299 ( ) wrtspub@ public. bta. net. cn
Microsoft Word - 内容提要2.doc
写 作 概 说 青 萍 主 编 图 书 在 版 编 目 (CIP) 数 据 写 作 概 说 / 青 萍 主 编. 成 都 : 电 子 科 技 大 学 出 版 社,2004.9 ISBN 7-81094-641-2 Ⅰ 写... Ⅱ 青... Ⅲ. 汉 语 写 作 高 等 学 校 教 材 Ⅳ.H15 中 国 版 本 图 书 馆 CIP 数 据 核 字 (2004) 第 094721 号 写 作 概 说
Ps22Pdf
(CIP). /.:, 2002 ISBN 7-5045-3638-5... -. T S972. 182. 53 CIP (2002) 056645 ( 1 : 100029) : * 787 1092 16 6. 25 154 2003 3 1 2003 3 1 : : 20. 00 ( VCD 1 ) : 64929211 : 64911190 : http:/ / www.class.com.cn
本 课 程 作 为 非 计 算 机 专 业 本 科 通 识 课 程, 是 一 门 理 论 和 实 践 紧 密 结 合 的 实 用 课 程, 内 容 包 括 计 算 机 基 础 部 分 和 程 序 设 计 部 分 计 算 机 基 础 部 分 涵 盖 计 算 机 软 硬 件 组 成 数 制 表 示 操
计 算 机 基 础 部 程 序 设 计 类 课 程 介 绍 1. Java 语 言 程 序 设 计 Java 简 介 Java 是 一 种 开 放 的 可 以 撰 写 跨 平 台 应 用 程 序 的 面 向 对 象 的 程 序 设 计 语 言 Java 技 术 具 有 卓 越 的 通 用 性 高 效 性 平 台 移 植 性 和 安 全 性, 广 泛 应 用 于 PC 数 据 中 心 科 学 超 级
习题1
习 题 1 数 据 库 系 统 基 本 概 念 1.1 名 词 解 释 DB DB 是 长 期 存 储 在 计 算 机 内 有 组 织 的 统 一 管 理 的 相 关 数 据 的 集 合 DB 能 为 各 种 用 户 共 享, 具 有 较 小 冗 余 度 数 据 间 联 系 紧 密 而 又 有 较 高 的 数 据 独 立 性 等 特 点 DBMS 是 位 于 用 户 与 操 作 系 统 之 间 的
Mechanical Science and Technology for Aerospace Engineering October Vol No. 10 Web SaaS B /S Web2. 0 Web2. 0 TP315 A
2012 10 31 10 Mechanical Science and Technology for Aerospace Engineering October Vol. 31 2012 No. 10 Web2. 0 400030 SaaS B /S Web2. 0 Web2. 0 TP315 A 1003-8728 2012 10-1638-06 Design and Implementation
untitled
Data Source 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 8-1 Data Source 8-2 Data Source 8-3 Data Source 8-4 Data Source 8-5 DataSourceID 8-6 DataSourceMode 8-7 DataSource 8-8 8-9 Parameter Direction
untitled
/ ISBN 7 80179 332 8/V 140 2004 5 / 4.00 20 : (1) (2) : 1 (2)!? N,!!? ?? 99 2003 6 SARS 2003 ( ) 2000 Powerpoint 10 3 10 ( ) 10 1500 10 3 3 30 18 51job BBS SARS 4 OFFER SARS SOHO SOHO CRM ERP 51JOB
Ps22Pdf
) / / ( CIP) /, :, 2005. 8 (, 1., ) ISBN 7-5634 - 2119 - X......... - - -. I565. 84 CIP ( 2005 ) 102467 : : : : ( ) ( 105 : 133002) 850 1168 1 /32 10 240 2006 2 2 1 ISBN 7-5634 - 2119 - X /I 297 12 : 237.
