数据库系统原理(第6章:数据库安全与保护)

一、数据库完整性

数据库完整性是指数据库中数据的正确性和相容性。

完整性约束条件的作用对象

  • 列级约束: 包括对列的类型、取值范围、精度等的约束
  • 元组约束: 指元组中各个字段之间的相互约束
  • 表级约束: 指若干元组、关系之间的联系的约束

定义与实现完整性约束:实体完整性 、参照完整性、 用户定义的完整性

**************************实体完整性**************************

实体完整性 :在MySQL中,实体完整性是通过主键约束和候选键约束实现的。

主键列必须遵守的规则

  • 每一个表只能定义一个主键
  • 主键的值(键值)必须能够唯一标志表中的每一行记录,且不能为NULL
  • 复合主键不能包含不必要的多余列
  • 一个列名在复合主键的列表中只能出现一次

 

 

主键约束与候选键约束的区别 

  • 主键约束       一个表只能创建 一个主键     关键字 PRIMARY KEY
  • 候选键约束   可以定义 若干个候选键     关键字 UNIQUE

***********************参照完整性*******************************

REFERENCES tbl_name(index_col_name,…)[ON DELETE reference_option][ON UPDATE reference_option]

tbl_name:指定外键所参照的表名

index_col_name:指定被参照的列名

ON DELETE:指定参照动作相关的SQL语句

reference_option:指定参照完整性约束的实现策略 (RESTRICT-限制策略 | CASCADE-级联策略 | SET NULL-置空策略 | NO ACTION-不采取实施策略)

 

 

 

**********************用户定义的完整性****************************

非空约束:NOT NULL

CHECK 约束:CHECK(expr)

命名完整性约束:CONSTRAINT [symbol]    symbol:指定的约束名字

只能给基于表的完整性约束指定名字,无法给基于列的完整性约束指定名字

命名完整性约束的方法是在各种完整性约束的定义说明之前加上关键字( CONSTRAINT )和该约束的名字

更新完整性约束

使用ALTER TABLE语句更新与列或表有关的各种约束。

  • 1、完整性约束不能直接被修改。(先删除,再增加)
  • 2、使用ALTER TABLE语句,可以独立地删除完整性约束,而不会删除表 本身。(DROP TABLE语句删除一个表,则表中所有的完整性约束都会被 自动删除)

 

二、触发器

什么是触发器:是用户定义在关系表上的一类由事件驱动的数据对象, 也是一种保证数据完整性的方法。

*************************创建触发器******************************

使用CREATE TRIGGER语句创建触发器

CREATE TRIGGER trigger_name trigger_time trigger_eventON tbl_name FOR EACH ROW trigger_body

trigger_name:指定触发器的名称

trigger_time:指定触发器被触发的时刻 

trigger_event:指定触发器的触发事件

tbl_name:指定与触发器相关联的表名

FOR EACH ROW :指定对于受触发事件影响的每一 行都要激活触发器的动作

trigger_body:指定触发器动作主体

例如:在数据库mysql_test的表customers中创建一个触发器 customers_insert_trigger,用于每次向表customers插入一行数据时, 将用户变量str的值设置为one customer added!

 CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT-> ON mysql_test.customers FOR EACH ROW SET @str=‘one customer added!’

使用DROP语句删除触发器

语法:DROP TRIGGER [IF EXISTS][schema_name.]trigger_name

  • IF EXISTS:用于避免在没有触发器的 情况下删除触发器
  • schema_name:指定触发器所在的数据库的名称
  • trigger_name:指定要删除的触发器名称

例如:DROP TRIGGER IF EXISTS mysql_test.customers_insert_trigger;

使用触发器

INSERT触发器   DELETE触发器   UPDATE触发器

*******************INSERT触发器***********************

在INSERT触发器代码内,可引用一个名为NEW(不区分大小写)的虚拟 表,来访问被插入的行。 在BEFORE INSERT触发器中,NEW中的值可以被更新

例如:在数据库mysql_test的表customers中重新创建触发器 customers_insert_trigger,用于每次向表customers插入一行数据时, 将用户变量str的值设置为新插入客户的id号。

CREATE TRIGGER mysql_test.customers_insert_trigger AFTER INSERT-> ON mysql_test.customers FOR EACH ROW SET @str=NEW.cust_id;

