SJK081 第8章 数据库编程.ppt_第1页
SJK081 第8章 数据库编程.ppt_第2页
SJK081 第8章 数据库编程.ppt_第3页
SJK081 第8章 数据库编程.ppt_第4页
SJK081 第8章 数据库编程.ppt_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、An Introduction to Database System,数据库系统概论 An Introduction to Database System 第八章 数据库编程,An Introduction to Database System,第八章 数据库编程,8.1 嵌入式SQL 8.2 存储过程 8.3 SQL-SERVER T-SQL程序设计,An Introduction to Database System,8.1 嵌 入 式 SQL,SQL语言提供了两种不同的使用方式: 交互式 嵌入式 为什么要引入嵌入式SQL SQL语言是非过程性语言 事务处理应用需要高级语言 这两种方式细节

2、上有差别,在程序设计的环境下,SQL语句要做某些必要的扩充,An Introduction to Database System,两种嵌入方式,1 宿主语言嵌入 C,COBOL 2 控件嵌入 C+BUILDER, VB, VC,An Introduction to Database System,宿主语言嵌入SQL执行流程:,An Introduction to Database System,游标(cursor),什么是游标 SQL查询结果是记录的集合, 而主语言一次只能处理一条记录 可将SQL语句的查询结果定义为游标 用户可以逐一从游标中获取记录,交由主语言进一步处理,An Introdu

3、ction to Database System,嵌入式SQL语句与主语言之间的通信(续),例:带有嵌入式SQL的一小段C程序 . EXEC SQL INCLUDE SQLCA; /*定义SQL通信区 */ EXEC SQL BEGIN DECLARE SECTION; /*说明主变量, 在C和SQL中都可用 */ CHAR title_id(7); /*书号*/ CHAR title(81); /*书名*/ INT royalty; /*版税*/ EXEC SQL END DECLARE SECTION;,An Introduction to Database System,嵌入式SQL语句

4、与主语言之间的通信(续),main() /*定义游标, 对应图书表中的书号,书名,版税*/ EXEC SQL DECLARE C1 CURSOR FOR SELECT tit_id, tit, roy FROM titles; /* 打开游标*/ EXEC SQL OPEN C1;,An Introduction to Database System,嵌入式SQL语句与主语言之间的通信(续),for(;) EXEC SQL FETCH C1 INTO :title_id, :title, :royalty; /* 游标操作(将当前数据放入主变量)*/ if (sqlca.sqlcode SUC

5、CESS) /* 利用SQLCA中的状态信息决定退出循环 */ break; printf(Title ID: %s, Title: %s ,Royalty: %d, :title_id, :title ,:royalty); /* 打印查询结果 */ EXEC SQL CLOSE C1; /* 关闭游标*/ ,An Introduction to Database System,第八章 数据库编程,8.1 嵌入式SQL 8.2 存储过程 8.3 SQL-SERVER T-SQL程序设计,An Introduction to Database System,PL/SQL (ORACLE): 过

6、程化SQL语言, 是SQL的扩展 增加了过程化语句功能 (分支,循环.) 基本结构是块(BEGIN.END) 不是标准语言 存储过程: 由PL/SQL语句书写的过程,经编译和优化后存储在数据库服务器中,使用时只要调用即可。,PL/SQL与存储过程,An Introduction to Database System,1. 创建存储过程: CREATE Procedure 过程名(参数1,参数2,.) AS ;,An Introduction to Database System,例 利用存储过程来实现下面的应用: 从一个账户转指定数额的款项到另一个账户中。,CREATE PROCEDURE T

