数据库数据控制实验


数据库实验:数据控制

黄芃洋 2021212021 2021211801班


实验目的

熟悉通过SQL对数据库进行数据控制,包括安全性、完整性和数据库恢复

实验工具

SQL Server的交互查询工具

实验数据库(初始)

  • 建立数据库
  • 在数据库中建立部门、员工、工资三个表

实验内容

安全性实验部分:

授权与回收

另:注意SQL Server中登录名与用户的区别

1.在数据库中由DBA创建若干用户,权限全部选择为CONNECT(SQL Server中的db_accessadmin角色)

  • 创建登录名,并且选择不强制实施密码策略,选择Company作为默认数据库
  • 按照此方法依次创建登录名user1~user4

  • 在登录名下、Company数据库中创建用户,设置用户的schema并赋予数据库用户“db_accessadmin”权限

  • 按照此方法依次创建用户u1~u4

2.仿照教材4.2.4 [例1]~[例10],在DBA与这些用户之间进行授权和回收,并查看效果(4用例)

例一:把查询Staff表权限授给用户u1

  • 使用用户u1进入数据库系统,查询Staff表,可以查询到正常结果
  • 我们重新返回管理员,将u1权限收回
  • 我们重新使用用户u1进入数据库系统,查询Staff表,系统提示u1无查询权限

例二:把查询Salary表和修改基础工资的权限授给用户u2

  • 使用用户u2进入数据库系统,对Salary表的职员基础工资进行调整(由5000调整为5500),之后对Salary表进行查询,发现信息已被成功修改

  • 我们重新返回管理员,用与例一相同方法将u2权限收回后,系统提示u2无查询与更改权限

例三:把对Department表的全部权限授予用户u3

  • 使用用户u3进入数据库系统,对Department表执行添加元组操作,之后对Department表进行查询,发现信息已被成功插入添加

  • 我们重新返回管理员,用与例一相同方法将u3权限收回后,系统提示u3已无相关权限

例四:把对表Staff的INSERT权限授予u3用户,并允许他再将此权限授予其他用户;

  • 使用用户u3进入数据库系统,对Staff表执行添加元组操作,之后使用管理员用户对Staff表进行查询,发现信息已被成功插入添加

  • 使用用户u3进入数据库系统,通过u3再将此权限授予用户u4,之后使用u4用户对Staff表执行添加元组操作,发现信息已被成功插入添加

  • 我们重新返回管理员,用与例一相同方法将u3权限级联CASCADE收回后,系统提示u3、u4已无相关权限


完整性实验部分:

使用SQL对数据进行完整性控制,并用实验证实,当操作违反了完整性约束条件时,系统是如何处理的

1.实体完整性

建立客户表,令客户编号为主码

例一:向该表中尝试插入一个主码值为C03的元组(与表中原有的一个元组主码值一致),随后发现系统显示该尝试违反了主码约束,因此拒绝插入

例二:向该表中尝试插入一个主码值为NULL的元组,随后发现系统显示该尝试违反了主码约束,因此拒绝插入

2.参照完整性:

建立接洽表,令员工编号、客户编号为主码,二者分别参照引用Staff表的主码和Client表的主码

例一:尝试在Serve中插入元组,随后发现系统显示该尝试违反了外码约束,因此拒绝插入

例二:尝试在Serve中修改外码值,随后发现系统显示该尝试违反了外码约束,因此拒绝插入

例三:尝试在Staff中删除元组,随后发现系统显示该尝试可能破坏参照完整性,因此拒绝删除

例四:尝试在Staff中修改主码值,随后发现系统显示该尝试可能破坏参照完整性,因此拒绝修改

3.用户定义完整性

建立项目表,令项目编号为主码,并且要求项目名称唯一

例:向该表中尝试插入一个Project_Name值为A-UI-Design的元组(与表中原有的一个元组主码值一致),随后发现系统显示该尝试违反用户定义完整性,因此拒绝插入

4.CHECK短语

建立预算表,令项目编号为主码,并且要求预算低于50万

例:向该表中尝试插入一个Budget值为60万的元组,随后发现系统显示该尝试违反属性上的约束条件,因此拒绝插入

5.CONSTRAINT子句

建立立项申请表,令员工编号为主码,并且要求预算低于50万,且员工编号在1到50之间(包含1和50)

例:修改表Project_Application中的约束条件,要求预算低于30万

  • 向该表中尝试插入一个Request_Funding值为40万的元组,随后发现此时C2约束条件已经改成低于30万,因此系统显示该尝试违反约束条件,拒绝插入

备份与恢复实验部分:

用Transact-SQL完成以下操作

1.创建一个备份设备

  • 添加一个名为BackupDev的磁盘备份设备,其物理名称为E:\downloads\Microsoft SQL Server\backup\BackupC.bak

2.完整备份实验数据库到备份设备

3.向实验数据库中某个表插入若干条记录

  • 向表Staff插入记录

4.备份数据库事务日志到备份设备,并查看日志格式

5.利用第2步所得的完整备份,恢复到插入记录前的状态

  • 执行后查询Staff表,发现表已恢复到插入记录前的状态

6.利用第4步所得的事务日志,恢复到插入记录后的状态


触发器实验部分

自行为实验数据库的某个表设计一个触发器,实现某种完整性控制,并验证效果

1.定义一个BEFORE行级触发器,为预算表Budget

  • 定义完整性规则:预算低于40万元,如果超过40万元,自动改为39.9999万元。

2.向budget表中添加一个41万预算的项目进行验证,查表后发现41万的预算被自动改成39.9999万,表明触发器正常工作

–至此,实验结束–


问题及解决方案

1.初次进行事务日志备份时系统显示‘当恢复模型为 simple 时,不允许使用backup log 语句’

解决:恢复模式选择完整即可

2.还原时系统提示无法获得对数据库的独占访问权

解决:选择状态中的限制访问,将multi_user (多用户)换成 single_user(单用户)


文章作者: autumnwt
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 autumnwt !
  目录