********************DELETE触发器*************************

在DELETE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟 表,来访问被删除的行。 OLD中的值全部是只读的,不能被更新。

*******************UPDATE触发器***************************

在UPDATE触发器代码内,可引用一个名为OLD(不区分大小写)的虚拟 表,来访问UPDATE语句执行前的值,也可以引用一个名为NEW(不区 分大小写)的虚拟表来访问更新后的值

例如:在数据库mysql_test的表customers中创建一个触发器 customers_update_trigger,用于每次更新表customers时,将该表中cust_address列 的值设置为cust_contact列的值。

CREATE TRIGGER mysql_test.customers_update_trigger BEFORE UPDATE-> ON mysql_test.customers FOR EACH ROW-> SET NEW.cust_address=OLD.cust_contact;

 

三、安全性与访问控制

数据库的安全性是指保护数据库以防止不合法的使用而造成数据泄露、更 改或破坏,所以安全性对于任何一个DBMS来说都是至关重要的。

安全性与访问控制:身份验证 、数据库用户权 限确认

使用CREATE USER语句创建MySQL账户

语法:CREATE USER user   [IDENTIFIED BY [PASSWORD]’password’]

  • user格式:指定创建用户账号 格式:’user_name’@’host name’
  • IDENTIFIED BY:可选项,指定用户账号对应的口令
  • PASSWORD:可选项,指定散列口令

例如:在MySQL服务器中添加两个新的用户,其用户名分别为zhangsan 和lisi,他们的主机名均为localhost,用户zhangsan的口令为123,用户 lisi的口令为对明文456使用PASSWORD()函数加密返回的散列值。

CREATE USER ‘zhangsan’@’localhost’ IDENTIFIED BY123’,-> ‘lisi’@’localhost’ IDENTIFIED BY PASSWORD->*531E182E272080AB0740FE2F2D689DBE0146E04’;

使用DROP USER语句删除用户账号

语法:DROP USER user [,user]…

例如:DROP USER lisi@localhost

使用RENAME USER语句修改用户账号

 

 

 例如:RENAME USER ‘zhangsan’@’localhost’ TO ‘wangwu’@’localhost’;

使用SET PASSWORD语句修改用户登录口令

SET PASSWORD [FOR user]={PASSWORD(‘new_password’)|’encrypted password’}

例如:SET PASSWORD FOR 'username'@'localhost' = PASSWORD('pass');

使用GRANT语句为用户授权

GRANTpriv_type [(column_list)][,priv_type [(column_list)]] …ON [object_type] priv_levelTO user_specification [,user_specification][WITH GRANT OPTION]
  • priv_type:用于指定权限的名称
  • column_list:用于指定权限要授予给表中哪些具体的列
  • object_type:用于指定权限授予的对象类型
  • priv_level:用于指定权限授予的级别
  • TO:用于设定用户的口令,以及指定 被授予权限的用户user
  • user_specification:user[IDENTIFIED BY [PASSWORD]’password’]
  • WITH :可选项,用于实现权限的转移或限制

例如:授予用户zhangsan在数据库mysql_test的表customers上拥有对 列cust_id和列cust_name的SELECT权限。

 GRANT SELECT(cust_id,cust_name)-> ON mysql_test.customers-> TO’zhangsan’@’localhost’;

授予当前系统中一个不存在的用户liming和用户huang,要求创建 这两个用户,并设置对应的系统登录口令,同时授予他们在数据库 mysql_test的表customers上拥有SELECT和UPDATE的权限。

 GRANT SELECT,UPDATE
-> ON mysql_test.customers
-> TO 'liming'@'localhost' IDENTIFIED BY '123',
-> 'huang'@'localhost' IDENTIFIED BY '789';

授予系统中已存在的wangwu可以在数据库mysql_test中执行所有 数据库操作的权限

 GRANT ALL-> ON mysql_test.*-> TO ‘wangwu’@’localhost’;

授予系统中已存在的wangwu拥有创建用户的权限

GRANT CREATE USER-> ON *.*-> TO ‘wangwu’@’localhost’;

权限的转移

授予当前系统中不存在的用户 zhou 在数据库mysql_test的表customers上 拥有SELECT和UPDATE的权限,并允许其可以将自身的这个权限授予给其他 用户

 GRANT SELECT,UPDATE-> ON mysql_test.customers-> TO ‘zhou’@’localhost’ IDENTIFIED BY123-> WITH GRANT OPTION;

