完整性和安全性.ppt

上传人:牧羊曲112 文档编号:6268965 上传时间:2023-10-12 格式:PPT 页数:136 大小:1.13MB
返回 下载 相关 举报
完整性和安全性.ppt_第1页
第1页 / 共136页
完整性和安全性.ppt_第2页
第2页 / 共136页
完整性和安全性.ppt_第3页
第3页 / 共136页
完整性和安全性.ppt_第4页
第4页 / 共136页
完整性和安全性.ppt_第5页
第5页 / 共136页
点击查看更多>>
资源描述

《完整性和安全性.ppt》由会员分享,可在线阅读,更多相关《完整性和安全性.ppt(136页珍藏版)》请在三一办公上搜索。

1、2023/10/12,1,SQL语言高级应用,第4章 完整性和安全性,2023/10/12,2,数据完整性,何为数据完整性?P9:由DBMS而不是用户程序自动检查数据的一致性、相容性,保证数据符合完整性约束条件。数据须符合的条件或数据之间的关系数据类型准确无误数据的值满足范围设置同一表格数据之间不存在冲突多个表格数据之间不存在冲突,2023/10/12,3,完整性约束条件,整个完整性控制都是围绕完整性约束条件进行的,从这个角度说,完整性约束条件是完整性控制机制的核心。,2023/10/12,4,完整性约束条件作用的对象列:对属性的取值类型、范围、精度等的约束条件元组:对元组中各个属性列间的联系

2、的约束关系:对若干元组间、关系集合上以及关系之间的联系的约束完整性约束条件作用的对象状态静态对静态对象的约束是反映数据库状态合理性的约束这是最重要的一类完整性约束动态对动态对象的约束是反映数据库状态变迁的约束,完整性约束条件,2023/10/12,5,完整性约束条件分类,对象状态 动态列级约束 动态元组约束 动态关系约束 动态 静态列级约束 静态元组约束 静态关系约束 静态 列 元组 关系 对象粒度,2023/10/12,6,静态列级约束,静态列级约束是对一个列的取值域的说明,这是最常见最简单同时也最容易实现的一类完整性约束五类静态列级约束对数据类型的约束,包括数据的类型、长度、单位、精度等

3、例:规定学生姓名的数据类型应为字符型,长度为8。对数据格式的约束例:规定学号的格式为前两位表示入学年份,后四位为顺序编号;出生日期的格式为。对取值范围或取值集合的约束例:规定成绩的取值范围为0-100;年龄的取值范围为14-29;性别的取值集合为男,女。对空值的约束:空值表示未定义或未知的值,它与零值和空格不同。有的列允许空值,有的则不允许。例:规定成绩可以为空值。其他约束例:关于列的排序说明,组合列等。,2023/10/12,7,静态元组约束,静态元组约束就是规定组成一个元组的各个列之间的约束关系。例:订货关系中包含发货量、订货量等列,发货量不得超过订货量例:教师关系中包含职称、工资等列,教

4、授的工资不得低于700元 静态元组约束只局限在单个元组上。,2023/10/12,8,静态关系约束,在一个关系的各个元组之间或者若干关系之间常常存在各种联系或约束。常见静态关系约束实体完整性约束参照完整性约束函数依赖约束统计约束定义某个字段值与一个关系多个元组的统计值之间的约束关系例:规定部门经理的工资不得高于本部门职工平均工资的5倍,不得低于本部门职工平均工资的2倍。本部门职工的平均工资值是一个统计计算值。,2023/10/12,9,动态列级约束,动态列级约束是修改列定义或列值时应满足的约束条件。常见动态列级约束修改列定义时的约束例:规定将原来允许空值的列改为不允许空值时,如果该列目前已存在

