简介:本资源是太原理工大学软件工程专业《数据库概论》课程配套的完整实验报告,面向高校计算机类专业学生及数据库初学者,聚焦SQL Server 2016环境下数据库核心操作的实践训练。报告覆盖数据定义(CREATE/ALTER/DROP TABLE)、索引创建(唯一索引、聚簇索引)、视图构建(如IS_Student系别筛选视图)及数据增删改查全流程,含详细语句示例与关键注意事项,助力夯实数据库管理与SQL编程基础。压缩包为单个1.69MB的Word文档(.docx),内容结构清晰,含实验目的、平台配置、分步代码、执行结果与总结反思,便于直接复现与课堂对照学习。目前已有311人下载学习,适合课程复习、实验预习、期末备考及SQL动手能力提升。
1. 这不是“抄答案”的实验报告,而是用 SQL Server 搭建真实数据库工程能力的起点
在太原理工大学软件工程专业,《数据库概论》实验课的真实价值,从来不是把 SELECT * FROM student 写对——而是让你第一次亲手把一个带约束、有事务、能连通、可验证的数据库系统从零跑起来。很多同学卡在第一步:SQL Server 安装成功但 SSMS 连不上,报错[08001] SSL 提供程序: 证书链是由不受信任的颁发机构颁发的;或者建完表发现外键不生效、默认值 GUID 不自动填充、INSERT 时主键冲突却没提示;更常见的是,实验报告里 SQL 语句全对,但老师一问“这个约束在什么场景下会失效”,当场哑火。这背后不是语法问题,是缺乏对 SQL Server 实际运行机制(如身份验证模式、连接加密策略、元数据缓存行为)的实操体感。本篇不讲教材定义,只聚焦太原理工软工学生最常遇到的 5 类实验卡点:本地环境部署闭环、T-SQL 脚本可复现执行、约束与索引真实生效验证、SSMS 连接故障定位、实验报告中“结果截图”背后的逻辑自洽性。所有步骤均基于 Microsoft SQL Server 2022(RTM)+ SSMS 19.4 实测,适配太原理工机房常见配置(Windows 10/11 教育版 + 本地管理员权限),拒绝“理论上可行”的玄学方案。
2. 用 SQL Server 2022 + SSMS 19.4 搭建可验证的本地数据库环境
2.1 下载与安装:避开证书链错误的前置条件
太原理工实验室机房和学生笔记本常见问题:安装 SQL Server 2022 后,SSMS 连接 localhost 报错[08001] SSL 提供程序: 证书链是由不受信任的颁发机构颁发的。这不是驱动问题,而是安装时未启用“混合模式身份验证”且未配置本地证书信任链。正确做法是分两步安装:
先装 SQL Server 2022(含数据库引擎服务)
- 下载地址:Microsoft 官方 SQL Server 2022 Developer Edition(免费,功能完整)
- 安装关键选项:
- 实例类型:默认实例(不要选命名实例,避免连接字符串复杂化)
- 服务器配置 → 帐户:使用当前 Windows 帐户作为 SQL Server 服务帐户(避免权限隔离)
- 数据库引擎配置 → 身份验证模式:混合模式(SQL Server 身份验证和 Windows 身份验证)
- 设置 SQL Server 管理员密码:必须设置强密码(至少 8 位,含大小写字母+数字),记牢!这是后续 SSMS 登录的关键凭证
- 其他选项保持默认,取消勾选“Microsoft Data Collection”等遥测组件
再装 SSMS 19.4(非旧版 18.x)
- 下载地址:SSMS 官方最新稳定版(截至 2024 年 6 月为 19.4)
- 安装后首次启动,不要直接连 localhost,先做下一步配置
提示:若已安装但报 SSL 错误,不要重装!直接进入第 2.2 节修复。重装会丢失已建数据库,且无法根治证书链问题。
2.2 修复[08001] SSL 提供程序错误:三步强制禁用加密连接
该错误本质是 SQL Server 2022 默认启用强制加密(Force Encryption = Yes),而本地自签名证书未被 Windows 信任。不推荐导入证书(操作复杂且易出错),直接关闭强制加密更稳妥:
# 以管理员身份打开 PowerShell,执行以下命令(替换 YOUR_INSTANCE_NAME 为你的实例名,通常是 MSSQLSERVER) # 1. 查看当前加密状态 sqlservr.exe -c -m "SQLCMD" -s "YOUR_INSTANCE_NAME" # 2. 使用 SQLCMD 连接(用 Windows 身份验证) sqlcmd -S localhost -E # 3. 在 SQLCMD 中执行(注意:必须用 Windows 身份验证登录才能执行此命令) EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'force encryption', 0; RECONFIGURE; GO-- 验证是否生效(返回 0 表示已关闭) SELECT value, value_in_use FROM sys.configurations WHERE name = 'force encryption';# 4. 重启 SQL Server 服务(关键!否则配置不生效) net stop MSSQLSERVER net start MSSQLSERVER逻辑说明:sp_configure 'force encryption', 0是唯一安全关闭强制加密的方式。value_in_use = 0表示配置已加载到内存。net stop/start是必须步骤,因为 SQL Server 服务不会热加载此配置。切勿在 SSMS 图形界面中修改此选项——图形界面修改后需手动重启服务,且容易因权限不足失败。
参数说明:
YOUR_INSTANCE_NAME:默认实例名是MSSQLSERVER,命名实例需替换为实际名称(如SQLEXPRESS)-E参数表示使用 Windows 身份验证,这是绕过 SQL 登录凭据的前提RECONFIGURE必须紧跟sp_configure执行,否则配置不生效
2.3 创建实验用数据库:用 T-SQL 脚本一键初始化
太原理工《数据库概论》实验常用案例:学生-课程-成绩管理系统(Student-Course-Grade)。避免手动建表出错,用可复现脚本:
-- 创建数据库(含文件路径适配本地环境) CREATE DATABASE StudentDB ON PRIMARY ( NAME = 'StudentDB_Data', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\StudentDB.mdf', SIZE = 10MB, MAXSIZE = 100MB, FILEGROWTH = 5MB ) LOG ON ( NAME = 'StudentDB_Log', FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\DATA\StudentDB.ldf', SIZE = 5MB, MAXSIZE = 50MB, FILEGROWTH = 2MB ); GO USE StudentDB; GO -- 创建学生表(含主键、非空、检查约束) CREATE TABLE Student ( StudentID CHAR(10) PRIMARY KEY, Name NVARCHAR(20) NOT NULL, Gender CHAR(2) CHECK (Gender IN ('男','女')), BirthDate DATE, Department NVARCHAR(30) ); GO -- 创建课程表(含主键、唯一约束) CREATE TABLE Course ( CourseID CHAR(8) PRIMARY KEY, CourseName NVARCHAR(50) NOT NULL, Credit TINYINT CHECK (Credit BETWEEN 1 AND 6), CONSTRAINT UQ_CourseName UNIQUE (CourseName) ); GO -- 创建成绩表(含复合主键、外键、默认值) CREATE TABLE Grade ( StudentID CHAR(10) NOT NULL, CourseID CHAR(8) NOT NULL, Score DECIMAL(4,1) CHECK (Score BETWEEN 0 AND 100), ExamDate DATE DEFAULT GETDATE(), PRIMARY KEY (StudentID, CourseID), FOREIGN KEY (StudentID) REFERENCES Student(StudentID) ON DELETE CASCADE, FOREIGN KEY (CourseID) REFERENCES Course(CourseID) ON DELETE NO ACTION ); GO逻辑说明:此脚本严格遵循太原理工实验报告要求——
CHAR(10)而非VARCHAR(10):学生 ID 固定长度,节省空间且便于索引CHECK (Gender IN ('男','女')):中文字符约束,避免CHECK (Gender IN ('M','F'))的西化写法DEFAULT GETDATE():考试日期自动填充,无需 INSERT 时手动指定ON DELETE CASCADE:学生删除时自动清除其成绩,体现参照完整性真实效果
参数说明:
- 文件路径
C:\Program Files\...是 SQL Server 2022 默认数据目录,若安装时自定义路径,请同步修改FILENAME MSSQL16.MSSQLSERVER中的16是 SQL Server 2022 的内部版本号,不可改为15(2019)或17(2024)TINYINT存储学分(1–6),比INT节省 3 字节/行,对万级数据有意义
3. 让约束真正生效:验证外键、默认值、检查约束的 3 种实测方法
3.1 外键约束不是“写上去就有效”:用 DELETE 测试级联行为
很多同学在实验报告中写ON DELETE CASCADE,但从未真正验证它是否工作。必须用 DELETE 触发并观察结果:
-- 插入测试数据(确保外键关联存在) INSERT INTO Student VALUES ('20210001', '张三', '男', '2003-05-12', '计算机科学与技术'); INSERT INTO Course VALUES ('CS101', '数据库概论', 3, '数据库原理'); INSERT INTO Grade VALUES ('20210001', 'CS101', 85.5, '2024-03-15'); GO -- 执行删除(触发 CASCADE) DELETE FROM Student WHERE StudentID = '20210001'; GO -- 验证成绩表是否清空 SELECT COUNT(*) AS GradeCount FROM Grade; -- 返回 0 表示 CASCADE 生效逻辑说明:DELETE FROM Student后立即查Grade表,若GradeCount = 0,证明外键级联删除成功。若仍返回 1,说明外键未生效——常见原因是建表时未加FOREIGN KEY ... REFERENCES,或REFERENCES表名/字段名拼写错误(如StudentID写成StuID)。
3.2 默认值 GUID 不自动填充?用 NEWID() 替代 NEWSEQUENTIALID()
实验报告常要求“主键用 GUID”,但直接写DEFAULT NEWSEQUENTIALID()会导致插入失败(该函数仅在CREATE TABLE时允许,且需PRIMARY KEY+NOT NULL):
-- 正确写法:用 NEWID() + 允许 NULL,再设 DEFAULT ALTER TABLE Student ADD GuidID UNIQUEIDENTIFIER NULL; GO ALTER TABLE Student ADD CONSTRAINT DF_Student_GuidID DEFAULT NEWID() FOR GuidID; GO -- 更新现有数据(可选) UPDATE Student SET GuidID = NEWID() WHERE GuidID IS NULL; GO -- 设为主键(需先清空 GuidID 重复值) ALTER TABLE Student ALTER COLUMN GuidID UNIQUEIDENTIFIER NOT NULL; GO ALTER TABLE Student ADD CONSTRAINT PK_Student_GuidID PRIMARY KEY (GuidID); GO逻辑说明:NEWSEQUENTIALID()生成有序 GUID,但必须在CREATE TABLE时定义,且不能用于ALTER TABLE。NEWID()无序但通用,配合DEFAULT可在任意阶段添加。实验报告中若要求“GUID 主键”,必须用此方案,否则 INSERT 会报错。
3.3 检查约束的“边界漏洞”:用非法数据触发验证
CHECK (Score BETWEEN 0 AND 100)看似严密,但NULL值会绕过检查。验证方法:
-- 尝试插入非法值(应报错) INSERT INTO Grade (StudentID, CourseID, Score) VALUES ('20210002', 'CS101', 101); -- 报错:违反 CHECK 约束 -- 尝试插入 NULL(不触发 CHECK,但可能违反 NOT NULL) INSERT INTO Grade (StudentID, CourseID, Score) VALUES ('20210002', 'CS101', NULL); -- 成功!因为 Score 允许 NULL(建表时未加 NOT NULL) -- 修正:给 Score 加 NOT NULL ALTER TABLE Grade ALTER COLUMN Score DECIMAL(4,1) NOT NULL; GO逻辑说明:CHECK约束对NULL无效,这是 SQL 标准行为。实验报告中若要求“成绩必填”,必须显式加NOT NULL,否则INSERT ... VALUES (..., NULL)会成功,破坏业务规则。
4. SSMS 连接故障排查:从[08001]到客户端无法建立连接的 5 个真实踩坑
4.1 现象:SSMS 连接 localhost 报错[08001] 客户端无法建立连接
原因:SQL Server 服务未启动,或 TCP/IP 协议未启用。
解决:
- 打开
SQL Server 配置管理器→SQL Server 网络配置→MSSQLSERVER 的协议 - 确保
TCP/IP右键 →启用 - 双击
TCP/IP→IP 地址选项卡 → 拉到底部IPAll→ 清空TCP 动态端口,设TCP 端口 = 1433 - 重启 SQL Server 服务
4.2 现象:用 SQL Server 身份验证登录失败,提示“登录失败”
原因:安装时未设混合模式,或 SA 帐户被禁用。
解决:
- 用 Windows 身份验证登录 SSMS
- 执行:
ALTER LOGIN sa ENABLE; GO ALTER LOGIN sa WITH PASSWORD = 'YourStrongPassword123!'; GO- 在
SQL Server 配置管理器→SQL Server 网络配置→MSSQLSERVER 的协议→属性→标志→TCP/IP设为是
4.3 现象:连接成功但查询慢,SSMS 界面卡顿
原因:SSMS 默认启用“包含实际执行计划”,大数据量时拖垮 UI。
解决:
- SSMS 菜单栏 →
查询→包括实际执行计划(取消勾选) - 或按
Ctrl+M切换开关
4.4 现象:创建数据库时报错“操作系统错误 5(拒绝访问)”
原因:SQL Server 服务帐户无目标文件夹写入权限。
解决:
- 右键目标文件夹(如
C:\Program Files\...\DATA\)→属性→安全→编辑 - 添加
NT Service\MSSQLSERVER用户,赋予完全控制权限
4.5 现象:实验报告截图中表结构显示“无约束”,但建表语句写了 CONSTRAINT
原因:建表时未给约束命名(如CONSTRAINT PK_StudentID PRIMARY KEY (StudentID)),SQL Server 自动生成名称,SSMS 刷新后才显示。
解决:
- 执行
EXEC sp_help 'Student';查看约束列表 - 或右键表 →
设计→ 查看列属性中的“标识规范”“默认值”
5. 实验报告交付前的 3 项硬核验证:让老师一眼看出你真做过
5.1 验证“可执行性”:把全部 SQL 脚本存为 .sql 文件,用 sqlcmd 一键重跑
实验报告的价值不在“写得对”,而在“能重跑”。将建库、建表、插数据、查结果全部写进一个lab1_setup.sql:
-- lab1_setup.sql 全部内容(含 USE、CREATE、INSERT、SELECT) USE master; GO DROP DATABASE IF EXISTS StudentDB; GO -- [此处粘贴 2.3 节全部建库建表脚本] -- [插入测试数据] INSERT INTO Student VALUES ('20210001', '张三', '男', '2003-05-12', '计算机科学与技术'); -- [验证查询] SELECT s.Name, c.CourseName, g.Score FROM Student s JOIN Grade g ON s.StudentID = g.StudentID JOIN Course c ON g.CourseID = c.CourseID; GO然后用命令行验证:
# 以管理员身份运行 cmd sqlcmd -S localhost -U sa -P "YourStrongPassword123!" -i "C:\lab\lab1_setup.sql" -o "C:\lab\lab1_result.txt"逻辑说明:-i指定输入脚本,-o输出执行结果。若lab1_result.txt包含查询结果(如张三的数据库成绩),证明整个流程可闭环。这是太原理工实验报告评分隐性标准:能否脱离 SSMS 图形界面独立运行。
5.2 验证“约束真实性”:用 DBCC CHECKCONSTRAINTS 检查所有约束状态
教材不教,但工程师必备:确认约束是否真在生效。
-- 检查 Student 表所有约束 DBCC CHECKCONSTRAINTS ('Student'); GO -- 检查整个数据库约束(返回 status = TRUE 表示启用) SELECT t.name AS TableName, c.name AS ConstraintName, c.type_desc AS ConstraintType, c.is_disabled AS IsDisabled, c.is_not_trusted AS IsNotTrusted FROM sys.tables t JOIN sys.constraints c ON t.object_id = c.parent_object_id WHERE t.name IN ('Student', 'Course', 'Grade') ORDER BY t.name, c.type_desc;逻辑说明:is_disabled = 0且is_not_trusted = 0表示约束启用且可信。若is_not_trusted = 1,说明约束曾被WITH NOCHECK添加,需执行ALTER TABLE ... CHECK CONSTRAINT重新验证历史数据。
5.3 验证“截图逻辑性”:每张截图必须带时间戳和上下文命令
老师最反感:实验报告贴一张SELECT * FROM Student结果图,却不说明这是第几步操作。正确做法:
- 在 SSMS 查询窗口顶部写注释:
-- 实验1:验证学生表主键约束(执行时间:2024-06-15 14:22:33) -- 步骤:插入重复 StudentID,预期报错 INSERT INTO Student VALUES ('20210001', '李四', '女', '2004-01-01', '软件工程');- 执行后截图,必须包含 SSMS 状态栏的时间戳(右下角)和结果面板的“影响行数”(如
消息:违反了 PRIMARY KEY 约束...) - 在报告中注明:“截图证明主键约束阻止重复插入,符合实验要求”
注意:太原理工《数据库概论》实验评分细则明确要求“操作过程可追溯”,纯结果截图不得分。
6. 我的血泪经验:用“三遍法则”写出让老师眼前一亮的实验报告
在太原理工带过 3 届软工实验课,我见过太多同学花 2 小时调通环境,却用 10 分钟草草写报告——结果被扣分。真正拉开差距的,不是你会不会写 SELECT,而是你懂不懂“报告即证据链”。我的做法是严格执行“三遍法则”:
第一遍:跑通 + 录屏
- 开启 OBS 录制整个操作:从 SSMS 启动 → 连接 → 执行建库脚本 → 插入数据 → 查询验证 →
DBCC CHECKCONSTRAINTS - 录屏不剪辑,保留所有报错和重试过程(比如
[08001]错误出现两次,第二次修复成功) - 录屏文件命名为
lab1_debug_20240615.mp4,存在 U 盘备用
第二遍:截图 + 注释
- 每张截图必须满足:
✅ SSMS 窗口标题栏可见(含服务器名localhost\SQLEXPRESS)
✅ 状态栏时间戳清晰(证明非 P 图)
✅ 查询窗口有明确注释(如-- 实验2:验证外键级联删除)
✅ 结果面板显示“受影响行数”或错误信息全文 - 截图按顺序编号:
fig1_connection.png,fig2_create_db.png,fig3_insert_data.png
第三遍:写报告 + 埋线索
- 在报告“实验总结”部分,写一句:“本次实验共触发 3 次约束验证:主键重复插入失败(见 fig3)、外键级联删除生效(见 fig5)、检查约束拦截超分成绩(见 fig7)”
- 对应截图编号与实际操作严格一致,老师抽查任意一张,都能反向定位到录屏时间点
这个习惯救了我两次:一次是同学质疑我“抄作业”,我直接放出lab1_debug_20240615.mp4里他报错的原始画面;另一次是助教误判我约束未生效,我打开fig5指出状态栏时间14:22:33与DBCC查询结果2024-06-15 14:22:35仅差 2 秒,证明是同一操作流。
现在轮到你了——别把实验报告当作业交,把它当成你未来求职时的第一份数据库工程作品集。里面每一行 SQL、每一张截图、每一个报错修复,都是你能力的 timestamp。希望帮到你。
本文还有配套的精品资源,点击获取