源码先锋

源码先锋

数据库基础05:存储过程、触发器的创建、执行、修改与删除

admin 9 7

本文介绍基于MicrosoftSQLServer软件,实现数据库存储过程与触发器的创建、执行、修改与删除等操作。

数据库系列文章请见专栏:数据库基础_疯狂学习GIS的博客-CSDN博客。

1交互式创建并执行——存储过程一

(1)启动MicrosoftSQLServer2008R2软件;

(2)在“对象资源管理器”窗格中,在“数据库”处右键,在弹出的菜单中选择“附加”选项;

(3)选择需要加以附加的jxsk数据库物理文件,选择定位文件夹“G:\sql\chutianjiasql”并选择对应数据库jxsk的物理文件并选择“确定”按钮,再次选择“确定”即可;

(4)在“对象资源管理器”中选择“数据库”→“jxsk”→“可编程性”→“存储过程”;右击,在弹出的窗口中选择“新建存储过程”选项;如下图;

(5)将原有模板语句:

--================================================--TemplategeneratedfromTemplateExplorerusing:--CreateProcedure(NewMenu).SQL----UsetheSpecifyValuesforTemplateParameters--command(Ctrl-Shift-M)tofillintheparameter--valuesbelow.----Thisblockofcommentswillnotbeincludedin--thedefinitionoftheprocedure.--================================================SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--=============================================--Author:Author,,Name--Createdate:CreateDate,,--Description:Description,,--=============================================CREATEPROCEDUREProcedure_Name,sysname,ProcedureName--Addtheparametersforthestoredprocedurehere@Param1,sysname,@p1Datatype_For_Param1,,int=Default_Value_For_Param1,,0,@Param2,sysname,@p2Datatype_For_Param2,,int=Default_Value_For_Param2,,0ASBEGIN--SETNOCOUNTONadd;--InsertstatementsforprocedurehereSELECT@Param1,sysname,@p1,@Param2,sysname,@p2ENDGO

修改为:

CREATEPROCEDUREPro_Qsinf@SNO_INCHAR(8)='S2',@SNAME_OUTCHAR(8)OUTPUT,@SAGE_OUTINTOUTPUT,@DEPT_OUTCHAR(10)OUTPUTASSELECT@SNAME_OUT=SN,@SAGE_OUT=AGE,@DEPT_OUT=DEPTFROMSWHERESNO=@SNO_IN

(6)单击对勾按钮进行语法检查,如下图;单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(7)在“对象资源管理器”中选择“数据库”→“jxsk”→“可编程性”→“存储过程”;看到已存在通过上述步骤建立的存储过程;

2交互式创建并执行——存储过程二

(1)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

USEjxskGODECLARE@SNO_INCHAR(8),@SNAME_OUTCHAR(8),@SAGE_OUTINT,@SDEPT_OUTCHAR(10)EXECPro_QsinfDEFAULT,@SNAME_OUTOUTPUT,@SAGE_OUTOUTPUT,@SDEPT_OUTOUTPUTPRINT@SNAME_OUTPRINT@SAGE_OUTPRINT@SDEPT_OUTSELECT@SNO_IN='S4'EXECPRO_QSINF@SNO_IN,@SNAME_OUTOUTPUT,@SAGE_OUTOUTPUT,@SDEPT_OUTOUTPUTPRINT@SNAME_OUTPRINT@SAGE_OUTPRINT@SDEPT_OUTGO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

3用T-SQL创建——存储过程一

(1)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

CREATEPROCEDUREPro_Qscore@SNAME_INCHAR(8),@CNAME_INCHAR(10),@SCORE_OUTTINYINTOUTPUTASSELECT@SCORE_OUT=SCOREFROMS,C,===@SNAME_INANDCN=@CNAME_IN

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3)在“对象资源管理器”中选择“数据库”→“jxsk”→“可编程性”→“存储过程”;看到已存在通过上述步骤建立的存储过程;

4用T-SQL创建——存储过程二

(1)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

USEjxskGODECLARE@SNAME_INCHAR(8),@CNAME_INCHAR(8),@SCORE_OUTTINYINTSELECT@SNAME_IN='李思'SELECT@CNAME_IN='程序设计'EXECPRO_QSCORE@SNAME_IN,@CNAME_IN,@SCORE_OUTOUTPUTPRINTRTRIM(@SNAME_IN)+'='+LTRIM(STR(@SCORE_OUT))GO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

5交互式修改存储过程

(1)在“对象资源管理器”中选择“数据库”→“jxsk”→“可编程性”→“存储过程”;右击存储过程Pro_Qsinf,在弹出的窗口中选择“修改”选项,如下图;

(2)将原有模板语句修改为