5、空值,则拒绝这种修改。修改列值时的约束修改列值有时需要参照其旧值,并且新旧值之间需要满足某种约束条件。例:职工工资调整不得低于其原来工资,学生年龄只能增长,2023/10/12,10,动态元组约束,动态元组约束是指修改某个元组的值时需要参照其旧值,并且新旧值之间需要满足某种约束条件。例:职工工资调整不得低于其原来工资+工龄*1.5,2023/10/12,11,动态关系约束,动态关系约束是加在关系变化前后状态上的限制条件。例:事务一致性、原子性等约束条件,2023/10/12,12,完整性约束条件小结,2023/10/12,13,DBMS的完整性控制机制,定义功能一个完善的完整性控制机制应该允许

6、用户定义各类完整性约束条件。检查功能立即执行的约束(Immediate constraints)检查是否违背完整性约束的时机通常是在一条语句执行完后立即检查,我们称这类约束为立即执行的约束 延迟执行的约束(Deferred constraints)在某些情况下,完整性检查需要延迟到整个事务执行结束后再进行,我们称这类约束为延迟执行的约束违约反应 拒绝该操作 其他处理方法,2023/10/12,14,关系系统三类完整性的实现,提供有定义和检查实体完整性、参照完整性和用户定义的完整性的功能。对于违反实体完整性规则和用户定义的完整性规则的操作一般都是采用拒绝执行的方式进行处理。而对于违反参照完整性的

7、操作,并不都是简单地拒绝执行,有时还需要采取另一种方法,即接受这个操作,同时执行一些附加的操作,以保证数据库的状态仍然是正确的。,2023/10/12,15,实体完整性的实现,例:在“学号不能为空”的约束中,约束作用的对象为Sno属性则插入或修改Student 元组时,作何处理?要求Sno不能为空否则,拒绝执行该操作,2023/10/12,16,用户定义完整性的实现,例:在“教授工资不得低于1000元”的约束中,约束作用的对象为工资Sal属性则插入或修改职工元组时,作如何处理?如果职称=教授时,Sal不能小于1000 否则,拒绝执行该操作,2023/10/12,17,参照完整性的实现,外码是否

8、可以接受空值的问题删除被参照关系的元组时的问题修改被参照关系中主码的问题,2023/10/12,18,外码是否可以接受空值的问题,外码是否能够取空值是依赖于应用环境的语义的。在实现参照完整性时,系统除了应该提供定义外码的机制,还应提供定义外码列是否允许空值的机制。,2023/10/12,19,例1:在职工部门数据库中,EMP关系包含有外码Deptno,某一元组的这一列若为空值,表示这个职工尚未分配到任何具体的部门工作。这和应用环境的语义是相符的,因此EMP的Deptno列应允许空值。例2:在学生选课数据库中,Student关系为被参照关系,其主码为Sno。SC为参照关系,外码为Sno。若SC的

9、Sno为空值,则表明尚不存在的某个学生,或者某个不知学号的学生,选修了某门课程,其成绩记录在Grade列中。这与学校的应用环境是不相符的,因此SC的Sno列不能取空值。,2023/10/12,20,删除被参照关系的元组时的问题,出现违约操作的情形需要删除被参照关系的某个元组,而参照关系有若干元组的外码值与被删除的被参照关系的主码值相对应违约反应:可有三种策略级联删除(CASCADES)将参照关系中所有外码值与被参照关系中要删除元组主码值相对应的元组一起删除。受限删除(RESTRICTED)只有当参照关系中没有任何元组的外码值与要删除的被参照关系的元组的主码值相对应时,系统才执行删除操作,否则拒

10、绝此删除操作。置空值删除(NULLIFIES)删除被参照关系的元组,并将参照关系中所有与被参照关系中被删除元组主码值相等的外码值置为空值。这三种处理方法,哪一种是正确的,要依应用环境的语义来定。,2023/10/12,21,例:要删除Student关系中Sno=200801的元组,而SC关系中有4个元组的Sno都等于200801。级联删除:将SC关系中所有4个Sno=200801的元组一起删除。如果参照关系同时又是另一个关系的被参照关系,则这种删除操作会继续级联下去。受限删除:系统将拒绝执行此删除操作。置空值删除:将SC关系中所有Sno=200801的元组的Sno值置为空值。在学生选课数据库中