7、RANSFER(inAccount INT, outAccount INT, amount FLOAT) AS DECLARE totalDeposit FLOAT; /*定义局部变量,余额*/ BEGIN /* 检查转出账户的余额 */ SELECT total INTO totalDeposit FROM ACCOUNT WHERE ACCOUNTNUM=outAccount; IF totalDeposit IS NULL THEN /* 账户不存在*/ ROLLBACK; /*回滚,撤销事务的操作* / RETURN; END IF;,An Introduction to Databa

8、se System,存储过程的用户接口(续),IF totalDeposit amount THEN /* 账户存款不足*/ ROLLBACK; /*回滚,撤销事务的操作* / RETURN; END IF; UPDATE account SET total=total-amount WHERE ACCOUNTNUM=outAccount; /* 修改转出账户,减去转出额 */ UPDATE account SET total=total + amount WHERE ACCOUNTNUM=inAccount; /* 修改转入账户,增加转出额 */ COMMIT; /* 提交转账事务 */ E

9、ND; /* 结束PL/SQL块 */,An Introduction to Database System,2.执行存储过程:,CALL Procedure 过程名(参数1,参数2,.); 例从账户1003转一万元到1004账户。 CALL Procedure TRANSFER(1003,1004,10000); 可以在过程体中调用其他存储过程 可以在客户端程序(VB等)中调用存储过程,An Introduction to Database System,3. 删除存储过程 DROP PROCEDURE 过程名;,An Introduction to Database System,存储过程

10、的优点 经编译和优化后存储在数据库服务器中,运行效率高 降低客户机和服务器之间的通信量 有利于集中控制,方便维护,An Introduction to Database System,第八章 数据库编程,8.1 嵌入式SQL 8.2 存储过程 8.3 SQL-SERVER T-SQL程序设计,An Introduction to Database System,SQL SERVER T-SQL 程序设计,An Introduction to Database System,SQL SERVERT-SQL 程序设计,一SQL-SERVER批处理 二 SQL-SERVER 存储过程 三SQL-SE

11、RVER 用户定义函数 四SQL-SERVER 游标 五SQL-SERVER 触发器,An Introduction to Database System,介绍 SQL 批处理,批处理,输出结果,An Introduction to Database System,下面的示例创建两个批处理。,GO 命令结束一个批处理 第一个批处理只包含一条 USE pubs 语句。 第二个批处理使用了一个局部变量,作用范围到GO。 USE pubs GO DECLARE NmbrAuthors int SELECT NmbrAuthors = COUNT(*) FROM authors PRINT The n

12、umber of authors as of + CAST(GETDATE() AS char(20) + is + CAST(NmbrAuthors AS char (10) GO,An Introduction to Database System,注释方式,SQL Server 支持下列两种类型的注释方式: 1)-(双连字符) 例如: USE Northwind GO - 单行注释 2)/* . */(正斜线 - 星号字符对) 例如: SELECT * FROM Employees /* 这是注释 */,An Introduction to Database System,控制语句,An

13、 Introduction to Database System,BEGIN.END,BEGIN.END:一组要执行的 T-SQL 语句可以包含在 BEGIN.END 中。 语法:,其中,statement 为语句,statement_block 为语句块。,BEGIN statement | statement_block END,An Introduction to Database System,IF.ELSE,IF.ELSE:可以根据指定的条件来执行不同的 SQL 语句。 语法:,IF Boolean_expression sql_statement|statement_block E

14、LSE sql_statement|statement_block ,An Introduction to Database System,IF 语句示例,IF (SELECT COUNT(ORDERID) FROM ORDERS)1 BEGIN END ELSE BEGIN END,单值子查询可以当做表达式,An Introduction to Database System,WHILE 循环,WHILE:可以根据某些条件来执行一条 SQL 语句或一组语句。只要指定的条件为真,则重复执行该语句。 语法:,WHILE Boolean_expression statement | stateme

15、nt_block BREAK statement | statement_block CONTINUE ,An Introduction to Database System,例题:,如果平均价格少于 30,将价格加倍,如果加价后最高价超过 50退出,否则继续价格加倍。 (价格price,表名titles),An Introduction to Database System,USE pubs GO WHILE (SELECT AVG(price) FROM titles) 50 BREAK ELSE CONTINUE END PRINT 调整完成!,单值子查询可以当做表达式,An Intro