使用REVOKE语句撤销用户权限

REVOKEpriv_type [(column_list)][,priv_type [(column_list)]] …ON [object_type] priv_levelFROM user [,user]

回收系统中已存在用户zhou在数据库mysql_test的表customers 上的SELECT权限

 REVOKE SELECT-> ON mysql_test.customers-> FROM ‘zhou’@’localhost’;

 

四、事务与并发控制

所谓事务是用户定义的一个数据操作序列,这些操作可作为一个完整的工 作单元,要么全部执行,要么全部不执行,是一个不可分割的工作单位。 事务中的操作一般是对数据的更新操作,包括增、删、改。

 

 以BEGIN TRANSACTION语句开始 以 COMMIT 语句或  ROLLBACK语句结束

事务的特征(ACID):

  • 原子性 Atomicity:事务是不可分割的最小工作单位
  • 一致性 Consistenc y:
  • 隔离性 Isolation:
  • 持续性(永久性) Durability

例题:依据事务的ACID特征,分析并编写银行数据库系统中的转账事务T:从账 户A转账S金额资金到账户B

BEGIN TRANSACTION
read(A);
A=A-S;
write(A);
If(A<0)ROLLBACK;
else read(B);B=B+Swrite(B);COMMIT;}

并发操作问题

  • 丢失更新 • 事务T1,T2同时读入同一数据并加以修改,T2的提交结果会破坏T1提交的结果
  • 不可重复读 • 事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果
  • 读“脏”数据 • 事务T1修改数据后撤销,使得T2读取的数据与数据库中不一致

封锁是最常用的并发控制技术 基本思想:需要时,事务通过向系统请 求对它所希望的数据对象加锁,以确保 它不被非预期改变

锁 :一个锁实质上就是允许或阻止一个事务对一个数据对象的存取特权。

基本的封锁类型:

  • 1、排他锁(X锁),用于写操作
  • 2、共享锁(S锁),用于读操作

封锁的工作原理:

  • 1.若事务T对数据D加了X锁,则所有别的事务对数据D的锁请求都必须等 待直到事务T释放锁。
  • 2.若事务T对数据D加了S锁,则别的事务还可对数据D请求S锁,而对数据 D的X锁请求必须等待直到事务T释放锁。
  • 3.事务执行数据库操作时都要先请求相应的锁,即对读请求S锁,对更新 请求X锁。这个过程一般是由DBMS在执行操作时自动隐含地进行。
  • 4.事务一直占有获得的锁直到结束时释放

封锁的粒度

  • 我们通常以粒度来描述封锁的数据单元的大小
  • DBMS可以决定不同粒度的锁 粒度越细,并发性就越大,但软件复杂性和系统开销也就越大。

封锁的级别又称为一致性级别或隔离度

  • 0级封锁:不重写其他非0级封锁事务的未提交的更新数据。(实用价值低)
  • 1级封锁:不允许重写未提交的更新数据。防止了丢失更新的发生
  • 2级封锁:既不重写也不读未提交的更新数据(防止了读脏数据)
  • 3级封锁:不读未提交的更新数据,不写任何(包括读操作)未提交数据。

死锁和活锁

  • 活锁——先来先服务
  • 死锁——预防 (1)一次性锁请求 (2)锁请求排序 (3)序列化处理 (4)资源剥夺

可串行性

  • 一组事务的一个调度就是它们的基本操作的一种排序。
  • 在数据库系统中,可串行性就是并发执行的正确性准则,即当且当一组事务 的并发执行调度是可串行化的,才认为它们是正确的。

两段封锁法

  • 1.发展(Growing)或加锁阶段
  • 2.收缩(Shrinking)或释放锁阶段

五、备份与恢复 

数据丢失的途径:

1.计算机硬件故障

2.计算机软件故障

3.病毒

4.人为误操作

5.自然灾害

6.盗窃

数据库备份与恢复的概念

  • 数据备份是指通过导出数据或者复制表文件的方式来制作数据库的复本;
  • 数据库恢复则是当数据库出现故障或遭到破坏时,将备份的数据库加载到 系统,从而使数据库从错误状态恢复到备份时的正确状态。 数据库的恢复是以备份为基础的,它是与备份相对应的系统维护和管理操 作。