11、,显然第一种方法和第二种方法都是对的。第三种方法不符合应用环境语义。,2023/10/12,22,修改被参照关系中主码的问题,两种策略不允许修改主码允许修改主码 允许修改主码策略违约操作要修改被参照关系中某些元组的主码值,而参照关系中有些元组的外码值正好等于被参照关系要修改的主码值要修改参照关系中某些元组的主码值,而被参照关系中没有任何元组的外码值等于被参照关系修改后的主码值违约反应修改的关系是被参照关系:与删除类似级联修改受限修改置空值修改修改的关系是参照关系:与插入类似受限修改级联修改,2023/10/12,23,修改被参照关系中主码的问题(续),级联修改修改被参照关系中主码值同时,用相同

12、的方法修改参照关系中相应的外码值。受限修改拒绝此修改操作。只当参照关系中没有任何元组的外码值等于被参照关系中某个元组的主码值时,这个元组的主码值才能被修改。置空值修改修改被参照关系中主码值,同时将参照关系中相应的外码值置为空值。,2023/10/12,24,例:学生200801休学一年后复学,这时需要将Student关系中Sno=200801的元组中Sno值改为 200923。而SC关系中有4个元组的Sno=200801级联修改:将SC关系中4个Sno=200801元组中的Sno值也改为200923。如果参照关系同时又是另一个关系的被参照关系,则这种修改操作会继续级联下去。受限修改:只有SC中

13、没有任何元组的Sno=200801 时,才能修改Student表中Sno=200801 的元组的Sno值改为 200923。置空值修改:将Student表中Sno=200801 的元组的Sno值改为 200923。而将S表中所有Sno=200801 的元组的Sno值置为空值。在学生选课数据库中只有第一种方法是正确的。,2023/10/12,25,小结,如何进行完整性维护系统的设计?1 如何表达完整性约束条件?2 如何检查完整性约束条件?如何检查?3 违反条件时候的如何处理?,2023/10/12,26,DBMS中完整性的定义:使用约束,2023/10/12,27,CREATE TABLE定义约

