Chapter 7 Integrity(完整性), Views(视图), Security(安全性), and Catalogs(目录)

from Database Design to Physical Form
CREATE TABLE
integrity constraints (完整性约束)
CREATE VIEW
Security
The GRANT & REVOKE statements
Catalogs
Schemas
Introduction
->The DBA(数据库管理员) must begin by creating the tables and constraints(约束) and loading the data. Impose(强加上) integrity constraints on the columns 。
->Then provide views(视图) of the data, virtually restructuring the physical tables into variant(不同的) table forms, to simplify access to data.
->Provide security(安全性), so that only authorized users are able to read or update certain confidential(机密的) data.
->The structure of the various tables, views, and other objects of a database are made available to the DBA through a set of system-defined tables, called system catalogs(系统目录).
Integrity(完整性)
->保证数据完整性(主要指数据的正确性与一致性)是数据库管理员的最重要任务之一。
->可以通过约束(Constraint)、规则(Rule)或者缺省值保证数据的完整性,也可以在应用程序层保证数据完整性(这是应用程序设计的问题),或通过触发器保证。
->数据完整性类型包括:实体完整性、参照完整性和用户定义完整性
->实体完整性(Entity Integrity) :现实世界的实体是可区分的,即它们具有某种唯一性标识。相应地,关系模型中主键应作为唯一性标识。因此实体完整性规则规定基本关系的所有主键(Primary Key)都不能取空值(NULL) 。
->参照完整性(Referential Integrity) :参照完整性维护表与表之间的相关性,通常用“主键(Primary Key)/外键(Foreign Key)”保证,其中Foreign Key可以取NULL值,或取其参照表中Primary Key或者候选键的取值。
->用户定义的完整性(User_defined Integrity ):针对某一具体数据的约束条件,由应用环境决定。例如:某个属性具有缺省值、某个属性必须取惟一值(UNIQUE)、某个非主属性不能取NULL值、某个属性的取值范围在0~100之间(CHECK)等等。
->数据完整性具体实现包括两类
->声明性数据完整性 :声明性数据完整性用约束(Constraint)、规则(Rule) 在数据库中提供保证,这是保证完整性的较好方法。它驻留在数据库内,编程简单,开销小,能更集中管理和保证数据的一致性
->过程性数据完整性 :过程性数据完整性用触发器和应用程序代码保证,通常较为复杂、开销较大,但可以执行更多的业务规则。 通常,过程性数据完整性是声明性数据完整性的补充


-》》》完整性再阐述
数据有着复杂的数据类型,用来满足不同的需求。实际应用中的数据也有着一定的取值范围,如年龄不小于0,性别只有男女等。而表之间的联系使相连的字段要保持一致和完整。但是,实际操作无法保证插入和删除的数据都符合要求,不符合要求的操作极可能会破坏数据的完整性,对数据库的可靠性和运行能力造成威胁。
因此存放数据集的数据库必须要对数据表和列有所限制和规范,为此SQLServer系统使用一系列的方法来维护数据完整性。
数据的完整性:数据的完整性是指数据库中数据的正确性和一致性,表内的数据不相矛盾,表间的数据不相矛盾,关联性不被破坏。
为此有了以下实施完整性的途径:
1. 对列数据的控制:数据验证约束、默认值约束、规则。
2. 对列的控制:主键约束、唯一性约束、标识列。
3. 对表之间、列之间关系的控制:外键约束、数据验证约束、触发器、存储过程。
这些途径可以按照类型分为:约束、规则、默认值、触发器、存储过程。
约束分为以下几点:
l 主键约束
主键:PRIMARY KEY,主关键字,用来限制列的数据具有唯一性且不为空,即这一字段的数据没有重复的数据值且不能有空值。每个表只能有一个主键,一般用来做标识。
l 外键约束
外键:FOREIGN KEY,外键用来在两个表的数据之间建立连接,它可以是一列或者多列。一个表可以有一个或者多个外键。外键对应的是参照完整性,一个表的外键可以为空值,若不为空值则每一个外键值必须等于另一个表中主键的某个值。
l 标识列
可以自动编号的列称为标识列或IDENTITY约束。IDENTITY约束就是为那些数值顺序递增的列准备的约束,自动完成数值的添加。每个表只能有一个标识列,标志数据不能由用户输入,用户只需要填写标志种子(标识列的第一个数据)和标志增量(依次增加的数),系统自动生成数据并填入表。标志种子和标志增量都是非零整数,位数小于等于10。默认两者均为1。
l 唯一性约束
又叫UNIQUE约束,在主键约束中也用到了唯一性,不同的是一个表中可以有多个这样的唯一性列,却只能有一个主键。这里的唯一性列可以为空但是只能有一行数据为空。适用于不是主键但却仍旧要求具有唯一性的字段。
l 非空约束
一个列是否允许有空值,就是这里的空和非空约束,即NULL与NOT NULL约束。NULL就是允许为空,NOT NULL就是不允许为空。NULL不同于0和“”,0和“”都表示为该行有数据,而NULL是没有数据。
l 数据验证约束
又称做CHECK约束,它通过给定条件(逻辑表达式)来检查输入数据是否符合要求,以此来维护数据完整性。
l 默认值约束
又称作DEFAULT约束。将常用的数据值性以为默认值可以节省用户输入的时间,在非空字段中定义默认值可以减少错误发生。在实际应用中,默认值还可以是结果能变的函数。
规则:
规则是独立的SQL Server对象,跟表和视图一样是数据库的组成部分。规则的作用和CHECK约束类似,用于完成对数据值的检验。它可以关联到多个表,在数据库中有邮局插入、修改时,验证新数据是否符合规则,是实现域完整性的方式之一。规则在定义时并没有定义它的检测对象,而是在创建后绑定到对象来检测数据。
创建规则
CREATE RULE 规则名
AS
条件表达式
在这里的条件表达式使用逻辑表达式,表达式中要有一个@开头的变量,代表用户的输入数据,可以看做是代替WHERE后面的列名。
规则在绑定之后才可以使用,规则的绑定需要时用系统存储过程sp_bindrule.
USE 数据库名
Sp_bindrule 规则名 表名.字段名
使用存储过程sp_help来查看规则。
规则的特点(与CHECK的不同)
1) 规则是SQL Server的对象而CHECK是一种约束,是表定义的一部分。
2) CHECK的优先级要高于规则。
3) 一个列只能使用一个规则却可以使用多个CHECK约束。
4) 规则可以应用于多个列,CHECK约束只针对它定义的列。
5) 规则创建一次可以使用多次而CHECK约束需要多次创建。
默认值:
CREATE DEFAULT 默认值名
AS 常亮表达式
与创建规则一样,默认值的定义不能包含列名,需要绑定到列或是其他数据库对象才能使用。一个列只能绑定一个默认值
Definition 7.1.2 Column Constraint
NOT NULL -If NOT NULL appears in a col_constr, then the DEFAULT clause cannot specify NULL;
CONSTRAINT-allows us to specify a name for each constraint other than NOT NULL, so that we can later drop the constraint with an ALTER Table statement.
UNIQUE- It can be specified even if NOT NULL is not, and the column is then constrained so that all non-null values in the table are unique, but multiple nulls can exist for this column.
PRIMARY KEY -A column with the PRIMARY KEY column constraint is implicitly defined to be NOT NULL and UNIQUE. The UNIQUE clause and PRIMARY KEY clause cannot both be used for a column, although the PRIMARY KEY clause and the NOT NULL clause can be used together.
CHECK
EXAMPLE