使用SELECT INTO…OUTFILE语句备份数据

SELECT *INTO OUTFILE ‘file_name’ export_options| INTO DUMPFILE ‘file_name

file_name:指定数据备份文件的名称

 

使用LOAD DATA…INFILE语句恢复数据

 

简述恢复数据的方法?

备份数据库mysql_test中表customers的全部数据到c盘的BACKUP目录 下一个名为backupfile.txt的文件中,要求字段值如果是字符则用双引号 标注,字段值之间用逗号隔开,每行以问号为结束标志。然后,将备份后 的数据导入到一个和customers表结构相同的空表customers_copy中。

SELECT * FROM mysql_test.customers
INTO OUTFILE ‘C:/BACKUP/backupfile.txt’
FIELDS TERMINATED BY ’,’
OPTIONALLY ENCLOSED BY “”
LINES TERMINATED BY ‘?’;

 

转载于:https://www.cnblogs.com/jalja/p/11614085.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.net core WebApi 使用Swagger生成API文档

关于 Swagger Swagger能成为最受欢迎的REST APIs文档生成工具之一&#xff0c;有以下几个原因&#xff1a; Swagger 可以生成一个具有互动性的API控制台&#xff0c;开发者可以用来快速学习和尝试API。Swagger 可以生成客户端SDK代码用于各种不同的平台上的实现。Swagger 文件可…

Git — 初体验

准备工作 版本管理软件 作用 记录代码的版本实现多人协作 分类 集中式&#xff0c;典型代表 SVN分布式&#xff0c;典型代表 Git 注册远程仓库账号 远程仓库相当于中央服务器我们需要在github上或码云上注册一个账号&#xff0c;用于创建远程仓库使用注册的时候&#xff0…

iOS CoreTelephony框架介绍与使用案列

昨晚看一篇文章时看到了私有API这个词&#xff0c;貌似开发者对私有API的使用很反感于是果断百度谷歌&#xff0c;以下是Stackoverflow中关于Private Frameworks的一个解释&#xff1a; Private frameworks are frameworks which you are not allowed to use. They are not exp…

JS数组的迭代器方法

迭代器forEachevery一、迭代器方法 迭代器方法&#xff0c; 这些方法对数组中的每一个元素应用一个函数&#xff0c;可以返回一个值&#xff0c;一组值或一个新数组。 不生成新数组的迭代器方法 1.forEach() forEach()输出 forEach输出结果2.every() 该方法按接受一个返回值为布…

Git 笔记

三个区域 下面三个区域&#xff0c;是Git虚拟的区域&#xff0c;看不到&#xff0c;摸不着。 工作区 工作区&#xff0c;指的是使用Git管理后的文件&#xff0c;这些文件显示在磁盘上&#xff0c;供我们使用或修改的区域。所以&#xff0c;粗略的说&#xff0c;项目文件夹就是…

git -- 练习的笔记

gitgitee.com:my_exercises/my_exercises.githttps://gitee.com/my_exercises/my_exercises/invite_link?invite3ab56c724a0aed34ae2bd193ce87e741e67fe05ee029cc01b7993663152babc57d76203fdafbbb42e766b0d826817bc91.在任意位置右键打开 2.初始化设置 3.添加远程仓库地址 4.…

Swift傻傻分不清楚系列(十二) 属性

本页包含内容&#xff1a; 存储属性&#xff08;Stored Properties&#xff09;计算属性&#xff08;Computed Properties&#xff09;属性观察器&#xff08;Property Observers&#xff09;全局变量和局部变量&#xff08;Global and Local Variables&#xff09;类型属性&a…

GIT — 使用回顾

回顾Git的使用 记录每次的变更 工作区 --> 暂存区 git add . / git add 文件 文件夹 .... 工作区 --> 暂存区/本地仓库 前提条件&#xff1a;文件曾经被添加到暂存区或提交到仓库git commit -a -m 提交说明 暂存区 --> 本地仓库 git commit -m 提交说明 / git commi…

Ajax — 大事件项目(第一天)

应用的前端技术 Ajax (重要) — jQuery方式接口请求Layui 框架使用HTML CSS JS 项目说明和演示 线上 DEMO 项目地址&#xff1a;http://www.liulongbin.top:8086/项目的 API 接口地址&#xff1a; https://www.showdoc.cc/escook?page_id3707158761215217 项目请求根路径…