16、duction to Database System,变量,SQL Server 在 T-SQL 中支持下列两种类 型的变量 全局变量 全局变量是SQL Server系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。 局部变量 自定义变量, 作用于局部,An Introduction to Database System,全局变量,SQL Server 中的全局变量都用 标记作为前缀。,An Introduction to Database System,全局变量列表,An Introduction to Database System,全局变量,可以使用PRI

17、NT 输出全局变量的值。,PRINT VERSION,An Introduction to Database System,局部变量,局部变量名必须以 为前缀 用DECLARE定义, 类型同表的列类型. 局部变量的作用域是在其中声明局部变量的批处理、存储过程或语句块。,DECLARE 姓名 CHAR(20) DECLARE 年龄 INT DECLARE 工资 FLOAT DECLARE 地址 VARCHAR(40) DECLARE SNO NUMERIC(5), SNAME CHAR(6) 变量的初值为空值null,An Introduction to Database System,为变量赋

18、值,SET 语句或 SELECT 语句用于给局部变量赋值。 语法:,DECLARE 姓名 CHAR(10) SET 姓名 =刘晨 或 SELECT 姓名 =刘晨 或 SELECT 姓名 =SNAME FROM STUDENT WHERE SNO=95001,An Introduction to Database System,局部变量的定义与赋值实例,DECLARE CUST CHAR(5) SET CUST=FRANK SELECT CUSTOMERID,COMPANYNAME FROM CUSTOMERS WHERE CUSTOMERID = CUST GO,An Introduction

19、 to Database System,变量值的输出 在T-SQL中,输出局部变量值或表达式值有以下两种格式: 格式一: select 局部变量名1,|表达式1, 功能:一次可输出若干个局部变量值或表达式的值。 例句:select x, y+100,格式二: print 局部变量名|表达式 功能:一次只能输出一个局部变量值或一个表达式的值。 例句:print x+4 print y,An Introduction to Database System,CASE 表达式,CASE:使用 CASE 关键字可以根据表达式是否为真来返回一个值。该关键字可用于允许使用表达式的任何地方。 语法:,CASE

20、 expression WHEN expression1 THEN expression1 WHEN expression2 THEN expression2 ELSE expression END,其中 expression 为表达式。,An Introduction to Database System,例: 调整员工工资工作级别为1 的上调8% 工作级别为2 的上调7%,工作级别为3 的上调6% 其它上调5% update employee set e_wage = case when job_level = 1 then e_wage*1.08 when job_level = 2 t

