版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、,Page 1,2020年7月21日星期二,存储过程、触发器、游标、事务、并发控制,存储过程 触发器 游标 事务 并发控制,Page 2,2020年7月21日星期二,存储过程、触发器、游标、事务,教学要求:通过本章学习,读者应掌握以下内容: 存储过程和触发器的作用 存储过程的创建、修改和删除 存储过程的灵活运用 触发器的创建、修改和删除,Page 3,2020年7月21日星期二,存储过程的概念,存储过程是一组编译在单个执行计划中的Transact-SQL语句,将一些固定的操作集中起来交给SQL Server数据库服务器完成,以实现某个任务。 存储过程的优点 (1)与其他应用程序共享应用程序逻辑
2、,因而确保了数据访问和修改的一致性。 (2)防止数据库中表的细节暴露给用户。 (3)提供安全机制。 (4)改进性能。 (5)减少网络流量。,Page 4,2020年7月21日星期二,存储过程的类型 (1)系统存储过程。Sp_help (2)本地存储过程。学习对象 (3)临时存储过程。不永久保存 (4)远程存储过程。 (5)扩展存储过程。 C语言等,Page 5,2020年7月21日星期二,建立和执行存储过程,简单存储过程类似于将一组SQL语句起个名字,然后就可以在需要时反复调用。复杂一些的则要有输入和输出参数。 CREATE PROCEDURE 存储过程名 WITH ENCRYPTION-对存
3、储过程进行加密 WITH RECOMPILE-对存储过程重新编译 AS SQL 语句,Page 6,2020年7月21日星期二,【例】从S_C数据库的三个表中查询,返回学生学号、姓名、课程名、成绩。该存储过程实际上只返回一个查询信息。 CREATE PROCEDURE stu_cj AS SELECT student.sno,sname,cname,grade FROM student INNER JOIN sc ON student.sno=sc.sno INNER JOIN course ON o=o exec stu_cj,Page 7,2020年7月21日星期二,execute 除了可
4、以执行存储过程,还可以执行sql语句。 execute (select * from student) DECLARE tab_name varchar(20) SET tab_name=student EXECUTE(SELECT * FROM +tab_name),Page 8,2020年7月21日星期二,带输入参数的存储过程 一个存储过程可以带一个或多个参数,输入参数是指由调用程序向存储过程传递的参数,它们在创建存储过程语句中被定义,在执行存储过程中给出相应的参数值。,Page 9,2020年7月21日星期二,【例10.3】从S_C数据库的三个表中查询某人指定课程的成绩。,CREATE
5、PROCEDURE stu_cj1 name char(10),cname char(16) AS SELECT student.sno,sname,cname,grade FROM student INNER JOIN sc ON student.sno=sc.sno INNER JOIN course ON o=o WHERE student.sname=name AND ame=cname,Page 10,2020年7月21日星期二,2调用存储过程 在执行存储过程的语句中,有两种方式传递参数值,分别是使用参数名传递参数值和按参数位置传递参数值。 按参数位置传递参数值: exec stu_
6、cj1 王勇,数据库管理系统 参数名传递参数值: exec stu_cj1 cname=数据库管理系统,name=王勇,Page 11,2020年7月21日星期二,使用参数名传递参数值,当存储过程含有多个输入参数时,对数值可以按任意顺序给出,对于允许空值和具有默认值的输入参数可以不给参数值. 按参数位置传递参数值,也可以忽略允许为空值和有默认值的参数,但不能因此破坏输入参数的指定顺序。必要时使用关键字“DEFAULT”作为参数值的占位。,Page 12,2020年7月21日星期二,如果不确定是否已经存在stu_cj1,则可以在创建之前执行以下代码: IF EXISTS (SELECT name
7、 FROM SYSOBJECTS WHERE name=stu_cj1 AND type=P) DROP PROCEDURE stu_cj1,Page 13,2020年7月21日星期二,【例】从三个表的连接中返回指定学生的学号、姓名、所选课程名称及该课程的成绩。该存储过程在参数中使用了模式匹配,如果没有提供参数,则使用预设置的默认值。 CREATE PROCEDURE stu_cj2 name char(10)=王% AS SELECT student.sno,sname,cname,grade FROM student INNER JOIN sc ON student.sno=sc.sno
8、INNER JOIN course ON o=o WHERE sname LIKE name,Page 14,2020年7月21日星期二,上面存储过程有多种执行形式,下面列了一部分: EXECUTE stu_cj2 /*参数使用默认值*/ EXECUTE stu_cj2 default EXECUTE stu_cj2 刘%,Page 15,2020年7月21日星期二,带输出参数的存储过程,如果我们需要从存储过程中返回一个或多个值,可使用OUTPUT关键字定义输出参数来实现。 CREATE PROCEDURE stu_sum name char(10),total int OUTPUT AS S
9、ELECT total=SUM(grade) FROM student,sc WHERE sname=name AND student.sno=sc.sno GROUP BY student.sno,Page 16,2020年7月21日星期二,DECLARE total int EXECUTE stu_sum 王勇, total OUTPUT SELECT 王勇,total 注意:要定义变量来接收output类型变量传出来的参数值,存储过程参数名和调用时的变量名不一定相同,不过数据类型和参数的位置必须匹配。,Page 17,2020年7月21日星期二,存储过程的管理与维护,查看存储过程的定义信
10、息 在SQL Server Management Studio的“对象资源管理器”中,可以在要查看信息的存储过程上单击鼠标右键,在快捷菜单中选择“属性”,弹出“存储过程属性”窗口. EXECUTE sp_helptext stu_sum EXECUTE sp_help stu_sum EXECUTE sp_depends stu_sum 运行后得到存储过程的定义、参数和依赖信息。 。,Page 18,2020年7月21日星期二,存储过程的重编译,存储过程所采用的执行计划,只在编译时优化生成,以后便驻留在高速缓存中。当用户对数据库新增了索引或其他影响数据库逻辑结构的更改后,已编译的存储过程执行计
11、划可能会失去效率。通过对存储过程进行重新编译,可以重新优化存储过程的执行计划。 SQL Server为用户提供了3种重新编译的方法。,Page 19,2020年7月21日星期二,1在创建存储过程时设定 在创建存储过程时,使用WITH RECOMPILE子句时SQL Server不将该存储过程的查询计划保存在缓存中,而是在每次运行时重新编译和优化,并创建新的执行计划。 2在执行存储过程时设定 通过在执行存储过程时设定重新编译,可以让SQL Server在执行存储过程时重新编译该存储过程,这一次执行完成后,新的执行计划又被保存在缓存中。这样用户就可以根据需要进行重新编译。 EXECUTE stu_
12、cj1 WITH RECOMPILE 3通过系统存储过程设定重编译 通过系统存储过程sp_recompile设定重新编译标记,使存储过程在下次运行时重新编译。 其语法格式如下: EXECUTE sp_recompile 数据库对象,Page 20,2020年7月21日星期二,修改和删除存储过程,1修改存储过程 存储过程的修改是由ALTER语句来完成的,基本语法如下: ALTER PROCEDURE 存储过程名 WITH ENCRYPTION WITH RECOMPILE AS SQL语句,Page 21,2020年7月21日星期二,2删除存储过程 在SQL Server Management
13、Studio的“对象资源管理器”中可以进行删除。 命令方式DROP PROCEDURE stu_sum,Page 22,2020年7月21日星期二,触发器的概念,触发器是一类特殊的存储过程,它是在执行某些特定的T-SQL语句时可以自动执行的一种存储过程。 触发器的功能 SQL Server2005提供了两种方法来保证数据的有效性和完整性:约束和触发器。 触发器的常用功能如下。 (1)完成更复杂的数据约束:触发器可以实现比约束更为复杂的数据约束。 (2)检查SQL所做的操作是否允许:触发器可以检查SQL所做的操作是否被允许。,Page 23,2020年7月21日星期二,(3)修改其他数据表里的数
14、据:当一个SQL语句对数据表进行操作的时候,触发器可以根据SQL语句的操作情况来对另一个数据表进行操作。 (4)调用更多的存储过程:约束是不能调用存储过程的,但触发器本身就是一种存储过程,而存储过程是可以嵌套调用的,所以触发器也可能调用一个或多个存储过程。 (5)返回自定义的错误信息:约束只能通过标准的系统错误信息来传递错误信息,如果应用程序要求使用自定义信息和较为复杂的错误处理,则必须使用触发器。 (6)防止数据表结构更改或数据表被删除:为了保护已经建立好的数据表,触发器可以在接收到以DROP或ALTER开头的语句后,不对数据表的结构做任何操作。,Page 24,2020年7月21日星期二,
15、触发器的类型,1. DML触发器 DML触发器是当数据库服务器中发生数据操纵语言DML事件时执行的特殊存储过程,如INSERT、UPDATE,DELETE。 2. DDL触发器 DDL触发器是当数据库服务器中发生数据定义语言DDL事件时执行的特殊存储过程,如CREATE、ALTER,DROP等。,Page 25,2020年7月21日星期二,DML触发器的类型 触发事件: INSERT、UPDATE、DELETE。 触发类型:for/after、 instead of FOR与AFTER同义,指定触发器只有在触发器SQL语句中指定的所有操作都已成功后才激发。所有的引用级联操作和约束检查也必须成功
16、完成后,才能执行此触发器,即为后触发。 INSTEAD OF。指定执行触发器而不执行造成触发的SQL语句,从而替代造成触发的语句。在表或视图上,每个INSERT、UPDATE或DELETE语句只能定义一个INSTEAD OF触发器,即替代触发。,Page 26,2020年7月21日星期二,创建和应用DML触发器,1AFTER触发器 这类触发器是在记录已经改变之后,才会被激活执行,它主要是用于记录变更后的处理或检查,一旦发现错误,也可以用ROLLBACK TRANSACTION语句来回滚本次的操作。,Page 27,2020年7月21日星期二,1DELETE触发器 【例】当从student表中删
17、除一个学生的记录时,相应的应从sc表中删除该学生对应的所有记录。CREATE TRIGGER delete_trig ON student AFTER DELETE AS DELETE FROM sc WHERE sno=(SELECT sno FROM DELETED),Page 28,2020年7月21日星期二,触发该触发器 delete from student where sno=200215121 先执行delete语句(有外键约束则此处不能成功执行) 在执行触发器中的语句,Page 29,2020年7月21日星期二,DML触发器的工作原理 在SQL Server2005中,为每个D
18、ML触发器定义了两个特殊的表,一个是Inserted表,一个是Deleted表。 Inserted表里存放的是新值。对于insert操作,存的是要插入的数据值;对于update操作,存的是要更新成的值。 Deleted表里存放的是旧值。对于update操作来说,Deleted表里存放的是更新前的记录;对于delete操作来说,Deleted表里存储的是被删除的旧记录。,Page 30,2020年7月21日星期二,create trigger trig_a on student after update as select * from inserted; select * from delet
19、ed; update student set sage=sage+1 where sno=200215121,Page 31,2020年7月21日星期二,2INSERT触发器 【例】在数据库student中创建一触发器,当向sc表插入一记录时,检查该记录的学号在student表中是否存在,检查课程号在course表中是否存在,若有一项为否,则不允许插入 CREATE TRIGGER check_trig ON sc FOR INSERT AS IF EXISTS(SELECT * FROM INSERTED a WHERE a.sno NOT IN (SELECT b.sno FROM stu
20、dent b) OR o NOT IN(SELECT o FROM course c) BEGIN RAISERROR(违背数据的一致性,16,1) ROLLBACK TRANSACTION END GO,Page 32,2020年7月21日星期二,insert into sc values(200215123,7,80) 消息 50000,级别 16,状态 1,过程 check_trig,第 1 行 违背数据的一致性 消息 3609,级别 16,状态 1,第 1 行 事务在触发器中结束。批处理已中止。,Page 33,2020年7月21日星期二,3UPDATE触发器 【例】在数据库的sc表上
21、创建一触发器,若对学号列和课程号列修改,则给出提示信息,并取消修改操作。 CREATE TRIGGER update_trig ON sc FOR update AS IF UPDATE(sno) OR UPDATE(cno) BEGIN RAISERROR(学号或课程号不能进行修改!,7,2) ROLLBACK TRANSACTION END,Page 34,2020年7月21日星期二,update sc set cno=7 where sno=200215123 学号或课程号不能进行修改! 消息 50000,级别 7,状态 2 消息 3609,级别 16,状态 1,第 1 行 事务在触发器
22、中结束。批处理已中止。,Page 35,2020年7月21日星期二,2INSTEAD OF触发器 这类触发器一般是用来取代原本要进行的操作,它并不去执行原来的DML语句的操作,而是去执行触发器本身所定义的操作。 比如对视图的dml操作通过instead of触发器变为对基表的dml操作。 比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。,Page 36,2020年7月21日星期二,create trigger fon tblinstead of deleteas insert into Logs. Insert into tbl values();,Page
23、37,2020年7月21日星期二,用instead of 触发器插入本来不能插入的视图,Create view view_1 As select sc.sno,sname,cno,grade from student,sc Where student.sno=sc.sno select * from view_1 insert into view_1 values(200215123,刘欣,3,90),Page 38,2020年7月21日星期二,create trigger insert_view on view_1 instead of insert as insert into sc se
24、lect sno,cno,grade from inserted; insert into view_1 values(200215123,刘欣,3,90),Page 39,2020年7月21日星期二,触发器的管理与维护,查看触发器的定义信息 修改和删除触发器 1修改触发器 ALTER TRIGGER 触发器名 2删除触发器 使用DROP TRIGGER 命令,即可删除触发器,Page 40,2020年7月21日星期二,禁止或启用触发器,禁止和启用触发器的语法格式如下。 ALTER TABLE 表名 ENABLE|DISABLE TRIGGER ALL|触发器名,n 使用该语句可以禁用或启用指
25、定表上的某些触发器或所有触发器。 Alter table sc disable trigger insert_view,Page 41,2020年7月21日星期二,DDL触发器,在运行DDL触发器的DDL语句后,DDL触发器才会激发。 一般来说,在以下几种情况下可以使用DDL触发器。 (1)防止数据库架构进行某些修改。 (2)防止数据库或数据表被误操作而删除。 (3)希望数据库发生某种情况以响应数据库架构中的更改。 (4)要记录数据库架构的更改或事件。,Page 42,2020年7月21日星期二,创建DDL触发器,创建DDL触发器的语法格式如下: CREATE TRIGGER 触发器名 ON
26、服务器|数据库 WITH ENCRYPTION FOR|AFTER DDL语句名称 AS SQL语句,Page 43,2020年7月21日星期二,建立用于保护数据库S_C中的数据表不被删除的触发器。 运行如下命令。 CREATE TRIGGER dis_drop_table ON database FOR DROP_TABLE AS BEGIN RAISERROR(对不起,S_C数据库中的表不能删除,16,10) rollback END drop table sc select * from sc,Page 44,2020年7月21日星期二,CREATE TABLE 日志记录表( 编号int
27、 IDENTITY(1,1) NOT NULL, 事件varchar(5000) NULL, 所用语句varchar(5000) NULL, 操作者varchar(50) NULL, 发生时间datetime NULL, CONSTRAINT PK_日志记录表PRIMARY KEY CLUSTERED (编号ASC) ),Page 45,2020年7月21日星期二,CREATE TRIGGER 记录日志 ON DATABASE FOR DDL_DATABASE_LEVEL_EVENTS AS DECLARE log XML SET log = EVENTDATA() INSERT 日志记录表
28、(事件, 所用语句,操作者, 发生时间) VALUES ( log.value(/EVENT_INSTANCE/EventType)1, nvarchar(100), log.value(/EVENT_INSTANCE/TSQLCommand)1, nvarchar(2000), CONVERT(nvarchar(100), CURRENT_USER), GETDATE() ) ;,Page 46,2020年7月21日星期二,查看和修改DDL触发器 (1)作用在当前SQL Server服务器上的DDL触发器所在的位置 选择所在的SQL Server服务器上,定位到“服务器对象”中的“触发器”,
29、在“摘要”对话框中就可以看到所有作用在当前SQL Server服务器上的DDL触发器。 (2)作用在当前数据库中的DDL触发器所在位置 在SQL Server服务器上,通过“数据库”选择所在的数据库,然后定位到“可编程性”中的“数据库触发器”,在摘要对话框中就可以看到所有的当前数据库中的DDL触发器。,Page 47,2020年7月21日星期二,游标,游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 游标总是与一条SQL 选择语句相关联,游标由结果集(可以是零条、一条或由相关的选择语句检索出的多条记录)和结
30、果集中指向特定记录的游标位置组成。当决定对结果集进行处理时,必须声明一个指向该结果集的游标。 游标 一般针对多行数据,Page 48,2020年7月21日星期二,游标及其使用,游标支持以下功能: (1)定位在结果集的特定行。 (2)从结果集的当前位置检索一行或多行。 (3)支持对结果集中当前位置的行进行数据修改。 (4)为由其他用户对显示在结果集中的数据所做的更改提供不同级别的可见性支持。,Page 49,2020年7月21日星期二,使用一个游标,需要以下几个步骤: (1)声明一个游标。 (2)打开游标。 (3)从游标中读取数据行。 (4)关闭游标。 (5)删除游标。,Page 50,2020
31、年7月21日星期二,DECLARE c_age CURSOR FOR SELECT * FROM student WHERE sage=20 -声明游标 OPEN c_age -打开游标 FETCH NEXT FROM c_age WHILE FETCH_STATUS=0 FETCH NEXT FROM c_age -取数据 CLOSE c_age -关闭游标 DEALLOCATE c_age -释放游标,Page 51,2020年7月21日星期二,fetch_status是MSSQL的一个全局变量 其值有以下三种,分别表示三种不同含义:【返回类型integer】 0 FETCH 语句成功 -
32、1 FETCH 语句失败或此行不在结果集中 -2 被提取的行不存在 fetch_status值的改变是通过fetch next from实现的 “FETCH NEXT FROM Cursor”,Page 52,2020年7月21日星期二,有两种方法可以声明一个游标。 形式1(ANSI 92) DECLARE cursor_name INSENSITIVE SCROLL CURSOR FOR select_statement FOR READ ONLY | UPDATE OF column_list,Page 53,2020年7月21日星期二,INSENSITIVE关键字指明要为检索到的结果集建
33、立一个临时拷贝,以后的数据从这个临时拷贝中获取。如果在后来游标处理的过程中,原有基表中数据发生了改变,那么它们对于该游标而言是不可见的。这种不敏感的游标不允许数据更改。 SCROLL关键字指明游标可以在任意方向上滚动。所有的fetch选项(first、last、next、relative、absolute)都可以在游标中使用。如果忽略该选项,则游标只能向前滚动(next)。 Select_statement指明SQL语句建立的结果集。Transact SQL语句COMPUTE、COMPUTE BY、FOR BROWSE和INTO在游标声明的选择语句中不允许使用。 READ ONLY指明在游标结
34、果集中不允许进行数据修改。 UPDATE关键字指明游标的结果集可以修改。 OF column_list指明结果集中可以进行修改的列。缺省情况下(使用UPDATE关键字),所有的列都可进行修改。,Page 54,2020年7月21日星期二,形式2 T-SQL扩展语法 DECLARE cursor_name CURSOR LOCAL | GLOBAL FORWARD_ONLY | SCROLL STATIC | KEYSET | DYNAMIC READ_ONLY | SCROLL_LOCKS | OPTIMISTIC FOR select_statement FOR READ ONLY | UP
35、DATE OF column_list,Page 55,2020年7月21日星期二,LOCAL关键字指明游标是局部的,它只能在它所声明的过程中使用。 GLOBAL关键字使得游标对于整个连接全局可见。全局的游标在连接激活的任何时候都是可用的。只有当连接结束时,游标才不再可用。 FORWARD_ONLY指明游标只能向前滚动。 STATIC的游标与INSENSITIVE的游标是相同的。 KEYSET指明选取的行的顺序。SQL Server将从结果集中创建一个临时关键字集。如果对数据库的非关键字列进行了修改,则它们对游标是可见的。因为是固定的关键字集合,所以对关键字列进行修改或新插入列是不可见的。 D
36、YNAMIC指明游标将反映所有对结果集的修改。 SCROLL_LOCK是为了保证游标操作的成功,而对修改或删除加锁。 OPTIMISTIC指明哪些通过游标进行的修改或者删除将不会成功。,Page 56,2020年7月21日星期二,注意: 如果在SELECT语句中使用了DISTINCT、UNION、GROUP BY语句,且在选择中包含了聚合表达式,则游标自动为INSENSITIVE的游标。 如果基表没有唯一的索引,则游标创建成INSENSITIVE的游标。 如果SELECT语句包含了ORDER BY,而被ORDER BY的列并非唯一的行标识,则DYNAMIC游标将转换成KEYSET游标。如果KE
37、YSET游标不能打开,则将转换成INSENSITIVE游标。使用SQL ANSI-92语法定义的游标同样如此,只是没有INSENSITIVE关键字而已。,Page 57,2020年7月21日星期二,ii. 打开游标,打开游标就是创建结果集。游标的执行是通过OPEN语句。语法如下: OPEN GLOBAL cursor_name | cursor_variable_name GLOBAL指明一个全局游标。 Cursor_name是被打开的游标的名称。 Cursor_variable_name是所引用游标的变量名。该变量应该为游标类型。 在游标被打开之后,系统变量cursor_rows可以用来检测
38、结果集的行数。,Page 58,2020年7月21日星期二,游标被打开后中,可以用FETCH语句,从结果集中检索单独的行。 语法格式: FETCH NEXT|PRIOR|FIRST|LAST|ABSOLUTEn|nvar| RELATIVEn|nvar FROM GLOBAL游标名称 INTO变量名,.n,Page 59,2020年7月21日星期二,各参数含义如下。 (1)NEXT。返回紧跟当前行之后的结果行,并且当前行递增为结果行。如果FETCH NEXT为对游标的第一次提取操作,则返回结果集中的第一行。NEXT为默认的游标提取选项。 (2)PRIOR。返回紧临当前行前面的结果行,并且当前行
39、递减为结果行。如果FETCH PRIOR为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前。 (3)FIRST。返回游标中的第一行并将其作为当前行。 (4)LAST。返回游标中的最后一行并将其作为当前行。 (5)ABSOLUTEn|nvar。如果n或nvar为正数,返回从游标头开始的第n行并将返回的行变成新的当前行。如果n或nvar为负数,返回游标尾之前的第n行并将返回的行变成新的当前行。如果n或nvar为 0,则没有行返回。n必须为整型常量且nvar必须为smallint、tinyint或int。,Page 60,2020年7月21日星期二,(6)RELATIVEn|nvar。如果
40、n或nvar为正数,返回当前行之后的第n行并将返回的行变成新的当前行。如果n或nvar为负数,返回当前行之前的第n行并将返回的行变成新的当前行。如果n或nvar为0,返回当前行。如果对游标的第一次提取操作时将FETCH RELATIVE的n或nvar指定为负数或0,则没有行返回。n必须为整型常量且nvar必须为smallint、tinyint或int。 (7)INTO变量名,n。存入变量。允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配。变量的数目必须与游标选择列表中的列的数目一致。,Page 61,2
41、020年7月21日星期二,要通过CURSOR_ROWS变量得到记录的个数,则要声明不敏感游标或扩展语法格式的静态游标或键集游标。 DECLARE rs INSENSITIVE CURSOR FOR SELECT * FROM student OPEN rs -打开游标 IF ERROR=0 BEGIN PRINT 游标打开成功。 PRINT 学生总数为:+ CONVERT(VARCHAR(3),CURSOR_ROWS) END CLOSE rs -关闭游标 DEALLOCATE rs -释放游标,Page 62,2020年7月21日星期二,2. 修改数据 修改第二个学生的年龄 SELECT *
42、 INTO student1 FROM student DECLARE c_age CURSOR FOR SELECT * FROM student1 OPEN c_age FETCH NEXT FROM c_age FETCH NEXT FROM c_age UPDATE student1 SET sage=sage+1 WHERE CURRENT OF c_age CLOSE c_age DEALLOCATE c_age SELECT * FROM student1 DROP TABLE student1,Page 63,2020年7月21日星期二,【例】使用存储过程在S_C数据库的stu
43、dent表上声明并打开一个游标。 CREATE PROCEDURE stu_cursor stu_cursor CURSOR VARYING OUTPUT AS SET stu_cursor=CURSOR FORWARD_ONLY STATIC FOR SELECT * FROM student OPEN stu_cursor declare a cursor exec stu_cursor a output fetch next from a,游标变量,Page 64,2020年7月21日星期二,事务,事务是作为单个逻辑工作单元执行的一系列操作。这一系列操作或者都被执行,或者都不被执行。 事
44、务是单个的要么发生或要么不发生的事件。 假定要将资金从一个银行帐户转到另一个帐户。需要确保两个帐户都更改或都不更改。 事务提供了一种方法,能够将一组操作集合成具有原子性的执行单位。,Page 65,2020年7月21日星期二,转账,update account set sum=sum-100 where idupdate account set sum=sum+100 where id如何保证成功执行?,Page 66,2020年7月21日星期二,begin transaction update account s
45、et sum=sum-100 where idupdate account set sum=sum+100 where idcommit transaction,Page 67,2020年7月21日星期二,事务作为一个逻辑工作单元有4个属性,称为ACID 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务
46、的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。,Page 68,2020年7月21日星期二,SQL Server有以下3种事务模式。 (1)自动提交事务。这是SQL Server的默认模式。每个单独的SQL语句都是一个事务,并在其完成后提交。不必指定任何语句控制事务。 (2)显式事务。每个事务均以BEGIN TRANSACTION语句显式开始,以COMMIT或ROLLBACK语句显式结束。 (3)隐性事务。通过API函数或Transact-SQL的SET IMPLICIT_TRANSACTION ON语句,将隐性事务模式设置为打开。这样在前一个事务结束时新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK语句显式结束。,Page 69,2020年7月21日星期
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 证券行业2025年三季报综述:业绩同环比高增景气持续回升
- 2025年根河市人民政府面向社会公开招聘(补招)乡镇及政府专职消防队员26人备考题库及1套完整答案详解
- 2025年德州市武城县人民医院合同制医师长期招聘12人备考题库及1套完整答案详解
- 四川省公安厅所属事业单位招聘考试真题2024
- 2025新疆北屯额河明珠国有资本投资有限公司招聘2人参考考试试题及答案解析
- matlab课程设计与应用答案
- 2026年江西铜业技术研究院有限公司北京分院院长招聘1人考试重点试题及答案解析
- 宜宾市南溪区事业单位2025年公开考核招聘高层次和急需紧缺专业人才考试重点题库及答案解析
- 2025年直播电商供应链全球化趋势报告
- 中化地质矿山总局地质研究院2026年高校应届毕业生招聘备考题库及1套完整答案详解
- 工业软件基础知识培训课件
- 山地光伏150MW技术标(EPC)方案投标文件(技术方案)
- 儿童自身炎症性疾病诊断与治疗专家共识解读
- T/CCPITCSC 096-2022名表真假鉴定规范
- 皮肤恶性肿瘤课件
- 2025人教版七年级下册英语寒假预习重点语法知识点清单
- CWAN 0020-2022 机器人焊接技能竞赛团体标准
- 浙江省温州市2023-2024学年六年级上学期期末科学试卷(含答案)1
- 中国文化:复兴古典 同济天下学习通超星期末考试答案章节答案2024年
- 《底层逻辑》刘润
- T-NMAAA.0002-2021 营运机动车停运损失鉴定评估规范
评论
0/150
提交评论