iOS开发实用技巧—Objective-C中的各种遍历(迭代)方式

说明&#xff1a; 1&#xff09;该文简短介绍在iOS开发中遍历字典、数组和集合的几种常见方式。 2&#xff09;该文对应的代码可以在下面的地址获得&#xff1a;https://github.com/HanGangAndHanMeimei/Code 一、使用for循环 要遍历字典、数组或者是集合&#xff0c;for循环是…

Ajax — 大事件项目(第二天)

大事件-02 fix一个bug 原因&#xff1a; 开始做注册的时候&#xff0c;页面中只有一个 namepassword的input&#xff0c;所以 $(‘input[name“password”]’) 可以准确的找到元素后来做登录的时候&#xff0c;页面中多了一个namepassword的input&#xff0c;所以$(‘input[…

OpenCV自带dnn的Example研究(3)— object_detection

这个博客系列&#xff0c;简单来说&#xff0c;今天我们就是要研究https://docs.opencv.org/master/examples.html下的6个文件&#xff0c;看看在最新的OpenCV中&#xff0c;它们是如何发挥作用的。在配置使用的过程中&#xff0c;需要注意使用较高版本的VS避免编译器兼容问题&…

Ajax — 大事件项目(第三天)

大事件-03 用户信息 表单验证 html中&#xff0c;直接使用layui提供的内置验证规则 email <input type"text" name"email" required lay-verify"required|email" placeholder"请输入邮箱" autocomplete"off" class&q…

iOS运行时-使用Runtime向Category中添加属性以及运行时介绍

前言 了解OC的都应该知道&#xff0c;在一般情况下&#xff0c;我们是不能向Category中添加属性的&#xff0c;只能添加方法&#xff0c;但有些情况向&#xff0c;我们确实需要向Category中添加属性&#xff0c;而且很多系统的API也有一些在Category添加属性的情况&#xff0c;…

Git图形化管理工具

Git图形化管理工具 注意&#xff1a;必须在创建的仓库中进行右键打开 复制这段内容后打开百度网盘App&#xff0c;操作更方便哦。 链接&#xff1a;https://pan.baidu.com/s/1eXIk01LXSmzmXvYfw3MnEA 提取码&#xff1a;J166 --来自百度网盘超级会员V5的分享 分类 sourceTr…

TCP/IP(一):数据链路层

背景 这一系列的文章主要是为一般的、非专业开发岗位(如移动端)的工程师准备&#xff0c;一方面可以对网络的基本知识有基本的了解&#xff0c;另一方面不至于面试中被问到相关问题时束手无策。知识以 TCP/IP 协议簇为主&#xff0c;也会有应用层和数据链路层的简单介绍。 文…

Linux系统编程——线程(1)

目录 线程概要Linux内核线程实现原理线程的共享/不共享资源线程优缺点线程控制原语pthread_selfpthread_createpthread_exitpthread_joinpthread_cancel终止线程方式控制原语对比前情提要&#xff1a; Linux用户级线程和内核级线程区别 线程概要 Linux内核线程实现原理 类Unix系…

TCP/IP(二):IP协议

IP协议处于OSI参考模型的第三层——网络层&#xff0c;网络层的主要作用是实现终端节点间的通信。IP协议是网络层的一个重要协议&#xff0c;网络层中还有ARP(获取MAC地址)和ICMP协议(数据发送异常通知) 数据链路层的作用在于实现同一种数据链路下的包传递&#xff0c;而网络层…

Ajax — 大事件项目(第四天)

分类管理 添加分类 初步使用弹出层 给 “添加分类” 绑定一个单击事件单击事件中&#xff0c;使用 layer.open() 实现一个弹出层 type: 1, 弹层的类型是页面层title, “添加文字分类”content: ‘字符串&#xff0c;DOM’,area: [‘500px’, ‘250px’] // ---------------…

redis学习(四)

一、Redis 键(key) 1、Redis 键命令用于管理 redis 的键。 2、Redis 键命令的基本语法如下&#xff1a;redis 127.0.0.1:6379> COMMAND KEY_NAME 3、常用key命令 keys * 获取所有的keyselect 0 选择第一个库move myString 1 将当前的数据库key移动到某个…