一、数据库完整性数据库的安全保护:
数据库完整性是指数据库中数据的正确性和相容性。 完整性约束的作用:防止数据库中存在不符合语义的数据。 完整性约束条件的作用对象
完整性约束条件是完整性控制机制的核心 定义与实现完整性约束:实体完整性 、参照完整性、 用户定义的完整性 **************************实体完整性************************** 实体完整性 :在MySQL中,实体完整性是通过主键约束和候选键约束实现的。 主键列必须遵守的规则
主键约束与候选键约束的区别
***********************参照完整性******************************* 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语句更新与列或表有关的各种约束。
二、触发器什么是触发器:是用户定义在关系表上的一类由事件驱动的数据对象, 也是一种保证数据完整性的方法。 *************************创建触发器****************************** 使用CREATE TRIGGER语句创建触发器 CREATE TRIGGER trigger_name trigger_time trigger_event ON 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
例如: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’]
例如:在MySQL服务器中添加两个新的用户,其用户名分别为zhangsan 和lisi,他们的主机名均为localhost,用户zhangsan的口令为123,用户 lisi的口令为对明文456使用PASSWORD()函数加密返回的散列值。 CREATE USER ‘zhangsan’@’localhost’ IDENTIFIED BY ‘123’, -> ‘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语句为用户授权 GRANT priv_type [(column_list)] [,priv_type [(column_list)]] … ON [object_type] priv_level TO user_specification [,user_specification] … [WITH GRANT OPTION]
例如:授予用户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 BY ‘123’ -> WITH GRANT OPTION; 使用REVOKE语句撤销用户权限 REVOKE priv_type [(column_list)] [,priv_type [(column_list)]] … ON [object_type] priv_level FROM user [,user] … 回收系统中已存在用户zhou在数据库mysql_test的表customers 上的SELECT权限 REVOKE SELECT -> ON mysql_test.customers -> FROM ‘zhou’@’localhost’;
四、事务与并发控制所谓事务是用户定义的一个数据操作序列,这些操作可作为一个完整的工 作单元,要么全部执行,要么全部不执行,是一个不可分割的工作单位。 事务中的操作一般是对数据的更新操作,包括增、删、改。
以BEGIN TRANSACTION语句开始 以 COMMIT 语句或 ROLLBACK语句结束 事务的特征(ACID):
例题:依据事务的ACID特征,分析并编写银行数据库系统中的转账事务T:从账 户A转账S金额资金到账户B BEGIN TRANSACTION read(A); A=A-S; write(A); If(A<0)ROLLBACK; else read(B); B=B+S write(B); COMMIT;} 并发操作问题
封锁是最常用的并发控制技术 基本思想:需要时,事务通过向系统请 求对它所希望的数据对象加锁,以确保 它不被非预期改变 锁 :一个锁实质上就是允许或阻止一个事务对一个数据对象的存取特权。 基本的封锁类型:
封锁的工作原理:
封锁的粒度
封锁的级别又称为一致性级别或隔离度
死锁和活锁
可串行性
两段封锁法
五、备份与恢复数据丢失的途径: 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 ‘?’;
|
|