sqlserver提高篇续集
七.数据完整性
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.警报的执行过程:
终于总结完了。。。没有失信于昨天。另外有需要的自己拿着用!
sqlserver提高篇续集的更多相关文章
- sqlserver提高篇
Microsoft SQL Server2008复习提高 一.Microsoft SQL Server 系统的体系结构 1.Microsoft SQL Server2008由4个主要的部分组成,即4个 ...
- 解剖SQLSERVER 第一篇 数据库恢复软件商的黑幕(有删减版)
解剖SQLSERVER 第一篇 数据库恢复软件商的黑幕(有删减版) 这一系列,我们一起来解剖SQLSERVER 在系列的第一篇文章里本人可能会得罪某些人,但是作为一位SQLSERVER MVP,在我 ...
- Java提高篇——对象克隆(复制)
假如说你想复制一个简单变量.很简单: int apples = 5; int pears = apples; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short, ...
- 解剖SQLSERVER 完结篇 关于Internals Viewer源代码
解剖SQLSERVER 完结篇 关于Internals Viewer源代码 大家可能都用过Internals Viewer这个软件 <查看SQLSERVER内部数据页面的小插件Internals ...
- 解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译)
解剖SQLSERVER 第九篇 OrcaMDF现在能通过系统DMVs显示元数据(译) http://improve.dk/orcamdf-now-exposes-metadata-through-s ...
- 解剖SQLSERVER 第二篇 对数据页面头进行逆向(译)
解剖SQLSERVER 第二篇 对数据页面头进行逆向(译) http://improve.dk/reverse-engineering-sql-server-page-headers/ 在开发Orc ...
- Java提高篇(三三)-----Map总结
在前面LZ详细介绍了HashMap.HashTable.TreeMap的实现方法,从数据结构.实现原理.源码分析三个方面进行阐述,对这个三个类应该有了比较清晰的了解,下面LZ就Map做一个简单的总结. ...
- Java提高篇(三二)-----List总结
前面LZ已经充分介绍了有关于List接口的大部分知识,如ArrayList.LinkedList.Vector.Stack,通过这几个知识点可以对List接口有了比较深的了解了.只有通过归纳总结的知识 ...
- Java提高篇(三一)-----Stack
在Java中Stack类表示后进先出(LIFO)的对象堆栈.栈是一种非常常见的数据结构,它采用典型的先进后出的操作方式完成的.每一个栈都包含一个栈顶,每次出栈是将栈顶的数据取出,如下: Stack通过 ...
随机推荐
- Coursera 机器学习笔记(一)
主要是第一二周内容 机器学习概要 机器学习是什么? 生活在信息时代的我们,其实时时刻刻都离不开机器学习算法.比如日常使用的搜索引擎就涉及到很多学习算法. Arthur Samuel 给出第一个定义.他 ...
- vue.js实现数据动态响应(Vue.set的应用)
在vue里面,我们操作最多的就是各种数据,在jquery里面,我们习惯通过下标定向找到数据,然后重新赋值 比如var a[0]=111;(希望上家公司原谅菜鸟的我写了不少这样的代码
- 【原创】源码角度分析Android的消息机制系列(三)——ThreadLocal的工作原理
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 先看Android源码(API24)中对ThreadLocal的定义: public class ThreadLocal<T> 即 ...
- HTML基本文件, CSS基础
HTML 一.HTML基本文件 [meta标签] 1.charset属性:单独使用.设置文档字符集编码格式. >>>写法:<meta charset ...
- VMware-VCSA-6.5安装过程
1.新建虚拟机 2.选择从OVF或OVA文件导入 3.给虚拟机命名,并选择OVF文件. 4.选择虚拟机的存储位置.这里没有配置共享存储宿,这里选择的宿主机的存储. 5.许可协议同意就OK了. 6.部署 ...
- python爬虫从入门到放弃前奏之学习方法
首谈方法 最近在整理爬虫系列的博客,但是当整理几篇之后,发现一个问题,不管学习任何内容,其实方法是最重要的,按照我之前写的博客内容,其实学起来还是很点枯燥不能解决传统学习过程中的几个问题: 这个是普通 ...
- java中volatile不能保证线程安全
今天打了打代码研究了一下java的volatile关键字到底能不能保证线程安全,经过实践,volatile是不能保证线程安全的,它只是保证了数据的可见性,不会再缓存,每个线程都是从主存中读到的数据,而 ...
- JAX-RS REST 服务结果的自动封装
如转发请注明: 原文luyiisme博客 当使用遵循 JAX-RS 标准的框架开发REST 服务时,我们倾向于定义个(含有JAX-RS)注解接口. 服务器端负责实现该接口,而客户端是该接口的代理进行远 ...
- “HK”的日常之ARP断网攻击
ARP断网攻击是什么?可以吃吗?如果可以吃它好吃吗? ARP断网攻击就是通过伪造IP地址和MAC地址实现ARP欺骗,能够在网络中产生大量的ARP通信量使网络阻塞,攻击者只要持续不断的发出伪造的ARP响 ...
- 12.引入依赖项目的时候,如果找不到jar
原因是bin没有生成,先clean依赖包,再clean原工程包,就可以了