USE[jxsk]GO/******Object:StoredProcedure[dbo].[Pro_Qsinf]ScriptDate:04/26/201915:04:33******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOALTERPROCEDURE[dbo].[Pro_Qsinf]@SNO_INCHAR(2)='S2',@SNAME_OUTCHAR(8)OUTPUT,@SAGE_OUTTINYINTOUTPUT,@DEPT_OUTCHAR(10)OUTPUTASSELECT@SNAME_OUT=SN,@SAGE_OUT=AGE,@DEPT_OUT=DEPTFROMSWHERESNO=@SNO_IN

(3)单击对勾按钮进行语法检查,如下图;单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

6用T-SQL修改存储过程

(1)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

USEjxskGOALTERPROCEDUREPRO_QSINF@SNO_INCHAR(2)='S1',@SNAME_OUTCHAR(8)OUTPUT,@SSEX_OUTCHAR(2)OUTPUT,@DEPT_OUTCHAR(10)OUTASSELECT@SNAME_OUT=SN,@SSEX_OUT=SEX,@DEPT_OUT=DEPTFROMSWHERESNO=@SNO_INGO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

7交互式删除存储过程

(1)在“对象资源管理器”中选择“数据库”→“jxsk”→“可编程性”→“存储过程”;右击存储过程Pro_Qsinf,在弹出的窗口中选择“删除”选项;

(2)选择确定按钮,存储过程即被删除;如下图;

8用T-SQL删除存储过程

(1)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

USEjxskGODROPPROCEDUREPRO_QSCOREGO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;删除后结果如下下图;

9交互式为数据库表S创建一级联更新触发器——创建触发器

(1)在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“”;右击触发器,在弹出的窗口中选择“新建触发器”选项;如下图;

(2)窗口内原有语句为:

--================================================--TemplategeneratedfromTemplateExplorerusing:--CreateTrigger(NewMenu).SQL----UsetheSpecifyValuesforTemplateParameters--command(Ctrl-Shift-M)tofillintheparameter--valuesbelow.----SeeadditionalCreateTriggertemplatesformore--examplesofdifferentTriggerstatements.----Thisblockofcommentswillnotbeincludedin--thedefinitionofthefunction.--================================================SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--=============================================--Author:Author,,Name--Createdate:CreateDate,,--Description:Description,,--=============================================CREATETRIGGERSchema_Name,sysname,Schema__Name,sysname,Trigger_NameONSchema_Name,sysname,Schema__Name,sysname,Table_NameAFTERData_Modification_Statements,,INSERT,DELETE,UPDATEASBEGIN--SETNOCOUNTONadd;--InsertstatementsfortriggerhereENDGO

需将其更改为:

CREATETRIGGERTRIGGER_SONSFORUPDATEASIFUPDATE(SNO)BEGINDECLARE@SNO_NEWCHAR(2),@SNO_OLDCHAR(2)SELECT@SNO_NEW=SNOFROMinsertedSELECT@SNO_OLD=SNOFROMdeletedUPDATESCSETSNO=@SNO_NEWWHERESNO=@SNO_OLDEND

(3)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

10交互式为数据库表S创建一级联更新触发器——验证触发器

(1)查看数据库表S与SC,如下图;

(2)删除原有S与SC之间的外键关系;修改S表中S1为S9,执行操作,如下图;

(3)查看SC表中数据,发现其S1已改变为S9,且位置也发生相应变化,如下图;

11交互式为数据库表SC创建一限制更新触发器——创建触发器

(1)在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“”;右击触发器,在弹出的窗口中选择“新建触发器”选项;如下图;

(2)窗口内原有语句为:

--================================================--TemplategeneratedfromTemplateExplorerusing:--CreateTrigger(NewMenu).SQL----UsetheSpecifyValuesforTemplateParameters--command(Ctrl-Shift-M)tofillintheparameter--valuesbelow.----SeeadditionalCreateTriggertemplatesformore--examplesofdifferentTriggerstatements.----Thisblockofcommentswillnotbeincludedin--thedefinitionofthefunction.--================================================SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGO--=============================================--Author:Author,,Name--Createdate:CreateDate,,--Description:Description,,--=============================================CREATETRIGGERSchema_Name,sysname,Schema__Name,sysname,Trigger_NameONSchema_Name,sysname,Schema__Name,sysname,Table_NameAFTERData_Modification_Statements,,INSERT,DELETE,UPDATEASBEGIN--SETNOCOUNTONadd;--InsertstatementsfortriggerhereENDGO

需将其更改为:

CREATETRIGGERTRIGGER_SCONSCFORUPDATEASIFUPDATE(SNO)BEGINDECLARE@SNO_NEWCHAR(2),@SNO_OLDCHAR(2),@SNO_CNTINTSELECT@SNO_OLD=SNOFROMdeletedSELECT@SNO_CNT=COUNT(*)FROMSWHERESNO=@SNO_OLDIF@SNO_CNT0ROLLBACKTRANSACTIONEND

(3)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(4)查看数据库表S与SC,可发现在SC中有两条S9学号学生的记录如下两图;此时将SC中的第一条S9记录改为S1,发现修改后其数据再次恢复原有状态;如以下第三幅图;

12用T-SQL为数据库表SC创建触发器
USEjxskGOCREATETRIGGERSCORE_SC_TRIONSCFORINSERT,UPDATEASDECLARE@SCORE_READTINYINTSELECT@SCORE_READ=SCOREFROMinsertedIF@SCORE_READ=0AND@SCORE_READ=100BEGINPRINT'操作完成!'returnPRINT'成绩超出0-100之间,请重新输入。'ROLLBACKTRANSACTIONGO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3)在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“”→“触发器”,可看到通过上述步骤生成的触发器已存在;如下图;

(4)查看数据库表SC,如下图;

(5)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

INSERTINTOSCVALUES('S1','C5',190)GOINSERTINTOSCVALUES('S1','C5',100)GOUPDATESCSETSCORE=130WHERESNO='S2'ANDCNO='C5'GOUPDATESCSETSCORE=60WHERESNO='S2'ANDCNO='C5'GO

(6)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(7)可以在下方窗口中看到4条系统信息,表示:第1条INSERT语句因成绩为190超出范围,而要求重新输入;第2条INSERT语句因成绩为100在正常范围内,而插入表中;第3条UPDATE语句因成绩为130超出范围,而要求重新输入;第4条UPDATE语句因成绩为60在正常范围内,修改成功;查看数据库表SC的数据。在数据库表SC数据窗口中,单击感叹号按钮,更新表SC中的数据,如下图;可以看到增加了一个记录('S9”,“C5’,100),修改了一条记录('S2',C5',60),即是步骤中SQL语句执行的结果。

13用T-SQL为数据库表C创建级联删除触发器
USEjxskGOCREATETRIGGERTRIGGER_DCONCFORDELETEASDECLARE@CNO_DELCHAR(2)SELECT@CNO_DEL=CNOFROMdeletedDELETEFROMSCWHERECNO=@CNO_DELGO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句;

(3)在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“”→“触发器”,可看到通过上述步骤生成的触发器已存在;

(4)打开数据库表C与SC,发现在SC表中有三条关于C1的记录,如下图;

(5)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

USEjxskGODELETEFROMCWHERECNO='C1'GO

(6)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(7)在数据库表SC中发现课程C1有关的数据已经被删除;

14交互式修改数据库表S的触发器

(2)窗口内原有语句为:

USE[jxsk]GO/******Object:Trigger[dbo].[TRIGGER_S]ScriptDate:04/26/201916:25:16******/SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOALTERTRIGGER[dbo].[TRIGGER_S]ON[dbo].[S]FORUPDATEASIFUPDATE(SNO)BEGINDECLARE@SNO_NEWCHAR(2),@SNO_OLDCHAR(2)SELECT@SNO_NEW=SNOFROMinsertedSELECT@SNO_OLD=SNOFROMdeletedUPDATESCSETSNO=@SNO_NEWWHERESNO=@SNO_OLDEND