14、束,约束涉及单个属性的,有两种说明方法 定义为列级约束条件定义为表级约束条件若约束涉及多个属性的,只有一种说明方法定义为表级约束条件,2023/10/12,28,列级约束例1.CREATE TABLE语句中定义列级约束 CREATE TABLE S(sno NUMERIC(6)PRIMARY KEY,-列级约束 sname CHAR(8)NOT NULL,age NUMERIC(3,0),sex CHAR(2),bplace CHAR(20);表级约束例2.CREATE TABLE语句中定义表级约束 CREATE TABLE SC(sno NUMERIC(6)NOT NULL,cno varc

15、har(3)not null,PRIMARY KEY(sno,cno),-表级约束 grade NUMERIC(2);,2023/10/12,29,例3.在Employee表中说明Eno为主码,有两种方法。将属性直接说明为主码,列级约束 CREATE TABLE Employee(Eno char(4)PRIMARY KEY,Ename varchar(8),Sex char(2),Age int,Dno char(2);在属性列表后单独说明主码,表级约束 CREATE TABLE Employee(Eno char(4),Ename varchar(8),Sex char(2),Age in

16、t,Dno char(2),PRIMARY KEY(Eno);,2023/10/12,30,ALTER TABLE定义约束,添加约束语法:ALTER TABLE ADD CONSTRAINT,;例4.ALTER TABLE 添加约束。ALTER TABLE Employee ADD CONSTRAINT uq_ename UNIQUE(Ename);删除约束:语法:ALTER TABLE DROP CONSTRAINT,;例5.ALTER TABLE 删除约束。ALTER TABLE Employee DROP CONSTRAINT uq_ename;,2023/10/12,31,UNIQUE

17、约束,允许空值在一个表上可以放置多个UNIQUE约束可以在必须有唯一值,但不是表的主关键字的一个列或多个列上应用UNIQUE约束通过在指定列上创建唯一索引强制UNIQUE约束例6.添加唯一性约束。ALTER TABLE Department ADD CONSTRAINT uq_dname UNIQUE nonclustered(dname);例7.增加Ename必须取唯一值的约束条件。ALTER TABLE Employee/*用户为该唯一值约束设定约束名为UQ_Ename*/ADD CONSTRAINT UQ_Ename UNIQUE(Ename);或者:ALTER TABLE Employ

18、ee ADD UNIQUE(Ename);/*系统将自动为此约束名赋值*/,2023/10/12,32,PRIMARY KEY约束,每个表只能定义一个PRIMARY KEY约束输入的值必须是唯一的不允许空值它在指定的列上创建一个唯一索引例8.添加主码约束ALTER TABLE DepartmentADD CONSTRAINT pk_dno PRIMARY KEY clustered(dno);,2023/10/12,33,IDENTITY属性,每一个表都可有一标识列,其中包含由系统自动生成的能够标识表中每一行数据的唯一序列值。格式:IDENTITY(SEED,INCREMENT)SEED初始值

19、,表中的第一行数据的标识列的取值,默认值为1INCREMEN步长值,每一新标识值比上一个增长多少,默认值为1使用IDENTITY列时,应注意:每张表只允许有一个IDENTITY列该列必须使用下列数据类型之一:decimal、numeric、int、smallint 和 tinyint该列必须设置成不允许为空值,且不能有默认值,2023/10/12,34,DEFAULT约束,只应用于INSERT语句每列只能定义一个DEFAULT约束不能用于IDENTITY属性或TIMESTAMP数据类型TIMESTAMP数据库范围内的唯一数字,8字节,一个表中只能一个此类型的列允许使用一些系统提供的值例9.增加

20、列Title的默认值取值为“助工”。ALTER TABLE Employee ADD CONSTRAINT DF_Title DEFAULT 助工 for Title;,2023/10/12,35,CHECK约束,在每次执行INSERT或UPDATE语句时验证数据可以引用同一表中的其他列不能在具有IDENTITY属性的列或具有timestamp或uniqueidentifier数据类型的列上放置CHECK约束不能含有子查询例10.增加列性别取值约束。ALTER TABLE EmployeeADD CONSTRAINT ck_sex CHECK(sex in(男,女);,2023/10/12,3

21、6,CHECK约束也可涉及到表中多个域,称为元组约束。在对整个元组完成插入或对某一元组的修改完成之后,系统将检查元组是否符合CHECK条件表达式。例11.添加涉及多列的CHECK约束。ALTER TABLE Salary ADD CONSTRAINT ck_RightSalary CHECK(Insure+FundBasepay);注意,完整性约束的检查将花费系统一定的时间,特别是那些复杂的CHECK条件,虽然非常有用,但不应泛滥使用。,2023/10/12,37,FOREIGN KEY约束,必须引用一个PRIMARY KEY约束或UNIQUE约束提供单列或多列引用完整性不自动创建索引用户在引

22、用的表上必须有SELECT或REFERENCES权限在同一表中只使用REFERENCES子句例12.添加外部码约束。ALTER TABLE SC ADD CONSTRAINT fk_sno FOREIGN KEY(sno)REFERENCES S(sno);,2023/10/12,38,例13.说明Employee表中Dno为外部码,被参照关系为Department。两种方法分别如下:-列级约束,只使用REFERENCES子句 CREATE TABLE Employee(Eno char(4)PRIMARY KEY,Name varchar(8),Sex char(2),Age int,Dno

23、 char(2)REFERENCES Department(Dno);-表级约束 CREATE TABLE Employee(Eno char(4)PRIMARY KEY,Name varchar(8),Sex char(2),Age int,Dno char(2),FOREIGN KEY(Dno)REFERENCES Department(Dno);,2023/10/12,39,参照完整性检查和违约处理,ON DELETE NO ACTION|CASCADE|SET NULL|SET DEFAULT ON UPDATE NO ACTION|CASCADE|SET NULL|SET DEFAU

24、LT 高版本SQL SERVER支持:SET NULL、SET DEFAULT,2023/10/12,40,ON DELETE,指定如果已创建表中的行具有引用关系,并且被引用行已从父表中删除,则对这些行采取的操作。默认值为 NO ACTION。NO ACTION 数据库引擎将引发错误,并回滚对父表中相应行的删除操作。CASCADE 如果从父表中删除一行,则将从引用表中删除相应行。SET NULL(高版本SQL SERVER支持)如果父表中对应的行被删除,则组成外键的所有值都将设置为 NULL。若要执行此约束,外键列必须可为空值。SET DEFAULT(高版本SQL SERVER支持)如果父表中

25、对应的行被删除,则组成外键的所有值都将设置为默认值。若要执行此约束,所有外键列都必须有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作为该列的隐式默认值。,2023/10/12,41,例14.添加并验证外码约束的CASCADE级联操作。ALTER TABLE Employee ADD CONSTRAINT fk_emp FOREIGN KEY(Dno)REFERENCES Department(Dno)ON DELETE CASCADE ON UPDATE CASCADE;,2023/10/12,42,ON UPDATE,指定在发生更改的表中,如果行有引用关系且引用

26、的行在父表中被更新,则对这些行采取什么操作。默认值为 NO ACTION。NO ACTION 数据库引擎将引发错误,并回滚对父表中相应行的更新操作。CASCADE 如果在父表中更新了一行,则将在引用表中更新相应的行。SET NULL(高版本SQL SERVER支持)如果更新了父表中的相应行,则会将构成外键的所有值设置为 NULL。若要执行此约束,外键列必须可为空值。SET DEFAULT(高版本SQL SERVER支持)如果更新了父表中的相应行,则会将构成外键的所有值都设置为其默认值。若要执行此约束,所有外键列都必须有默认定义。如果某个列可为空值,并且未设置显式的默认值,则将使用 NULL 作

27、为该列的隐式默认值。,2023/10/12,43,数据完整性 回顾,如何进行完整性维护系统的设计?1 如何表达完整性约束条件?2 如何检查完整性约束条件?3 违反条件时候的如何处理?,2023/10/12,44,1.提供定义完整性约束条件的机制SQL标准使用了一系列概念来描述完整性,包括关系模型的实体完整性、参照完整性和用户定义完整性这些完整性一般由SQL的DDL语句来实现,数据完整性 回顾,2023/10/12,45,2.提供完整性检查的方法引起数据库状态改变的操作有哪些?INSERT、UPDATE、DELETE语句执行上述操作后开始检查3.违约处理 DBMS若发现用户的操作违背了完整性约束

28、条件,就采取一定的动作拒绝(NO ACTION)执行该操作级联(CASCADE)执行其他操作其他用户定义的操作,2023/10/12,46,DBMS定义约束,2023/10/12,47,实现数据完整性,数据完整性的类型实体完整性参照完整性用户定义完整性(域完整性)强制完整性声明数据完整性:在对象定义中定义的条件SQL Server自动强制使用约束、默认值和规则实现过程数据完整性:在脚本中定义的条件脚本强制使用触发器和存储过程实现,2023/10/12,48,SQL语言高级应用(*),4.2 触发器,2023/10/12,49,主要内容,触发器的概念触发器的功能和类型如何使用企业管理器创建和管理

29、触发器如何使用T-SQL语句创建和管理触发器,2023/10/12,50,Employee,Salary,2023/10/12,51,触发器的基本概念,触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中增删改记录时,被自动激活。可以用来对表实施复杂的完整性约束。触发器和引起触发器执行的T-SQL语句被当作一次事务处理,因此可以在触发器中回滚这个事务。如果发现引起触发器执行的T-SQL语句执行了一个非法操作,则可以通过回滚事务使语句不能执行,回滚后SQL Server会自动返回到此事务执行前的状态。,2023/10/12,52,触发器的作用,可以对数据库进行级联修改。可以完成比CHEC

30、K约束更复杂的限制。可以发现改变前后表中数据的不同,并根据这些不同来进行相应的操作。对于一个表上的不同的操作(INSERT、UPDATE或者DELETE)可以采用不同的触发器,即使是对相同的语句也可调用不同的触发器完成不同的操作。,2023/10/12,53,Inserted表和Deleted表,SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。它们为逻辑表,由系统来维护,用户不能对它们进行修改,并存放在内存而不是数据库中。表结构总是与引起该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也会被删除。Inserted表存放由于执行In

31、sert或Update语句而要从表中插入的所有行。Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。一个 Update事务可以看作先执行一个Delete操作,再执行一个 Insert 操作。,2023/10/12,54,触发器产生的临时视图:,Col1 int PKCol2 char(10),Test,Update EventUpdate test Set Col2=secondwhere Col1=1,Col1=1Col2=second,Deleted Table,Update Trigger,Col1=1Col2=first,Inserted Table,I

32、nsert EventInsert into test values(1,first),Col1=1Col2=first,空,Deleted Table,Insert Trigger,Inserted Table,Delete EventDelete from test where Col1=1,Delete Trigger,Inserted Table,Deleted Table,2023/10/12,55,INSTEAD OF和AFTER触发器,INSTEAD OF触发器和AFTER触发器。INSTEAD OF触发器用于替代引起触发器执行的T-SQL语句。可作用于表、视图。AFTER触发器

33、在一个INSERT、UPDATE或DELETE语句之后执行,进行约束检查等动作都将在AFTER触发器被激活之前发生。只作用于表。,2023/10/12,56,触发器的机制,发生事件(对一个关系的增删改操作),检查触发器的条件,执行触发器的动作(由数据库自动完成),操作的剩余部分,成立,不成立,2023/10/12,57,创建触发器,创建前须知:CREATE TRIGGER语句必须是一个批中的第一条语句。创建触发器的权限默认是属于表的所有者的,而且不能授权给其他人。触发器是数据库对象,其名称必须符合命名规则。只能在当前数据库中触发器,但触发器可以引用其他数据库的对象。触发器不能再临时表或系统表上

34、创建,触发器可以引用临时表,但不能引用系统表。TRUNCATE TABLE的操作不被记入事务日志,也不会激活DELETE触发器。,2023/10/12,58,创建触发器时需考虑:触发器的名称触发器所基于的表或视图触发器激活的时机激活触发器的修改语句,有效的选项是INSERT、UPDATE和DELETE触发器执行的语句一个表上可以有多个具有不同名称的各种类型触发器,每个触发器可以完成不同的功能。但每个触发器只能作用在一个表上,每个触发器可以被所有的三种动作(INSERT、UPDATE和DELETE)所激发。,2023/10/12,59,使用T-SQL语句创建触发器,基本语法:CREATE TRI

35、GGER trigger_nameON table_name|view_nameFOR|AFTER|INSTEAD OFINSERT,UPDATE,DELETEASsql_statement,2023/10/12,60,例1.设数据库中有一职工历史表Emp_his,其表结构与Employee表相同,为Employee表创建一触发器,当删除职工时,将删除职工的信息保存到表Emp_his中。CREATE TRIGGER Tri_del_emp ON Employee AFTER DELETE AS INSERT INTO Emp_his SELECT*FROM deleted,2023/10/12

36、,61,例2.创建一个触发器,实现无法删除有职工存在的部门信息,否则,将给出错误信息。CREATE TRIGGER Tri_del_dept ON Department AFTER DELETEAS IF EXISTS(SELECT Eno FROM Employee,DELETED WHERE Employee.Dno=DELETED.Dno)BEGIN RAISERROR(The department that is not empty cannot be deleted!,10,1)ROLLBACK TRANSACTION END;,RAISERROR 将引发一个错误号为 50000 的

37、错误消息。,2023/10/12,62,例3.实现前面的那个例子,为Employee表创建一触发器,当插入一职工时,在工资表中生成该职工的工资记录,设置其基本工资为500,其他工资项为0。CREATE TRIGGER Tri_ins_employee ON Employee AFTER INSERT AS DECLARE eno char(4)SELECT eno=Eno FROM inserted INSERT INTO Salary(Eno,Basepay,Service,Price,Rest,Insure,Fund)VALUES(eno,500,0,0,0,0,0),2023/10/12

38、,63,例4.为employee表创建一触发器,当修改某位职工的职称时,应同时修改salary表中的基本工资Basepay,具体标准为:当职称修改为工程师时,增加150元;当修改为高工时,增加300元。CREATE TRIGGER Tri_updatetitle_employee ON Employee FOR UPDATE AS IF UPDATE(Title)IF(SELECT Title FROM inserted)=工程师 UPDATE Salary SET Basepay=Basepay+150 WHERE Eno=(SELECT Eno FROM inserted)ELSE IF(

39、SELECT Title FROM inserted)=高工 UPDATE Salary SET Basepay=Basepay+300 WHERE Eno=(SELECT Eno FROM inserted),2023/10/12,64,INSTEAD OF触发器,例5.假设有一查询每个部门职工人数的视图,则创建一触发器使得删除视图数据即为删除该部门的职工。CREATE VIEW V_dnumber(Dno,Dnumber)AS SELECT Dno,COUNT(Eno)FROM Employee GROUP BY DnoCREATE TRIGGER Tri_Del_V_dnumber ON

40、 V_dnumber INSTEAD OF DELETEAS DELETE FROM Employee WHERE Dno=(SELECT Dno FROM deleted),2023/10/12,65,触发器编程注意,对于SQL SERVER,一个增删改操作对应于确定的触发器只会作用一次,而不管在这个操作中有多少记录受到了该操作的影响,因为它是语句级的。ORALCE中可支持行级触发器(FOR EACH ROW)对于更新触发器,可指定更新特殊的列(column)执行不能顺利完成,可给出错误信息并回滚事务(取消所有操作)。没有出错,提交事务。,2023/10/12,66,修改触发器,修改ALTE

41、R TRIGGEREnterprise Manager,2023/10/12,67,查看依赖关系,在重命名数据库对象时,最好先查看与该数据库对象有依赖关系的其他数据库对象,以决定是否有触发器需要为此而修改定义。可用Enterprise Manager。,2023/10/12,68,获得触发器的有关信息,显示表上触发器的类型sp_helptrigger显示了触发器的名称、拥有者,并用五个布尔值表明了触发器的类型和触发器被激活的时机。显示触发器的代码sp_helptext,2023/10/12,69,使表上的触发器无效或重新有效,修改表的ALTER TABLE语句。使用DISABLE TRIGGE

42、R子句可以使该表上的某一触发器无效。使用ENABLE TRIGGER子句可以使触发器重新有效。,2023/10/12,70,删除触发器,触发器被删除时,触发器所在表中的数据不会因此改变。当某个表被删除时,该表上的所有触发器也自动被删除。使用DROP TRIGGER语句可删除当前数据库的一个或多个触发器。使用Enterprise Manager。,2023/10/12,71,*域中的完整性限制,Microsoft SQL Server 的实现,2023/10/12,72,主要内容,用户自定义数据类型创建、修改、删除和查看规则规则的概念创建、修改和删除规则默认值默认值的概念创建、修改和删除默认值规

43、则与CHECK约束、默认值与DEFAULT约束的异同点,2023/10/12,73,1 用户自定义数据类型,利用用户定义的数据类型可以使在不同表中重复出现的各列具有相同的特性,使相似的数据种类标准化。可以将规则和默认值捆绑到用户定义的数据类型上,那么该规则和默认值就可以约束使用此数据类型的每个列。如果在model数据库中创建了用户自定义的数据类型,则它将出现在所有以后新建的数据库中。但是定义在用户数据库中的用户自定义数据类型,则只会出现在定义它的数据库中。,2023/10/12,74,创建用户自定义数据类型,使用企业管理器使用T-SQL语句可以使用系统存储过程sp_addtype 来创建用户自

44、定义数据类型(别名类型)。具体语法:sp_addtype type,system_data_type,null_type,2023/10/12,75,例1.基于系统提供的 varchar 数据类型创建别名类型。sp_addtype telephone,varchar(8),NULL例2.创建不允许空值并且名为 birthday 的别名数据类型(基于 datetime)。EXEC sp_addtype birthday,datetime,NOT NULL;SQL SERVER高版本将使用CREATE TYPE代替sp_addtype的使用。CREATE TYPE telephone FROM v

45、archar(8)NULL;CREATE TYPE支持创建用户定义表类型 CREATE TYPE Employeetype AS TABLE(Eno VARCHAR(5),Ename VARCHAR(10);,2023/10/12,76,查看用户自定义数据类型,使用系统存储过程sp_help来查看用户自定义数据类型的信息:基于的系统数据类型长度、精度是否允许为空值在这一数据类型上捆绑的规则和默认值等。,2023/10/12,77,删除用户自定义数据类型,使用企业管理器使用T-SQL语句使用系统存储过程sp_droptype来删除用户自定义数据类型。语法:sp_droptype type注意,正

46、在被表或数据库使用的用户自定义数据类型不能被删除。,2023/10/12,78,例3.删除别名数据类型birthday。sp_droptype birthday;SQL SERVER高版本中的使用:DROP TYPE birthday;,2023/10/12,79,2 规则,在向表的某列插入或更新数据时,用它来限制输入的新值的取值范围。规则是实现域完整性的方法之一,用来验证一个数据库中的数据是否处于一个指定的值域范围内。规则与CHECK约束的不同之处:CHECK约束是用CREATE TABLE语句在建表时指定的,而规则需要作为单独的数据库对象来实现。在一列上只能使用一个规则,但可以使用多个CH

47、ECK约束。规则可以应用于多个列,还可以应用于用户自定义的数据类型,而CHECK约束只能应用于它定义的列。,2023/10/12,80,创建规则,使用T-SQL语句CREATE RULE语法:CREATE RULE ruleAS condition_expressioncondition_expression可以是任何在查询的where子句中出现的表达式,但不能包括列名或其他数据库对象名。在表达式中有一个以开头的变量,该变量代表在修改该列的纪录是用户输入的数值。,2023/10/12,81,例4.创建具有范围的规则 CREATE RULE range_ruleAS value=18例5.创建具

48、有列表的规则 CREATE RULE sex_rule AS sex IN(男,女);例6.创建具有模糊匹配的规则 CREATE RULE telephone_rule AS telephone like 0-90-90-90-90-90-90-90-9;,2023/10/12,82,捆绑规则,使用系统存储过程sp_bindrule可以将规则捆绑到列或用户自定义数据类型上。语法:Sp_bindrule rule,object_name,futureonly_flagrule:规则的名称object_name为规则要捆绑到的列名或用户自定义数据类型名futureonly_flag可选参数,仅在要

49、捆绑到用户自定义数据类型时使用。,2023/10/12,83,例7.将规则绑定到列。EXEC sp_bindrule range_rule,Employee.Age;例8.将规则绑定到别名数据类型。EXEC sp_bindrule telephone_rule,telephone;例9.使用futureonly_flag。以下示例将 telephone_rule规则绑定到别名数据类型telephone。由于已指定futureonly,因此不影响类型为telephone的现有列。EXEC sp_bindrule telephone_rule,telephone,futureonly;,2023/

50、10/12,84,使用sp_unbindrule系统存储过程可以解除捆绑到列或用户自定义数据类型上的规则。语法:sp_unbindrule object_name,futureonly_flag,2023/10/12,85,例10.解除绑定列上的规则。EXEC sp_unbindrule Employee.Age;例11.解除绑定别名类型的规则。EXEC sp_unbindrule telephone,futureonly;,2023/10/12,86,查看规则,使用企业管理器使用系统存储过程sp_help可以查看规则的拥有者、创建时间等基本信息。使用系统存储过程sp_helptext可以查看

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号