本书基于典型工作任务,系统地介绍了当今较为流行的SQL Server 2014数据库操作平台的具体使用,贯穿全书的案例是一个已经在实际环境下正常使用的系统,与通常目录分章节的写法不同,本书以数据库在实践开发中的应用为主线,以项目表述来规划目录,以案例展开知识点的方式详尽地介绍项目操作步骤和关键知识点。书中*后一个项目是数据库系统与Visual Studio开发系统相互结合,将典型案例进行完整的设计,便于读者学、练、用,动脑与动手有机地结合,为以后进一步学习和使用SQL Server 2014数据库环境开发应用系统夯实基础。本书分基础讲解篇和实践训练篇,继基本理论篇之后,在实践训练篇中通过内容丰富的实训练习,不仅可加深读者对SQL Server 2014知识要点与操作界面的理解,而且有利于读者在实际项目的开发过程中灵活自如地应用数据库系统。 无论是对数据库系统的初学者,还是应用*版本数据库系统从事软件项目的开发工作人员,本书都是一本具有实用价值的参考书籍。
数据库的设计与实现课程是计算机类多种专业的必修课,更是一门培养学生实践动手能力的骨干核心课。数据库技术发展速度之快,应用领域之广,在计算机领域的新技术中可谓名列前茅,是当今时代信息化管理的重要工具。SQL Server 2014数据库系统在SQL Server家族中是最新版本,在继承以往众多版本各自优势的基础上,又新增了全新的inmemory事务处理功能、快速灾难恢复功能、本地到云端数据平台一致性处理功能、实现云中新一代Web、移动应用与企业、商业、智能化程序开发的功能等。因此,SQL Server 2014数据库系统以其全新的功能和独具特色的优势,在计算机软件领域是最为流行、最受开发人员欢迎、使用频率较高的一款数据库系统。本书作者多年从事软件技术专业的基础课和专业核心骨干课的教学工作,能够熟练地将SQL Server数据库系统运用于教学之中,掌握了大量的教学案例和实训案例,积累了丰富的教学经验,并且每位作者都参与过真实软件项目的开发工作,具有一定的软件系统和数据库系统设计与开发的阅历。本书的编写紧密结合数据库系统设计与开发的基本原理,利用典型案例详尽讲解SQL Server 2014系统的知识要点,并且与Visual Studio 2010软件集成开发环境综合应用融会贯通,实现学以致用的目的。另外,本书遵循理论知识够用,注重实践操作能力培养的原则,一改以往常态化的编写风格,本书的编写架构分为基础讲解篇和实践训练篇,通过大量的实训练习对所讲解的理论知识可以较好地联系实践,起到举一反三,深化理解的目的,力求使本书符合应用型本科和高职高专的教学特点及人才培养模式的具体要求。本书突出的特色为: 基于典型的工作任务、案例驱动、循序渐进、深入浅出、实例丰富、图文并茂、注重实用性、要求读者起点低,能全面提升读者的综合应用能力和动手开发能力。通过案例的操作引出知识点,将学与用有机结合,将枯燥无味的理论知识以丰富多彩的案例方式引出,便于读者学以致用。在本书中使用的案例是经过修改之后的真实项目,该项目在实践中已经正常投入运行,依托项目实际开发的主线,将数据库在实践开发中的规划与设计过程划分成若干子项目,最后一个项目是对前面所有项目的总结,并且结合Visual Studio开发环境使学生成绩管理系统得到实现,在教材的编辑过程中达到形散而神不散的效果。每一个项目的讲解都是以项目需求分析、项目操作步骤、关键知识点讲解、项目拓展训练、项目总结等作为编写顺序,将案例的难点与重点在项目操作中潜移默化地灌输给读者,通过相关的拓展训练达到举一反三的目的。尤其是,在实践训练篇中以图书管理系统为依托,精心设计了大量的实训题目,不仅提炼出设计与开发数据库系统必备的知识点,而且强化了对数据库系统的实践操作。另外,将项目的操作步骤、拓展训练步骤、讲解知识点的PPT电子课件等均做成动态视频,利用二维码扫描技术,使读者随时观看微课视频,减轻学习压力,增强读者学习该门课程的愉悦感,实现事半功倍的学习效果。全书分为两大部分,分别是基础讲解篇和实践训练篇。在基础讲解篇中共设置了8个项目,重点讲解数据库平台的搭建操作、对学生成绩管理系统数据库的规划、数据库和数据表的创建与维护、索引和视图的设计与应用、存储过程和触发器的规划与使用、利用TSQL语句进行深度编程、对数据库的安全性和健壮性实施设置与管理等,并且依托SQL Server 2014数据库系统和Visual Studio 2010集成开发平台完成学生成绩管理系统的设计与实现。在实践训练篇中总共设置了22个实训项目,完成对图书管理系统数据库的创建与维护操作,对数据表的创建与维护操作,对数据记录内容的增、删、改、查等基本操作,对数据完整性的设置操作,利用局部变量和TSQL语句实现数据库系统的深度开发,对索引、视图、触发器、自定义函数、游标、事务、锁等功能的创建与使用,对各种类型存储过程的建立与执行,对数据库系统安全性的设置与管理以及对数据信息完整性的日常维护与管理等。适用本书的读者主要有: 应用型本科和高职院校软件技术专业、软件测试专业、手机软件开发专业、游戏软件开发专业、软件外包专业、网络技术专业、计算机应用专业等的在校学生;对SQL Server数据库系统了解较少、起点较低的读者;对数据库系统感兴趣,希望快速掌握SQL Server 2014基础知识的读者及利用SQL Server 2014实施软件开发的读者等。本书由天津电子信息职业技术学院郎振红老师担任主编,廉彦平、文丽丽、周广惠等老师参与编写。在编写过程中得到了作者所在学院领导的大力支持,清华大学出版社编辑给予了悉心指导和热情帮助,在此谨向他们表示衷心的感谢!为方便读者,本书的相关操作配备了二维码。本书虽然倾注了作者的努力,但是由于作者水平所限,编写时间仓促,书中难免会存在疏漏之处,敬请各位同仁和广大读者批评指正。编者联系邮箱: hong05172006@126.com。
编者2017年2月
项目五规划与使用存储过程和触发器学习目标:通过本项目的理论学习与实践训练使读者了解存储过程与触发器的含义;理解存储过程和触发器的作用;掌握根据需要创建、修改、删除存储过程带输入、输出参数;能够熟练创建、修改、删除触发器;在实际应用开发时能够灵活运用触发器完成业务规则以达到简化系统整体设计的目的。一、 项目需求分析在学生成绩管理系统的实际应用中,常需要重复执行一些数据操作。使用存储过程,可以将TransactSQL语句和控制流语句预编译到集合并保存到服务器端,它使得管理数据库、显示关于数据库及其用户信息的工作更为容易。而触发器是一种特殊类型的存储过程,在用户使用一种或多种数据修改操作来修改指定表中的数据时被触发并自动执行,通常用于实现复杂的业务规则,更有效地实施数据完整性。为了方便用户,也为了提高执行效率,SQL Server 2014中的存储过程、触发器可以用来满足这些应用需求。它们是SQL Server程序设计的灵魂,掌握和使用好它们对数据库的开发与应用非常重要。本项目主要介绍存储过程和触发器的使用。二、 项目操作步骤[45]1. 建立简单的存储过程创建一个存储过程stu_inf,从学生信息表中查询软件技术专业所有女生的学生信息。1 启动SQL Server Management Studio之后,在标准工具栏上选择新建查询按钮,如图5.1所示。2 打开新建查询对话框,在窗口的编辑区输入创建简单存储过程的语句如图5.2所示。具体TSQL语句代码如下: use stuscoremanagegoCREATE PROCEDURE str_infASSELECT FROM studentinfo WHERE S_special=''软件技术''and S_sex=''女''GO图5.1打开新建查询窗口图5.2在新建查询窗口输入语句3 在工具栏上单击分析按钮,检查SQL语句的语法,若在消息框中显示命令已成功完成,则说明输入的信息语法正确。4 单击执行按钮,查看执行结果,如图5.3所示。5 在对象资源管理器中依次展开数据库节点、stuscoremanage数据库节点、可编程性节点、存储过程节点,在存储过程节点下有一个名为stu_inf的存储过程,说明已经成功地创建了一个存储过程,如图5.4所示。图5.3查看执行结果一图5.4新建后的存储过程2. 执行存储过程1 启动SQL Server Management Studio之后,在标准工具栏上选择新建查询按钮,如图5.5所示。2 打开新建查询对话框,在窗口的编辑区输入执行简单存储过程的语句,如图5.6所示。具体TSQL语句代码如下: use stuscoremanageexec str_inf图5.5打开新建查询窗口图5.6在新建查询窗口输入语句3 在工具栏上单击分析按钮,检查SQL语句的语法,若在消息框中显示命令已成功完成,则说明输入的信息语法正确。4 单击执行按钮,查看执行结果,显示软件技术专业所有女生的学生信息,如图5.7所示。图5.7查看执行结果二3. 设计并应用触发器创建INSERT触发器chenc_trig: 在数据库stuscoremanage中创建一个触发器,当向gradeinfo成绩信息表插入一记录时,检查该记录的学生ID号在studentinfo学生信息表是否存在,检查课程ID号在courseinfo课程信息表中是否存在,若有一项不存在,则不允许插入。1 启动SQL Server Management Studio之后,在对象资源管理器中依次展开数据库节点、stuscoremanage数据库节点。2 单击工具栏上的新建查询按钮,打开TSQL语句编辑器,建立一个新的查询。3 在语句编辑窗口中输入如下TSQL代码:USE stuscoremanageGOCREATE TRIGGER chenc_trigON gradeinfoFOR INSERTASIF EXISTSSELECT FROM inserted WHERE S_ID NOT IN SELECT S_ID FROM studentinfo OR C_ID NOT INSELECT C_ID FROM courseinfoBEGINRAISERROR''违背数据的一致性.'',16,1ROLLBACK TRANSACTIONENDGO4 在工具栏上单击分析按钮,检查SQL语句的语法,若在消息框中显示命令已成功完成,则说明输入的信息语法正确。5 经检查无误后,单击工具栏上的执行按钮,执行指定的SQL语句,该命令执行完毕,消息框中显示命令已成功完成,说明该触发器已成功建立。6 在对象资源管理器中依次展开数据库节点、stuscoremanage数据库节点、表节点、gradeinfo数据表节点,找到触发器项,在触发器节点下有一个名为chenc_trig的触发器,说明已经成功地创建了一个触发器,如图5.8所示。图5.8新建后的触发器7 在新建查询窗口中输入如下TSQL语句,在gradeinfo数据表中插入数据,以便验证触发器能否被自动执行,运行结果如图5.9所示。INSERT gradeinfo VALUES''201409010100005'',''0020'',85,''2016-1-10''GO图5.9触发器激活提示由于在studentinfo学生信息表中不存在学生ID为201409010100005的学生或者在courseinfo课程信息表中不存在课程ID为0020的课程,所以显示错误提示信息。三、 关键知识点讲解[45]1. 存储过程的概念存储过程就是在SQL Server数据库中存放的查询,是存储在服务器中的一组预编译过的TSQL语句,而不是在客户机上的前端代码中存放的查询。存储过程除减少网络通信流之外,还有如下优点。1 存储过程在服务器端运行,执行速度快。存储过程是预编译过的,当第一次调用以后,就驻留在内存中,以后调用时不必再进行编译,因此,它的运行速度比独立运行同样的程序要快。2 简化数据库管理。例如,如果需要修改现有查询,而查询存放在用户机器上,则要在所有的用户机器上进行修改。如果在服务器中集中存放查询并作为存储过程,只需在服务器上改变一次即可。3 提供安全机制,增强数据库安全性。通过授予对存储过程的执行权限而不是授予数据库对象的访问权限,可以限制对数据库对象的访问,在保证用户通过存储过程操纵数据库中数据的同时,可以保证用户不能直接访问存储过程中涉及的表及其他数据库对象,从而保证了数据库数据的安全性。另外,由于存储过程的调用过程隐藏了访问数据库的细节,也提高了数据库中的数据安全性。4 减少网络流量。如果直接使用TSQL语句完成一个模块的功能,那么每次执行程序时都需要通过网络传输全部TSQL。若将其组织成存储过程,这样用户仅仅发送一个单独的语句就实现了一个复杂的操作,需要通过网络传输的数据量将大大减少。2. 存储过程的分类在SQL Server中存储过程主要分为两类: 系统存储过程和用户自定义存储过程。其中,系统存储过程主要存储在master数据库中并以sp_为前缀,在任何数据库中都可以调用,在调用时不必在存储过程前加上数据库名。然而,用户自定义存储过程由用户自己根据需要而创建,是用来完成某项特定任务的存储过程。3. 利用TSQL语句创建存储过程的语法格式简单的存储过程类似于给一组SQL语句起个名字,然后就可以在需要时反复调用;复杂一些的则需要输入和输出参数。创建存储过程前,应注意下列几个事项。1 存储过程只能定义在当前数据库中。2 存储过程的名称必须遵循标识符的命名规则。3 不要创建任何使用sp_作为前缀的存储过程。语法格式: CREATE PROC\[EDURE\] procedure_name\[@parameterdata_type \[=default\]\[OUTPUT\]\]\[,\]AS sql_statement说明:1 procedure_name: 存储过程的名称,在当前数据库结构中必须唯一。2 @parameter: 存储过程的形参名,必须以@开头,参数名必须符合标识符的规则,data_type 用于说明形参的数据类型。3 default: 存储过程输入参数的默认值。如果定义了default值,则无须指定此参数值,即可执行存储过程。默认值必须是常量或NULL。如果存储过程使用带LIKE关键字的参数,则可包含通配符: %、_、\[\]和\[^\]。4 OUTPUT: 指定输出参数。此选项的值可以返回给调用EXECUTE的语句。5 sql_statement: 要包含在存储过程中的任意数量的TSQL语句。4. 执行存储过程存储过程创建成功后,保存在数据库中。在SQL Server中可以使用EXECUTE命令来直接执行存储过程。语法格式: \[EXEC\[UTE\]\] procedure_name\[value|@variable OUTPUT\]\[,\]说明:1 EXECUTE: 执行存储过程的命令关键字,如果此语句是批处理的第一条语句,可以省略此关键字。2 procedure_name: 指定存储过程的名称。3 value为输入参数提供实值,@variable为一个已定义的变量,OUTPUT紧跟在变量后,说明该变量用于保存输出参数返回的值。4 当有多个参数时,彼此用逗号分隔。5. 修改存储过程存储过程的修改是由ALTER语句来完成的。语法格式: ALTER PROC\[EDURE\] procedure_name\[@parameterdata_type \[=default\]\[OUTPUT\]\]\[,\]AS sql_statement6. 删除存储过程当不再使用某个存储过程时,就需要把它从数据库中删除。删除存储过程可以使用TSQL中的DROP命令,DROP命令可以将一个或多个存储过程从当前数据库中删除。语法格式: DROP PROC\[EDURE\] procedure_name \[,\]7. 触发器的概念触发器是一类特殊的存储过程,它作为一个对象存储在数据库中。触发器为数据库管理人员和程序开发人员提供了一种保证数据完整性的方法。触发器是定义在特定的表或视图上的。当有操作影响到触发器保护的数据时,例如,数据表发生了INSERT、UPDATE或DELETE操作时,如果该表有对应的触发器,这个触发器就会自动激活执行。8. 触发器的功能SQL Server 2014提供了两种方法来保证数据的有效性和完整性: 约束和触发器。触发器是针对数据库和数据表的特殊存储过程,它在指定的表中的数据发生改变时自动生效,并可以包含复杂的TSQL语句,用于处理各种复杂的操作。SQL Server将触发器和触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到严重错误,则整个事务即自动回滚,恢复到原来的状态。9. 触发器的类型在SQL Server 2014中,根据激活触发器执行的TSQL语句类型,可以把触发器分为两类: 一类是DML触发器,另一类是DDL触发器。1 DML触发器DML触发器是当数据库服务器中发生数据操作语言DML事件时执行的特殊存储过程,如INSERT、UPDATE或DELETE等。DML触发器根据其引发的时机不同又可以分为AFTER触发器和INSTEAD OF触发器两种类型。1 AFTER触发器。在执行了INSERT、UPDATE或DELETE语句操作之后执行AFTER触发器。它主要用于记录变更后的处理或检查,一旦发现错误,也可以使用ROLLBACK TRANSACTION语句来回滚本次的操作。2 INSTEAD OF触发器。这类触发器一般是用来取代原本要进行的操作,是在记录变更之前发生的,它并不去执行原来的SQL语句里的操作,而是去执行触发器本身所定义的操作。2 DDL触发器DDL触发器是当数据库服务器中发生数据定义语言DDL事件时执行的特殊存储过程,如CREATE、ALTER等。DDL触发器一般用于执行数据库中的管理任务,如审核和规范数据库操作,防止数据库表结构被修改等。10. inserted表和deleted表每个触发器有两个特殊的表: inserted表和deleted表。这两个表建在数据库服务器的内存中,是由系统管理的逻辑表,而不是真正存储在数据库中的物理表。对于这两个表,用户只有读取的权限,没有修改的权限。这两个表的结构与触发器所在数据表的结构是完全一致的,当触发器的工作完成之后,这两个表也将从内存中删除。1 inserted表里存放的是更新前的记录: 对于插入记录操作来说,inserted表里存储的是要插入的数据;对于更新记录操作来说,inserted表里存放的是要更新的记录。2 deleted表里存放的是更新后的记录: 对于更新记录操作来说,deleted表里存放的是更新前的记录;对于删除记录操作来说,deleted表里存放的是被删除的旧记录。由此可见,在进行INSERT操作时,只影响inserted表;进行删除操作时,只影响deleted表;进行UPDATE操作时,既影响inserted表也影响deleted表。11. 利用TSQL语句创建触发器的语法格式CREATE TRIGGER trigger_nameON{ table | view }{\[FOR|AFTER\]|INSTEAD OF}{\[INSERT \]\[,\]\[UPDATE\]\[,\]\[DELETE\]}\[WITH ENCRYPTION\]AS\[IF UPDATEcotumn_name\[{AND|OR} UPDATEcotumn_name\]\[n\]\]SQL_statement说明:1 trigger_name: 触发器的名称。每个 trigger_name 必须遵循标识符规则,但 trigger_name不能以 # 或 ## 开头,不与其他数据库对象同名。