需将其更改为:

ALTERTRIGGERTRIGGER_SONSFORDELETEASDECLARE@SNO_DELCHAR(2)SELECT@SNO_DEL=SNOFROMdeletedWHERESNO=@SNO_DEL

(3)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(4)在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“”→“触发器”,双击原有触发器,发现其已被修改;

15用T-SQL修改数据库表C的触发器
USEjxskGOALTERTRIGGERTRIGGER_DCONCFORDELETEASDECLARE@CNO_DELCHAR(2)SELECT@CNO_DEL=CNOFROMdeletedDELETEFROMSCWHERECNO=@CNO_DELDELETEFROMTCWHERECNO=@CNO_DELGO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3)在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“”→“触发器”,双击原有触发器,发现其已被修改;

(4)在数据库表C中删除任意一条记录,发现数据库表SC与TC中记录也随之改变;

16交互式删除数据库表S的触发器

(2)在原有位置已看不到原有触发器;

17用T-SQL删除数据库表C的触发器

(1)单击屏幕上方“工具栏”菜单中的“新建查询”按钮,打开“查询编辑器”窗口,并在“查询编辑器”窗口中输入以下T-SQL语句:

USEjxskGODROPTRIGGERTRIGGER_DCGO

(2)单击“工具栏”中的“执行(x)”按钮,即可执行上述T-SQL语句,如下图;

(3)在“对象资源管理器”中选择“数据库”→“jxsk”→“表”→“”→“触发器”,已看不到原有触发器,如下图;