触发器
触发器的介绍
- 1
触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,当对一个表进行操作( insert,delete, update)时就会激活它执行,触发器经常用于加强数据的完整性约束和业务规则等。其实往简单了说,就是触发器就是一个开关,负责灯的亮与灭,你动了,它就亮了,就这个意思。
END
触发器的分类
- 1
DML( 数据操纵语言 Data Manipulation Language)触发器:是指触发器在数据库中发生DML事件时将启用。DML事件即指在表或视图中修改数据的insert、update、delete语句。
- 2
DDL(数据定义语言 Data Definition Language)触发器:是指当服务器或数据库中发生(DDL事件时将启用。DDL事件即指在表或索引中的create、alter、drop语句也。
- 3
登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。
END
DML触发器介绍
- 1
在SQL SERVER 2008中,DML触发器的实现使用两个逻辑表DELETED和INSERTED。这两个表是建立在数据库服务器的内存中,我们只有只读的权限。DELETED和INSERED表的结构和触发器所在的数据表的结构是一样的。当触发器执行完成后,它们也就会被自动删除:INSERED表用于存放你在操件insert、update、delete语句后,更新的记录。比如你插入一条数据,那么就会把这条记录插入到INSERTED表:DELETED表用于存放你在操作 insert、update、delete语句前,你创建触发器表中数据。
- 2
触发器可通过数据库中的相关表实现级联更改,可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列,例如触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作。触发器也可以根据数据修改前后的表状态,再行采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
- 3
与此同时,虽然触发器功能强大,轻松可靠地实现许多复杂的功能,为什么又要慎用?过多触发器会造成数据库及应用程序的维护困难,同时对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。
END
触发器步骤详解
- 1
首先,我们来尝试创建一个触发器,要求就是在AddTable这个表上创建一个Update触发器,语句为:
create trigger mytrigger on AddTable
for update
- 2
然后就是sql语句的部分了,主要是如果发生update以后,要求触发器触发一个什么操作。这里的意思就是如果出现update了,触发器就会触发输出:the table was updated!---By 小猪也无奈。

- 3
接下来我们来将AddTable表中的数据执行一个更改的操作:

- 4
执行后,我们会发现,触发器被触发,输出了我们设置好的文本:

- 5
那触发器创建以后呢,它就正式开始工作了,这时候我们需要更改触发器的话,只需要将开始的create创建变为alter,然后修改逻辑即可:

- 6
如果我们想查看某一个触发器的内容,直接运行:exec sp_helptext [触发器名]

- 7
如果我想查询当前数据库中有多少触发器,以方便我进行数据库维护,只需要运行: select * from sysobjects where xtype='TR'

- 8
我们如果需要关闭或者开启触发器的话,只需要运行:
disable trigger [触发器名] on database --禁用触发器
enable trigger [触发器名] on database --开启触发器

- 9
那触发器的功能虽大,但是一旦触发,恢复起来就比较麻烦了,那我们就需要对数据进行保护,这里就需要用到rollback数据回滚~

- 10
第九步的意思就是查询AddTable表,如果里面存在TableName=newTable的,数据就回滚,触发器中止,那我们再进行一下测试,对AddTable表进行更改,发现,触发update触发器之后,因为有数据保护,触发器中止:











































Chapter 7 Integrity(完整性), Views(视图), Security(安全性), and Catalogs(目录)的更多相关文章
- python web框架篇:views视图函数
Django请求的生命周期是怎样的? 简单地说,通过URL对应关系匹配 ->找到对应的函数(或者类)->返回字符串(或者读取Html之后返回渲染的字符串) 解剖起来如下: 1. 当用户在浏 ...
- django views视图函数返回值 return redirect httpresponse总结
django views视图函数返回值 return redirect render httpresponse总结
- Django之views视图函数
views视图函数属于MTV中逻辑处理的部分视图函数包含着两个对象,HttpRequest对象和HttpResponse对象 一.HttpRequest对象 HttpRequest对象在Django中 ...
- django views视图函数
Django views.py视图文件 一. 创建views.py文件,在工程文件夹根目录创建views.py视图文件,其实任意文件名都可以,使用views是为了遵循传统. 注:所有的views函数都 ...
- [.NET MVC进阶系列03] Views 视图基础
[注:此文对应Chapter 3:Views] 一.View的功能: 1.View用来呈现页面UI,通过Controller来指定View: 要注意的是,MVC和以前基于文件的Web应用不同,URL指 ...
- Chapter 2 User Authentication, Authorization, and Security(10):创建包含数据库
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39473895,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(9):防止登录名和用户查看元数据
原文出处:http://blog.csdn.net/dba_huangzj/article/details/39003679,专题目录:http://blog.csdn.net/dba_huangzj ...
- Chapter 2 User Authentication, Authorization, and Security(8):创建映射到登录名的数据库用户
原文出处:http://blog.csdn.net/dba_huangzj/article/details/38944121,专题目录:http://blog.csdn.net/dba_huangzj ...
- django views视图
视图函数简称视图,本质上是一个简单的python函数,它接受web请求并且返回web响应:响应的内容可以是HTML网页.重定向.404错误.XML文档或图像等任何东西,但是,无论视图本身是个什么处理逻 ...
随机推荐
- gerrit_bash_commands.sh
https://github.com/tomwys/gerrit-bash-commands gerrit_bash_commands.sh # Author: Tomasz Wysocki < ...
- web前端面试题(一)
1 选择题 1.1 默认情况下,使用P标记会形成什么效果() A.在文字P所在位置中加入8个空格 B.P后面的文字会变成粗体 C.开始新的一行 D.P后面的文字会变成斜体 答案: C 1.2 ...
- openstack-networking-neutron(三)---用户态和内核态的区别
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...
- jQuery:find()方法与children()方法的区别
1:children及find方法都用是用来获得element的子elements的,两者都不会返回 text node,就像大多数的jQuery方法一样. 2:children方法获得的仅仅是元素一 ...
- Unity3D笔记 愤怒的小鸟<三> 实现Play界面2
前言:在Play页面中给Play页面添加一个“开始游戏”和“退出游戏”按钮顺便再来一个背景音乐 添加按钮可以是GUI.Button(),也可以是GUILayout.Button():给图片添加按钮可以 ...
- C++ vs Python向量运算速度评测
本文的起源来自最近一个让我非常不爽的事. 我最近在改一个开源RNN工具包currennt(http://sourceforge.net/projects/currennt/),想用它实现RNNLM功能 ...
- javascript中top、clientTop、scrollTop、offsetTop的讲解(转载加总结)
scrollHeight: 获取对象的滚动高度. scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容的最左端之间的距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容的最 ...
- 从UE(用户体验)到道家誓学再到李小龙
公司大Boss经常会给我做技术培训,感觉他什么都知道,也挺喜欢听他的课. 本文记录可能比较天马行空,我的语文比较差,很难把自己想表达的说出来,为此我就是记录一样关键字,可能这样还会更好些 背景是讲用户 ...
- 《机器学习实战》中的splitDataSet函数
splitDataSet这个函数困扰了我好一阵子,为什么以某一特征值为标准进行划分数据集以后,变成了局部?例如,如果以第1个特征为0为标准进行划分,那么返回的结果集就是不含有此特征的结果集,如下图红框 ...
- POJ 2653 - Pick-up sticks - [枚举+判断线段相交]
题目链接:http://poj.org/problem?id=2653 Time Limit: 3000MS Memory Limit: 65536K Description Stan has n s ...