`
sjk2013
  • 浏览: 2176032 次
文章分类
社区版块
存档分类
最新评论

数据库程序设计中的约束、触发器和存储过程

 
阅读更多

上篇博客中所说的对于表操作的几种限制少分析了触发器。这次从对表设计的角度来着重分析约束和触发器的关系,并进一步扩展比较触发器和存储过程。但在看该篇博客前强烈建议大家好好读下我的上一篇博客约束与数据库对象规则、默认值的探究

首先,从图上来比较三者的关系:

触发器不仅能够保证数据的完整性,而且还可以封装复杂的T-SQL逻辑处理语句,在功能上类似于存储过程,所

以触发器又是一种特殊的存储过程。但是存储过程的执行是我们使用Exec主观调用的,而触发器是经过一种事件操作

后自动被调用的。

在拆开分析约束和触发器、触发器和存储过程之前我们穿插点外话。在数据库程序设计中包含有多种数据模型:

20世纪60年代后期,在文件系统基础上发展起来的层次模型、网状模型和关系模型等传统数据模型;20世纪70年代

后期产生的E-R数据模型;20世纪80年代以来又相继推出面向对象数据模型、基于逻辑的数据模型等新的模型。下

图关系数据库中的关键术语和语义对象模型及ER图中使用的术语之间的映射关系:

数据库中正式术语

文件

SOM

E-R

关系

文件

实体集合

元组

记录

对象

实体

属性

属性

属性

上面的内容只存在了解而已,不用深究。

●数据完整性和业务规则

在上篇博客我已经简单介绍了数据完整性,接下来我们详细说下数据完整性和业务规则。

一、数据完整性

数据完整性=可靠性+准确性,这里我们要清楚一下两点:

数据存放在表中

创建表的时候,就应当保证以后数据输入是正确的(错误的数据、不符合要求的数据不允许输入)

为了保证数据的完整性我们经常使用完整性约束来确保数据的完整性。数据完整性,主要包括下面四部分:

二、业务规则

业务规则听起来很难理解,当然它也是值得我们深究东西,通俗的讲它其实是符合实际条件。如:某商店规定

一个售货员在一个月内售出10个以上的热浴盆,那么奖励2000元;某公司的订单上必须含有客户的姓名和联系方式等

等,这些都是简单的业务规则。从数据库的角度看,业务规则就是约束。

●约束和触发器

MS SQL Server提供了两种主要的机制进行强制业务规则和数据的完整性:约束和触发器。在作用上约束支持的触

发器都可以实现,它们两者是相容的关系,如下图。虽然两者在作用关系上有重合的地方,但是相较两者的执行效率

和维护难易来说,触发器是远远不如约束的。所以约束能实现的情况下编程人员是不会选择触发器的。

一、约束,上篇博客我已经着重讲解了约束的概念,这里不再深究。

SQL Server中存在五种约束:

约束的目的:确保表中数据的完整型

常用的约束类型:

主键约束(Primary Key Constraint):要求主键列数据唯一,并且不允许为空

唯一约束(Unique Constraint):要求该列唯一,允许为空,但只能出现一个空值。

检查约束(Check Constraint):某列取值范围限制、格式限制等,如有关年龄的约束

默认约束(Default Constraint):某列的默认值,如我们的男性学员较多,性别默认为

外键约束(Foreign Key Constraint):用于两表间建立关系,需要指定引用主表的那列

二、触发器,首先在下表中来看触发器的基本结构。

触发器是一种对表进行插入、删除、更改的时候自动运行的特殊的存储过程。它一般用在比核查约束更为复杂

的约束中。但能用约束实现的功能,一般不用触发器。

接下来我们从代码中认识下几种触发器。

       --#Update型触发器
	If exits(select name from sysobjects where name=’tgr_update’)
	Drop trigger tgr_update
	Go
	Create trigger tgr_update on student
		for update
	As
		If (Update(student_ID))
			Print ‘更改成功!’
		Else
			Begin 
				Raiserror(‘系统提示:更新发生错误’,16,1)
				Rollback tran
			End
	Go
	--测试
	Update student set student_ID=10002 where student_ID=10001       

注意:在创建触发器时,创建触发器必须是批处理的第一行,存储过程也是如此。

     --# instead of 触发器
          if (object_id('tgr_classes_inteadOf', 'TR') is not null)
           drop trigger tgr_classes_inteadOf
         go
         create trigger tgr_classes_intead Of
               on classes
         instead of delete/*, update, insert*/
         as
            declare @id int, @name varchar(20);
            --查询被删除的信息,病赋值
              select @id = id, @name = name from deleted;
            print 'id: ' + convert(varchar, @id) + ', name: ' + @name;
            --先删除student的信息
              delete student where cid = @id;
            --再删除classes的信息
              delete classes where id = @id;
            print '删除[ id: ' + convert(varchar, @id) + ', name: ' + @name + ' ] 的信息成功!';
         go
         --test
         select * from student order by id;
         select * from classes;
         delete classes where id = 7;

# 启用、禁用触发器

     --禁用触发器
       disable trigger tgr_message on student;
     --启用触发器
       enable trigger tgr_message on student;

# 显示自定义消息raiserror

   if (object_id('tgr_message', 'TR') is not null)
        drop trigger tgr_message
   go
   create trigger tgr_message
        on student
      after insert, update
   as raisError('tgr_message触发器被触发', 16, 10);
   go
   --test
   insert into student values('lily', 22, 1, 7);
   update student set sex = 0 where name = 'lucy';
   select * from student order by id;

触发器的应用种类繁多上面的几个示例都是比较常用的,当然最好的熟练方法就是多用,多练。

●触发器和存储过程

触发器是一种特殊的存储过程,不是由用户直接调用。而存储过程是一组T-SQL语句,经过编译后可以被多次调

用。类似于其它编程语言中的过程。它可以接收输入参数、输出参数、

返回单个或多个结果集以及返回值。

存储过程分为三类:

1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,

sp_help就是取得指定对象的相关信息

2.扩展存储过程XP_开头,用来调用操作系统提供的功能

exec master..xp_cmdshell 'ping 10.8.16.1'

3.用户自定义的存储过程,这是我们所指的存储过程

常用格式

Create PRocedure procedue_name
   [@parameter data_type][output]
   [with]{recompile|encryption}
   as
        sql_statement
--解释:  
--output:表示此参数是可传回的
--with {recompile|encryption}
--recompile:表示每次执行此存储过程时都重新编译一次
--encryption:所创建的存储过程的内容会被加密

举例:

有如下表量表

result_Info

Student_ID

Name

result

1

张红

70

2

马力

80

Student_Info

Student_ID

Sex

Grade

1

一年级

2

二年级

#创建返回参数的存储过程

If exists(select name from sysobjects where name=’proc_return’ and type=’P’)
	Drop proc proc_return
	Go
	Create proc proc_return  
@param1 int,
			@param2 char(10),
			@param3 char(10)
			@param4 int output
	With encryption    --加密
	As
		Insert into student_Info(student_ID,name,result) values(@param1,@param2,@param3)
		Select @param4=sum(result) from student_Info
		Print ‘总分为:’ & convert(char,@param)
	Go
	--调用测试
	Declare @sumresult int
	Exec proc_return 12,’王刚’,80,@sumresult
	Go


存储过程的3种传回值:

1.Return传回整数

2.output格式传回参数

3.Recordset

传回值的区别:

outputreturn都可在批次程式中用变量接收,recordset则传回到执行批次的客户端中

#创建一个存储过程,实现将表一和表二合并,该表只含Student_IDNamesexresult,将临时表存放在存储过

程中。

If exists(select name from sysobjects where name=’proc_save’ and type=’P’)
	Drop proc proc_return
	Go
	Create proc proc_save
	As	
		Select r.student_ID,r.Name,r.result,s.sex into #temptable from result r inner join student s on                 r.student_ID=s.student_ID
	If @@error=0
		Print ‘Successed’
	Else
		Print ‘Failed’
	Go

存储过程的应用类型还有很多,这里我只介绍了在编程时常用的两种。

●总结

在进行数据库程序设计时,数据的完整性是编程人员必须要考虑的,但是有时候这些知识的细节却让我们纠结的

很,搞不清改用哪个。总之吧:能用存储过程实现的不用触发器;能用约束实现的不用触发器,约束和存储过程用哪

个都可以。

有些不懂得地方在SQL Server中按F1,在SQL Server联机丛书的索引中查找可以解决我们的一切矛盾。


分享到:
评论

相关推荐

    数据库课程设计题目汇总.doc

    二、课程设计报告提纲 (1) 课程设计的题目、系统的总体功能描述 (2) 需求分析(概括描述、DFD、DD) (3) 数据库概念结构设计(局部E-R图、基本E-R图) (4) 数据库逻辑结构设计(关系模式—列表形式、存储过程、触发器、...

    数据库设计参考模板.doc

    表及索引数据量的估算及物理存储参数的设置 索引的设计 存储过程的设计 视图描述 用约束和触发器来强制执行业务规则 四、运用设计 4.1数据字典设计 4.2安全保密设计 ----------------------- 数据库设计参考模板全文...

    图书管理系统数据库设计-MYSQL实现(3).docx

    触发器设计 4 这是一个简单的图书管理系统的MYSQL设计,包含了数据插入,删除,定时器,触发器设计 给出设计的表名、结构以及表上设计的完整性约束。tudent: 5 这是一个简单的图书管理系统的MYSQL设计,包含了数据插入,...

    数据库设计与优化.pdf

    1.3.6 数据库物理存储和环境的设计 在设计阶段,可以对数据库的物理存储、操作系统环境、网络环境进行必要的设计,使得我们的系统在将来能适应比 较多的用户并发和比较大的数据量。 这里需要注意文件组的作用,适用...

    SQLServer2000高级编程技术-已添加书签,想学存储过程、SQL编程务必要看,分析非常透彻

    11.11.4 使用存储过程、用户定义函数和视图来管理应用程序安全 11.11.5 使用一个代理用户来管理应用程序安全 11.11.6 使用应用程序角色来管理应用程序安全 11.12 小结 11.13 练习 第12章 SQL Server 2000中的XML支持...

    数据库设计和部署软件BDB 专业版V2.6

    可迁移的数据对象包括: 数据表,索引,约束,缺省值,触发器,视图,存储过程,函数以及数据表数据。 <br>5,查询分析 数据库快速查询分析功能。可进行数据表数据查询,编辑及导出操作: A,提供专用...

    实验六-触发器实验报告.doc

    建立触发器 CREATE [OR REPLACE] TRIGGER <触发器名> BEFORE"AFTER INSERT"DELETE"UPDATE OF <列名> ON <表名> [FOR EACH ROW] WHEN (<条件>) 程序块> ON 子句中的名称识别与数据库触发器关联的数据库表 触发器事件...

    网吧管理系统数据库课程设计.doc

    5.3 Check约束 5.5 触发器设计 第6章 数据库视图设计 第7章 数据库存储过程设计 第8章 权限设计 总结 参考文献 第一章 需求分析 1.1 需求分析的任务 调查网吧管理系统应用领域涉及的内容,对涉及到领域的各个应用的...

    数据库设计规范模板.pdf

    实体类型前缀定义 各数据库实体类型前缀定义如下表所示: 表 1 实体类型前缀定义 实体类型 实体类型前缀 表 T 分区 TP 主键 PK 外键 FK Check约束 CK 普通视图 V 物化视图 MV 索引 IX 函数 FN 存储过程 SP 触发器 ...

    数据库课程设计 学生信息管理系统 VB+SQL 数据库 课程设计

    里面有很多的图可供使用。在sql server2000 上实现数据库的模型建立(数据库、表的建立、完整性约束的实现、关系图、必要的存储过程及触发器的编程),并用VB实现简单的应用程序。

    数据库课程设计(图书管理系统).doc

    第一章 前言 1 第二章 数据库设计需求分析和系统设计 2 1.1 需求分析 2 1.2 任务概述 3 1.2.1目标 3 1.2.2运行环境 3 1.3数据字典 4 1.3.1数据项 4 1.3.2数据结构 4 1.33数据流 4 1.3.4数据存储 4 1.3.5处理过程 ...

    二级MySQL数据库程序设计(一)

    第11章 存储过程与存储函数 第12章 访问控制与安全管理 第13章 备份与恢复 第14章 PHP和MySQL数据库编程 第15章 开发实例 文章目录1. 数据库的基本概念与设计方法1.1 数据库的基本概念1.2 数据库的特点1.3 数据库的...

    SQLServer2000高级编程技术(part02)-想学存储过程 SQL编程 务必要看

    11.11.4 使用存储过程、用户定义函数和视图来管理应用程序安全 11.11.5 使用一个代理用户来管理应用程序安全 11.11.6 使用应用程序角色来管理应用程序安全 11.12 小结 11.13 练习 第12章 SQL Server 2000中的XML支持...

    二级MySQL数据库程序设计(三)

    第11章 存储过程与存储函数 第12章 访问控制与安全管理 第13章 备份与恢复 第14章 PHP和MySQL数据库编程 第15章 开发实例 文章目录本章学习流程图本章学习大纲3. 数据库和表3.1 创建与使用数据库3.1.1 创建数据库...

    数据库设计工具.docx

    可迁移的数据对象包括:数据表,索引,约束,缺省值,触发器,视图,存储进程,函数和数据表数据。5,查询分析。数据表数据快速查询,编辑及导出操作: SQL智能化输入自动完成;提供专用的SQL编辑器。支持语法高亮,...

    SQL-server数据库设计-餐饮管理系统.doc

    " " "在sql server2000 " " "上实现数据库的模型建立(数据库、表的建立、完整性约束的实现、关系图 " " "、必要的存储过程及触发器的编程),并用VB实现简单的应用程序。 " " "设计过程中,要严格遵守设计的时间...

    数据库设计和部署软件BDB 个人版V2.6

    可迁移的数据对象包括: 数据表,索引,约束,缺省值,触发器,视图,存储过程,函数以及数据表数据。 <br>5,查询分析 数据库快速查询分析功能。可进行数据表数据查询,编辑及导出操作: A,提供专用...

    使用Visio进行数据库设计.doc

    "使用Visio进行数据库设计 " 内容提纲: 1、数据库模型的定义 2、VISIO中数据库模型的分类 3、建立逻辑模型 4、建立物理模型 5、Sql Server导入数据到Visio "VISIO提供了强大的数据库建模功能,利用VISIO可以很方便的...

Global site tag (gtag.js) - Google Analytics