21、hen e_wage*1.07 when job_level = 3 then e_wage*1.06 else e_wage*1.05 end,An Introduction to Database System,批处理示例,GO 命令结束一个批处理 第一个批处理只包含一条 USE pubs 语句。 第二个批处理使用了一个局部变量,作用范围到GO。 USE pubs GO DECLARE NmbrAuthors int SELECT NmbrAuthors = COUNT(*) FROM authors PRINT The number of authors as of + CAST(GET

22、DATE() AS char(20) + is + CAST(NmbrAuthors AS char (10) GO,An Introduction to Database System,总结,批处理是客户端以一个单元发送的一条或多条 SQL 语句的集合。用GO结束. 控制流语句提供了条件操作所需的顺序和逻辑。 变量是可以存储数据值的对象。可以使用变量向 SQL 语句传递数据。,An Introduction to Database System,SQL SERVERT-SQL 程序设计,一SQL-SERVER批处理 二 SQL-SERVER 存储过程 三SQL-SERVER 用户定义函数 四

23、SQL-SERVER 游标 五SQL-SERVER 触发器,An Introduction to Database System,二 SQL-SERVER 存储过程,了解存储过程的优点 掌握常用的系统存储过程 掌握如何创建存储过程 掌握如何调用存储过程,An Introduction to Database System,存储过程(procedure)类似于C语言中的函数 用来执行管理任务或应用复杂的业务规则 存储过程可以带参数,也可以返回结果,int sum(int a,int b) int s; s =a+b; return s ; ,存储过程相当于C语言中的函数,什么是存储过程,An I

24、ntroduction to Database System,系统存储过程 由系统定义,存放在master数据库中 类似C语言中的系统函数 系统存储过程的名称都以“sp_”开头 用户自定义存储过程 由用户在自己的数据库中创建的存储过程 类似C语言中的用户自定义函数,存储过程的分类,An Introduction to Database System,常用的系统存储过程,An Introduction to Database System,EXEC sp_databases EXEC sp_renamedb Northwin,Northwind1 USE stuDB GO EXEC sp_tab

25、les EXEC sp_columns SC EXEC sp_help SC EXEC sp_helpconstraint SC EXEC sp_helpindex SC EXEC sp_helptext view1 EXEC sp_stored_procedures,常用的系统存储过程,修改数据库的名称(单用户访问),列出当前系统中的数据库,当前数据库中查询的对象的列表,返回某个表列的信息,查看表SC的结构信息,查看表SC的约束,查看表SC的索引,查看视图的语句文本,查看当前数据库中的存储过程,演示:常用的存储过程,An Introduction to Database System,定义存

26、储过程的语法 CREATE PROCEDURE 存储过程名 参数1 数据类型 = 默认值 OUTPUT, , 参数n 数据类型 = 默认值 OUTPUT AS SQL语句 GO 和C语言的函数一样,参数可选 参数分为输入参数、输出参数 输入参数允许有默认值,如何创建存储过程,An Introduction to Database System,创建不带参数的存储过程,问题:请创建存储过程,查看本次考试平均分以及未通过考试的学员名单,An Introduction to Database System,创建不带参数的存储过程,CREATE PROCEDURE proc_stu AS DECLAR

27、E writtenAvg float,labAvg float SELECT writtenAvg=AVG(writtenExam), labAvg=AVG(labExam) FROM stuMarks print 笔试平均分:+convert(varchar(5),writtenAvg) print 机试平均分:+convert(varchar(5),labAvg) IF (writtenAvg70 AND labAvg70) print 本班考试成绩:优秀 ELSE print 本班考试成绩:较差 print - print 参加本次考试没有通过的学员: SELECT stuName,st

28、uInfo.stuNo,writtenExam,labExam FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo WHERE writtenExam60 OR labExam60 GO,proc_stu为存储过程的名称,笔试平均分和机试平均分变量,显示考试成绩的等级,显示未通过的学员,An Introduction to Database System,EXECUTE(执行)语句用来调用存储过程 调用的语法 EXEC 过程名 参数,调用存储过程,EXEC proc_stu,An Introduction to Da

29、tabase System,创建带参数的存储过程,存储过程的参数分两种: 输入参数 输出参数,int sum (int a, int b) int s; s=a+b; return s; ,c=sum(5, 8),传入参数值,输入参数: 用于向存储过程传入值,类似C语言的按值传递;,输出参数: 用于在调用存储过程后, 返回结果,类似C语言的 按引用传递;,返回结果,An Introduction to Database System,带输入参数的存储过程,问题: 修改上例:由于每次考试的难易程度不一样,每次 笔试和机试的及格线可能随时变化(不再是60分),这导致考试的评判结果也相应变化。,分析

30、: 在述存储过程添加2个输入参数: writtenPass 笔试及格线 labPass 机试及格线,An Introduction to Database System,带输入参数的存储过程,CREATE PROCEDURE proc_stu writtenPass int, labPass int AS print - print 参加本次考试没有通过的学员: SELECT stuName,stuInfo.stuNo,writtenExam, labExam FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo WH

31、ERE writtenExamwrittenPass OR labExamlabPass GO,输入参数:笔试及格线,输入参数:机试及格线,查询没有通过考试的学员,An Introduction to Database System,带输入参数的存储过程,EXEC proc_stu 60,55,调用带参数的存储过程 假定本次考试机试偏难,机试的及格线定为55分,笔试及格线定为60分,机试及格线降分后,李斯文(59分)成为“漏网之鱼”了,An Introduction to Database System,带输出参数的存储过程,如果希望调用存储过程后,返回一个或多个值,这时就需要使用输出(OUT

32、PUT)参数了,问题: 修改上例,返回未通过考试的学员人数。,An Introduction to Database System,CREATE PROCEDURE proc_stu notpassSum int OUTPUT, writtenPass int=60, labPass int=60 AS SELECT stuName,stuInfo.stuNo,writtenExam, labExam FROM stuInfo INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo WHERE writtenExamwrittenPass OR

33、labExamlabPass SELECT notpassSum=COUNT(stuNo) FROM stuMarks WHERE writtenExamwrittenPass OR labExamlabPass GO,输出(返回)参数:表示没有通过的人数,推荐将默认参数放后,带输出参数的存储过程,统计并返回没有通过考试的学员人数,An Introduction to Database System,/*-调用存储过程-*/ DECLARE sum int EXEC proc_stu sum OUTPUT ,64 print - IF sum=3 print 未通过人数:+convert(va

34、rchar(5),sum)+ 人, 超过60%,及格分数线还应下调 ELSE print 未通过人数:+convert(varchar(5),sum)+ 人, 已控制在60%以下,及格分数线适中 GO,调用带输出参数的存储过程,带输出参数的存储过程,调用时必须带OUTPUT关键字 ,返回结果将存放在变量sum中,后续语句引用返回结果,An Introduction to Database System,可以使用PRINT语句显示错误信息,但这 些信息是临时的,只能显示给用户 RAISERROR 显示用户定义的错误信息时 可指定严重级别, 设置系统变量ERROR 记录所发生的错误等,处理存储过程

35、中的错误,An Introduction to Database System,使用RAISERROR 语句,RAISERROR (msg_str,severity, state ),RAISERROR语句的用法如下:,msg_str:用户定义的特定信息,最长255个字符 severity:定义严重性级别。用户可使用的级别为018级 state:表示错误的状态,1至127之间的值,An Introduction to Database System,CREATE PROCEDURE proc_stu notpassSum int OUTPUT, -输出参数 writtenPass int=60

36、, -默认参数放后 labPass int=60 -默认参数放后 AS IF (NOT writtenPass BETWEEN 0 AND 100) OR (NOT labPass BETWEEN 0 AND 100) BEGIN RAISERROR (及格线错误,请指定0100之间的分 数,统计中断退出,16,1) RETURN -立即返回,退出存储过程 END .其他语句同上例,略 GO,错误处理,使用RAISERROR 语句,An Introduction to Database System,执行速度更快 允许模块化程序设计 提高系统安全性 减少网络流通量,存储过程的优点,An Int

37、roduction to Database System,总结,存储过程是一组预编译的SQL语句,它可以包含数据操纵语句、变量、逻辑控制语句等 存储过程允许带参数,参数分为: 输入参数 输出参数 其中,输入参数可以有默认值。 输入参数:可以在调用时向存储过程传递参数,此类参数可用来向存储过程中传入值 输出参数从存储过程中返回(输出)值,后面跟随OUTPUT关键字 RAISERROR语句用来向用户报告错误,An Introduction to Database System,SQL SERVERT-SQL 程序设计,一SQL-SERVER批处理 二 SQL-SERVER 存储过程 三SQL-SE

38、RVER 用户定义函数 四SQL-SERVER 游标 五SQL-SERVER 触发器,An Introduction to Database System,三SQL-SERVER 用户定义函数,An Introduction to Database System,用户自定义函数,1用户函数的定义 用户自定义函数的语法格式如下: create function ( 参数名称1 变量类型1,) returns 变量类型 as begin 命令行或语句块 return 表达式 end,An Introduction to Database System,例题:编写一个函数,该函数的功能是接收传来的两

39、个 日期值,计算这两个日期值之间在年份上的差。 create function func1 -创建自定义函数 (birthday datetime,now datetime) -定义两个形式参数 returns tinyint -函数返回值的数据类型 as begin return datediff(yy,birthday,now) -函数体 end,An Introduction to Database System,用户函数的调用(同标准函数) 用户自定义函数的调用有以下两种格式: 格式一:select 函数名(实参表) 格式二:print 函数名(实参表) select 姓名, func

40、1(出生日期,GETDATE() 年龄 from 学生表,An Introduction to Database System,SQL SERVERT-SQL 程序设计,一SQL-SERVER批处理 二 SQL-SERVER 存储过程 三SQL-SERVER 用户定义函数 四SQL-SERVER 游标 五SQL-SERVER 触发器,An Introduction to Database System,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。 游标操作: 声明游标、打开游标、提取数据、关闭游标,An Introduction to Database System,

41、实例:,declare my_cursor cursor for select productname from product /*定义游标*/ open my_cursor /*打开游标执行游标中的SELECT*/ declare pname char(10) fetch next from my_cursor into pname /*读游标*/ while(fetch_status=0) /*fetch_status为0表示成功*/ begin print Product Name: + pname fetch next from my_cursor into pname /*读游标*

42、/ end close my_cursor /*关闭游标*/ DEALLOCATE my_cursor /*释放内存*/,An Introduction to Database System,SQL SERVERT-SQL 程序设计,一SQL-SERVER批处理 二 SQL-SERVER 存储过程 三SQL-SERVER 用户定义函数 四SQL-SERVER 游标 五SQL-SERVER 触发器,An Introduction to Database System,五 SQL-SERVER触发器,An Introduction to Database System,WHAT IS TRIGGE

43、R?,触发器是一种特殊的存储过程,它不能被显式地调用, 而是在往表中插入记录、更改记录或者删除记录时,当事件发生时,才被自动地激活。,An Introduction to Database System,为什么需要触发器(TRIGGER)呢?典型的应用就是银行的取款机系统,为什么需要触发器,帐户信息表bank,交易信息表transInfo,张三取钱200 问题: 没有自动修改张三的余额,张三开户1000元,李四开户1元,An Introduction to Database System,SQL-SERVER触发器的类型,DELETE 触发器 INSERT 触发器 UPDATE 触发器 ( 只

44、有语句级TRIGGER ),An Introduction to Database System,触发器触发时: 系统自动在内存中创建deleted表或inserted表 只读,不允许修改;触发器执行完成后,自动删除 inserted 表 临时保存了插入或更新后的记录行 可以从inserted表中检查插入的数据是否满足业务需求 deleted 表 临时保存了删除或更新前的记录行 可以从deleted表中检查被删除的数据是否满足业务需求,inserted 和deleted 表,An Introduction to Database System,inserted 和deleted 表,inser

45、ted表和deleted表存放的信息,An Introduction to Database System,创建触发器的语法:,SQL-SERVER如何创建触发器,CREATE TRIGGER trigger_name ON table_name FOR DELETE, INSERT, UPDATE AS T-SQL语句 GO,DELETE, INSERT, UPDATE指定触发器的类型,An Introduction to Database System,INSERT触发器,插入记录行,触发insert触发器。向inserted表中插入新行的副本,触发器检查inserted表中插入的新行数据

46、,确定是否需要回滚或执行其他操作,INSERT触发器的工作原理:,An Introduction to Database System,INSERT 触发器示例,问题: 解决上述的银行取款问题:当向交易信息表(transInfo)中插入一条交易信息时,我们应自动更新对应帐户的余额。,分析: 在交易信息表上创建INSERT触发器 从inserted临时表中获取插入的数据行 根据交易类型(transType)字段的值是存入/支取, 增加/减少对应帐户的余额。,An Introduction to Database System,-关键代码- CREATE TRIGGER trig_transInf

47、o ON transInfo FOR INSERT AS DECLARE type char(4),outMoney MONEY DECLARE myCardID char(10),balance MONEY SELECT type=transType,outMoney=transMoney, myCardID=cardID FROM inserted IF (type=支取) UPDATE bank SET currentMoney=currentMoney-outMoney WHERE cardID=myCardID ELSE UPDATE bank SET currentMoney=cu

48、rrentMoney+outMoney WHERE cardID=myCardID . GO,INSERT 触发器示例,从inserted表中获取交易类型、教员金额等,根据交易类型,减少或增加对应卡号的余额,An Introduction to Database System,DELETE触发器,删除记录行,触发delete触发器向deleted表中插入被删除的副本,触发器检查deleted表中被删除的数据,决定是否需要回滚或执行其他操作,DELETE触发器的工作原理:,An Introduction to Database System,问题: 当删除交易信息表时,要求自动备份被删除的数据到

49、表backupTable中 。,分析: 在交易信息表上创建DELETE触发器 被删除的数据可以从deleted表中获取,DELETE触发器示例,An Introduction to Database System,-关键代码- CREATE TRIGGER trig_delete_transInfo ON transInfo FOR DELETE AS print 开始备份数据,请稍后. IF NOT EXISTS(SELECT * FROM sysobjects WHERE name=backupTable) SELECT * INTO backupTable FROM deleted EL

50、SE INSERT INTO backupTable SELECT * FROM deleted print 备份数据成功,备份表中的数据为: SELECT * FROM backupTable GO,从deleted表中获取被删除的交易记录,DELETE触发器示例,An Introduction to Database System,UPDATE触发器,删除记录行,向deleted表中插入被删除的副本,检查deleted和inserted表中的数据,确定是否需要回滚或执行其他操作,UPDATE触发器的工作原理:,向inserted表中插入被添加的副本,插入记录行,An Introductio

51、n to Database System,问题: 跟踪用户的交易,交易金额超过20000元,则取消交易,并给出错误提示。,分析: 在bank表上创建UPDATE触发器 修改前的数据可以从deleted表中获取 修改后的数据可以从inserted表中获取,UPDATE触发器示例,An Introduction to Database System,-关键代码- CREATE TRIGGER trig_update_bank ON bank FOR UPDATE AS DECLARE beforeMoney MONEY,afterMoney MONEY SELECT beforeMoney=cur

52、rentMoney FROM deleted SELECT afterMoney=currentMoney FROM inserted IF ABS(afterMoney-beforeMoney)20000 BEGIN RAISERROR (每笔交易不能超过2万元,交易失败,16,1) ROLLBACK TRANSACTION END GO,从deleted表中获取交易前的余额,从inserted表中获取交易后的余额,UPDATE触发器,交易金额是否2万,回滚事务,撤销交易,An Introduction to Database System,列级 UPDATE 触发器,UPDATE触发器除了

53、跟踪数据的变化(修改)外,还可以检查是否修改了某列的数据 使用UPDATE(列)函数检测是否修改了某列,问题: 交易日期一般由系统自动产生,默认为当前日期。为了安全 起见,一般禁止修改,以防舞弊。,分析: UPDATE(列名)函数可以检测是否修改了某列,An Introduction to Database System,-关键代码- CREATE TRIGGER trig_update_transInfo ON transInfo FOR UPDATE AS IF UPDATE(transDate) BEGIN print 交易失败. RAISERROR (安全警告:交易日期不能修改, 由系

54、统自动产生,16,1) ROLLBACK TRANSACTION END GO,检查是否修改了交易日期列transDate,回滚事务,撤销交易,列级 UPDATE 触发器,An Introduction to Database System,在 employee 和 jobs 表之间使用触发器业务规则,由于 CHECK 约束只能引用定义了列级或表级约束的列,表间的任何约束(在下例中是指业务规则)都必须定义为触发器。 下例创建一个触发器,当插入或更新雇员工作级别 (job_lvls) 时,该触发器检查指定雇员的工作级别(由此决定薪水)是否处于为该工作定义的范围内。若要获得适当的范围,必须引用 job

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论