七.数据完整性
1.概念:数据一致性和准确性。
分类:域完整性、实体完整性、引用完整性。
解析:域完整性也叫列完整性是指一个数据集对某个列是否有效和确定是否允许为空值。实体完整性也叫行完整性 要求所有的行都有一个唯一的标示符。引用完整性保证主键和外键之间的关系总是得到维护。
实现:A声明数据完整性和B过程数据完整性。 A实现包括各种约束、缺省和规则。B实现方法包括触发器和存储过程等。
2.约束和完整性之间的关系:
完整性类型 | 约束类型 | 描述 |
域完整性 | Default | 在使用insert语句插入数据时,如果某个列的值没有给定,则将赋予默认值 |
Check | 对某一列值进行检查 | |
实体完整性 | 主键 | 能够唯一锁定一行记录的标示符,该列不能为空。 |
Unique | 防止出现冗余值,并且确保创建索引,提高性能,允许为空。 | |
引用完整性 | 外键 | 将一个表中的主键拿过来作为该表的列,那么这一列就是外键。 |
3.管理约束:default、check、主键约束、unique、外键约束
Default:
1)create table 语句的列的属性中 create table lin (name varchar(50),age int, gender char(2) default ‘男’)
2)alert table 语句中定义default约束: alter table lin add constraint 约束名称 default ‘男’ for gender
Check:
1)create table lin (name varchar(50),age int, gender char(2) default ‘男’ check (gender=’女’ or gender=’男’))
2)alert table 语句中定义default约束: alter table lin add constraint 约束名称 check(gender=’女’ or gender=’男’)
主键约束语法:
列级约束:①constraint constraint_name primary key
②primary key
表级约束:③constraint constraint_name primary key(column_list)
④primary key(column_list)
例如:1)create table lin (id int primary key, name varchar(50),age int, gender char(2) default ‘男’ check (gender=’女’ or gender=’男’))
2)create table lin (id int, name varchar(50), primary key(id,name),age int, gender char(2) default ‘男’ check (gender=’女’ or gender=’男’))
Unique约束:
语法:①constraint constraint_name unique ②unique ③constraint constraint_name unique(column_list)④unique(column_list)
外键约束:
1)在create table 语句中定义外键约束:create table A (id int primary key,…) create table B (id int primary key, aid int foreign key references A(id))
2)在alter table 语句中定义外键约束:create table A (id int primary key,…) create table B (id int primary key, aid int not null)
Alter table B add constraint 约束名称 foreign key(id) references A(id) on delete cascade
3)删除约束:alert table B drop constraint 约束名称
4.禁止约束: 就是不让约束对某个列生效。
比如:Alter table with nocheck B add constraint 约束名称 check(gender=’女’ or gender=’男’)不进行性别检查。
八.视图
概念:从一个或几个基本表导出的表。数据库中只存放视图的定义,而不存储视图对应的数据。视图是一种逻辑对象,是虚拟表。除非是索引视图,否则视图不占物理存储空间。
使用视图优点:1)集中用户使用的数据2)掩码数据库的复杂性:视图把数据库设计的复杂性与用户的使用方式屏蔽开了。为开发人员提供了一种数据库的设计而不影响用户使用的能力。3)简化用户权限的管理4)方便重新组织数据为其他应用程序提供输出数据集合。
1.创建视图 create view view_name[with encryption] as select_statement
如果希望加密视图定义文本,可以使用with encryption子句。
2.修改视图注意:
1)不能影响两个或两个以上的基表。2)某些列不能修改。3)如果影响到表中那些没有默认值的列,就可能引起错误。4)如果定义了with check option选项,那么系统验证所修改的数据。With check option 选项强制对视图所有修改语句必须满足定义视图所用的select语句的标准。
九.存储过程、触发器和函数
先看概念,再看实例!
1.存储过程:是一个可以重用的代码模块,可以高效的完成指定的操作。
优点:1)在服务器上已注册。2)安全性高防止sql嵌入式攻击3)可以模块化设计提高设计效率4)存储过程是一组命名代码,允许延迟绑定。5)减少网络通信流量。
类型:用户自定义、扩展存储过程、系统存储过程。
语法:create procedure procedure_name parameter_name data_type,…
[With procedure_option] as sql_statement
创建:create procedure pro_lin as select * from lin;
执行:execute/exec 存储过程名称。
接收结果: output
修改:alter procedure语句。
删除:drop procedure语句。
执行过程(第一次):语法分析阶段、解析阶段、编译阶段、执行阶段。
查看存储过程信息:sp_helptext、 objectdefinition元数据函数。
隐藏定义文本:with encryption
2.触发器:
概念:事件-条件-动作规则。当特定的系统事件对一个表的增删改查操作发生时,对规则的条件进行检查,如果条件成立则执行规则中的动作,否则不执行。
分类:DML触发器和DDL触发器。DML触发器分为:INSERT类型、UPDATE类型、DELETE类型。DDL触发器分为(事件类型):CREATE、ALTER、DROP、GRANT、DENY、REVOKE。
创建语法:DML触发器 create trigger trigger_name on table_name_or_view_name [with encryption] {for|after|instead of}{[delete],[insert],[update]} as sql_statement
DDL触发器 create trigger trigger_name on {all servler| database}[with encryption] {for|after}{事件类型} as sql_statement
DML触发器工作原理(拣重点说): 当INSERT触发器触发时,新的纪录增加到触发器表中和inserted表中。当DELETE触发器触发时,被删除的纪录放在一个特殊的deleted表中。Deleted表是一个逻辑表,用来保存已经从表中删除的纪录。当update触发器触发时,表中原来的纪录移动到deleted表中,修改过的纪录插入到inserted表中。
3.函数
分类:标量函数、内联表值函数、多语句表值函数、
创建:标量函数create function function_name(@parametername_list) as begin Function_body return 返回的语句 end
内联表值函数 create function function_name(@parametername_list) return TABLE as return (查询的语句 )
多语句表值函数 create function function_name (@parametername_list)
Returns 临时变量 table (表的定义) as begin functin_body return end
4.函数练习实例:
--创建mydb数据库,并创建 学生表(学号、姓名、性别、年龄、专业)、课程表(课程编号、课程名称、先行课号、学分)和选课表(学号、课程号、成绩)
create database mydb
go
use mydb
go
CREATE TABLE Student
(
Sno CHAR(9),
Sname CHAR(20),
Sgender CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
)
insert into Student values('200215121','李勇','男',20,'CS')
insert into Student values('200215122','刘晨','女',19,'CS')
insert into Student values('200215123','王敏','女',18,'MA')
insert into Student values('200215125','张立','男',19,'IS')
CREATE TABLE Course
(
Cno CHAR(4),
Cname CHAR(40),
Cpno CHAR(4),
Ccredit SMALLINT
)
insert into Course values('1','数据库','5',4)
insert into Course values('2','数学',NULL,2)
insert into Course values('3','信息系统','1',4)
insert into Course values('4','操作系统','6',3)
insert into Course values('5','数据结构','7',4)
insert into Course values('6','数据处理',NULL,2)
insert into Course values('7','PASCAL语言','6',4)
CREATE TABLE SC
(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT
)
insert into SC values('200215121','1',92)
insert into SC values('200215121','2',85)
insert into SC values('200215121','3',88)
insert into SC values('200215122','2',90)
insert into SC values('200215123','3',80)
--1.创建标量函数,使用该函数。当用户输入课程名称时,返回这门课程的最低分
create function retGrade(@courceName varchar)
returns int
begin
end
select * from sc;
select * from course;
--2.创建内联表值函数,当用户输入学分,返回所有学分为该学分的课程的信息
create function kc (@xf smallint)
returns table
as
return(select * from course where ccredit=@xf)
select * from kc(4);
select * from student;
--3.创建多语句表值函数,用户输入专业名称时,返回所有该专业同学的信息
create function stu(@zy char(20))
returns @k table(sno char(20),sname char(20))
as
begin
insert @k
select sno,sname from student where sdept=@zy
return
end
select * from stu('cs');
十.备份和还原
http://os.51cto.com/art/201305/392742.htm详解SQL Server 2008数据备份与还原
1.三种数据库恢复模式:完整恢复模式、大容量日志记录模式、简单恢复模式。
2.四种备份方法:完全数据库备份、增量数据库备份、事务日志备份、数据库文件或文件组备份。
3.还原操作:restore database语句.
十一.事务
1.概念:用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
2.特性:ACID即原子性(atomicity)、一致性(consistency)、隔离性(Isolation)、持续性(Durability)。
原子性:事务是数据库的逻辑单元,事务中包括的诸多操作要么全做,要么不全做。
一致性:当事务完成时,所有的数据都必须是一致的状态。
隔离性:一个事务的执行不会被其他的事务干扰。
持续性:一个事务一旦提交,他对数据库中数据的改变就是永久的。
3.事务的工作原理:涉及三点:事务日志、检查点机制、检查点周期性检查事务日志。
4.管理事务:begin transaction、begin distributed transaction、commit transaction、rollback transaction、save transaction、set implicit_transaction
一个使用实例:
use A
create table emp(
eid int,
ename varchar(50)
)
go
use A
begin transaction
insert into emp values(1,'hello')
save transaction a
insert into emp values(2,'hei')
save transaction b
insert into emp values(3,'hehe')
rollback transaction b
insert into emp values(4,'haha')
rollback transaction a
commit transaction
select * from emp;
go
5.使用锁
锁是防止其他事务访问指定资源的手段,也是实现并发控制的方法。
1).三种错误现象:脏读、不可重复读、幻读。
脏读:一个事务读到的数据正是另一个事务update更新的数据。
不可重复读:在一个事务内,多次读到同一个数据却得到不同的结果。
幻读:一个事务读到的数据正是另一个事务整改插入insert的数据。
2).封锁:实现并发控制的一个重要技术。
分类:排它锁又称写锁。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能在对A加任何其他类型的锁,直到T释放A上的锁为止。 共享锁又叫读锁。若事务T对数据对象A加上S锁,则只允许T读取但不能修改A,其他事务只能在对A加S锁,不能加X锁,直到T释放A上的S锁为止。
3).一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。二级封锁协议:在一级封锁协议基础上增加事务T读取数据R之前必须先对起加S锁,读完后即可释放S锁。三级封锁协议:在一级封锁协议基础上增加事务T读取数据R之前必须先对起加S锁,直到事务结束才释放S锁。
4.活锁与死锁
活锁:一个事务T是有可能被执行的,但它却处于可能等待状态。(就是要死不死的)
死锁:你等待我的资源,我也在等待你的资源,我们两个都很强势,不松口,就形成了僵持局面,不能结束,于是形成死锁。
解除死锁:超时法:超过了规定的等待时间,就认为发生了死锁,系统就会选择一个代价较小的事务,将其撤销,释放此事务持有的所有锁。等待图法:
5.并发调度的可串行性
概念:多个事务的并发执行时正确的,当且仅当其结果与按某一次序串行地执行这些事务时的结果相同。
6.两段锁的协议:所有事务必须分两个阶段对数据项加锁和解锁。
7.五种事务隔离等级:①read uncommitted会发生脏读②read committed可能产生不可重复读和幻读数据 ③repeatable read 可能发生幻读④snapshot指定任何读取数据都将是已经存在的数据⑤ serializable等级最高,可以自己设置等待访问时间。
十二.自动化管理任务
- 自动完成任务:一类是执行正常调度的任务;二类识别和回应可能遇到的问题的任务。这些任务是依靠自动化组件完成的。
- 自动化组件包括:Windows EventLog、MSSQLServer、SQLServer代理。
- 警报:用来回应sqlserver系统发生的事件。警报由事件触发,触发的结果可以是执行作业,也可以是同志操作员。
图1 作业、警报、事件之间的关系
- 定义作业的用户不一定是作业的所有者。注意这里是所有者是login账户,不是user账户。
2.警报的执行过程:
终于总结完了。。。没有失信于昨天。另外有需要的自己拿着用!