SQL Server约束和触发器的区别
比较触发器与约束

存储过程和触发器存储过程是SQL 语句和可选控制流语句的预编译集合,以一个名称存储并作为一个单元处理。
存储过程存储在数据库内,可由应用程序通过一个调用执行,而且允许用户声明变量、有条件执行以及其它强大的编程功能。
存储过程可包含程序流、逻辑以及对数据库的查询。
它们可以接受参数、输出参数、返回单个或多个结果集以及返回值。
可以出于任何使用SQL 语句的目的来使用存储过程,它具有以下优点:可以在单个存储过程中执行一系列SQL 语句。
可以从自己的存储过程内引用其它存储过程,这可以简化一系列复杂语句。
存储过程在创建时即在服务器上进行编译,所以执行起来比单个SQL 语句快。
触发器是一种特殊类型的存储过程,当使用下面的一种或多种数据修改操作在指定表中对数据进行修改时,触发器会生效:UPDATE、INSERT 或DELETE。
触发器可以查询其它表,而且可以包含复杂的SQL 语句。
它们主要用于强制复杂的业务规则或要求。
例如,可以控制是否允许基于顾客的当前帐户状态插入定单。
触发器还有助于强制引用完整性,以便在添加、更新或删除表中的行时保留表之间已定义的关系。
然而,强制引用完整性的最好方法是在相关表中定义主键和外键约束。
如果使用数据库关系图,则可以在表之间创建关系以自动创建外键约束。
触发器的优点如下:触发器是自动的:它们在对表的数据作了任何修改(比如手工输入或者应用程序采取的操作)之后立即被激活。
触发器可以通过数据库中的相关表进行层叠更改。
例如,可以在titles 表的ti tle_id 列上写入一个删除触发器,以使其它表中的各匹配行采取删除操作。
该触发器用title_id 列作为唯一键,在titleauthor、sales 及roysched 表中对各匹配行进行定位。
触发器可以强制限制,这些限制比用CHECK 约束所定义的更复杂。
与CHE CK 约束不同的是,触发器可以引用其它表中的列。
例如,触发器可以回滚试图对价格低于10 美元的书(存储在titles 表中)应用折扣(存储在discounts 表中)的更新。
SQL Server中约束与触发器差异比较

SQL Server中约束与触发器差异比较
王军弟;刘瑞玲
【期刊名称】《电脑与信息技术》
【年(卷),期】2011(019)002
【摘要】数据库中的数据完整性是非常重要的,它涉及到数据库能否真实反映现实世界.在SQL Server数据库中,可以使用约束、规则和触发器来保证数据完整性.文章分析比较了触发器和约束在实现数据完整性方面的异同.
【总页数】3页(P75-77)
【作者】王军弟;刘瑞玲
【作者单位】兰州工业高等专科学校,甘肃,兰州,730050;兰州工业高等专科学校,甘肃,兰州,730050
【正文语种】中文
【中图分类】TP311
【相关文献】
1.SQL Server触发器在数据库系统开发中的应用研究 [J], 吴锋珍
2.探析SQL Server触发器与完整性约束的区别 [J], 李虎军;金泉;邢旺;张政
3.SQL Server中触发器与约束的应用比较 [J], 高水娟
4.SQL Server教学中约束和触发器的比较学习 [J], 李岩;李俭;徐宏伟
5.MySQL与SQL Server数据完整性约束的比较教学 [J], 王彩霞;王睿
因版权原因,仅展示原文概要,查看原文内容请购买。
整理的关于SQL Server中事务,触发器和存储过程的介绍以及实际例子

事务事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。
这些操作要么都做,要么都不做,是一个不可分割的工作单位。
通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。
(2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
COMMIT表示提交,即提交事务的所有操作。
具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。
(3):事务运行的三种模式:A:自动提交事务每条单独的语句都是一个事务。
每个语句后都隐含一个COMMIT。
B:显式事务以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。
C:隐性事务在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。
(4):事务的特性(ACID特性)A:原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
一致性与原子性是密切相关的。
C:隔离性(Isolation)一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
注:事务是恢复和并发控制的基本单位。
数据库事务的ACID属性原子性(atomic)(atomicity)事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。
如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。
SQL Server教学中约束和触发器的比较学习

第二 , 束 只能通 过标 准 的系统错误 信息 传递 约 错 误 信 息 。如 果 应 用 程 序 要 求 使 用 ( 能 从 中 获 或
益 )自 定 义 信 息 和 较 为 复 杂 的 错 误 处 理 , 必 须 使 则
用触 发器 。
约 束 之 外 独 立 创 建 的 。 因 此 在 实 现 实 体 完 整 性 上 通 常 采 用 的 方 法 是 用 主键 约 束 的 方 法 , 不 是 使 用 而
方法 。
第 一 , HEC 约 束 只 能 根 据 逻 辑 表 达 式 或 同 C K 表 中 的 另 一 列 来 验 证 列 值 。 如 果 应 用 程 序 要 求 根据 另一 个 表 中的 列 验 证 列 值 , 必 须 使 用 触 发 则
器 。
1 .在 实 体 完 整 性 上 的 比 较 。 实 体 完 整 性 总 应 在 最 低 级 别 上 通 过 索 引 进 行 强 制 , 些 索 引 或 是 这 P MARY K Y 和 UNI UE 约 束 的 一 部 分 , 是 在 RI E Q 或
要 和 必 须 的 , 且 它 们 也 并 不 矛 盾 。 这 时 , 于 在 而 对 同一 表 上 的 触 发 器 表 和 约 束 , 们 在 执 行 时 候 的 顺 它 序是 , IS E 在 N T AD OF 触 发 器 执 行 后 但 在 AF ER T 触 发 器 执 行 前 检 查 这 些 约 束 。 如 果 约 束 破 坏 , 回 则 滚 I T AD OF 触 发 器 操 作 并 且 不 执 行 AF ER NS E T 触 发 器 ; 果 符 合 约 束 的 要 求 , 再 去 执 行 AF ER 如 则 T 触发 器 。
足要 求 , 由 于 触 发 器 的 执 行 相 对 较 复 杂 , 而 会 但 反
09-触发器(SQL Server)

维护数据一致性的触发器示例1 维护数据一致性的触发器示例
设有销售表, 设有销售表,结构如下 create table sales( pro_id char(10) not null, stor_id char(8) not null, s_date smalldatetime not null, qty int, total int default 0)
示例1 示例
定义限制t1表中 列的取值在 定义限制 表中c1列的取值在 到100范围 表中 列的取值在0到 范围 的触发器。 的触发器。 CREATE TRIGGER tri2 ON t1 INSTEAD OF update, insert as if not exists (select * from inserted where c1 not between 0 and 100) insert into t1 select * from inserted
4 前触发型触发器
触发型的触发器, 触发型的触发器,指定执行触发器而不是执行引 发触发器执行的SQL语句,从而替代引发语句的 语句, 发触发器执行的 语句 操作 当为表或视图定义了针对某一操作( 当为表或视图定义了针对某一操作(INSERT、 、 DELETE、UPDATE )的INSTEAD OF 类型触发 、 器且执行了相应的操作时, 器且执行了相应的操作时,尽管触发器被触发但 相应的操作并不被执行, 相应的操作并不被执行,而运行的仅是触发器 SQL 语句本身 在表或视图上,每个INSERT、UPDATE或 在表或视图上,每个 、 或 DELETE语句最多可以定义一个 语句最多可以定义一个INSTEAD OF触 语句最多可以定义一个 触 发器。 发器。 INSTEAD OF触发器不能在有 触发器不能在有WITH CHECK 触发器不能在有 OPTION选项的可更新视图上定义 选项的可更新视图上定义
简述 sql server 中的七大约束

简述 sql server 中的七大约束SQL Server 是一款常用的关系型数据库管理系统,具有强大的数据处理能力和数据安全性。
在 SQL Server 中,约束是一种用于保证数据完整性和一致性的重要机制。
本文将对 SQL Server 中的七大约束进行详细的介绍。
一、主键约束主键约束是 SQL Server 中最常用的约束之一,它用于确保表中每行数据都有唯一标识符。
主键约束可以通过一个或多个列来定义,并且不允许空值。
当插入或更新数据时,如果违反了主键约束,则会抛出错误。
二、唯一约束唯一约束也是保证数据唯一性的重要机制之一,它与主键约束类似,但不要求列包含非空值。
唯一约束可以通过一个或多个列来定义,并且每个列中的值必须是唯一的。
当插入或更新数据时,如果违反了唯一约束,则会抛出错误。
三、检查约束检查约束用于限制列中可插入或更新的值范围。
它可以通过一个简单或复杂的表达式来定义,并且只有在表达式返回 TRUE 时才允许插入或更新数据。
例如,在一个年龄列上定义检查约束,限制年龄必须大于等于 18 年。
当插入或更新数据时,如果违反了检查约束,则会抛出错误。
四、默认约束默认约束用于在插入数据时为列提供默认值。
它可以通过一个常量、函数或表达式来定义,并且只有在未提供值时才会使用默认值。
例如,在一个日期列上定义默认约束,将其设置为当前日期。
当插入数据时,如果未提供日期,则使用默认值。
五、外键约束外键约束用于确保表之间的引用完整性和一致性。
它通过一个列或多个列来定义,并且引用另一个表的主键或唯一键。
当向包含外键约束的表中插入数据时,必须先在引用表中存在对应的主键或唯一键。
如果违反了外键约束,则会抛出错误。
六、触发器触发器是一种特殊类型的存储过程,它与表相关联,并在特定事件发生时自动执行。
触发器可以在插入、更新或删除数据时执行,并且可以用于实现复杂的业务逻辑和数据验证功能。
七、索引索引是一种优化数据库查询性能的机制,它可以通过对表中某些列进行排序和分组来快速查找所需数据。
SQL Server中约束与触发器差异比较

库 中数据 的一致 性 和正 确 性 。为 了避 免 出现不 符 合语
义 的数据 , 防止错误信息的输 入和不一致 的数据 ,Q SL Sre 0 数 据 库管 理 系统 主要 使 用 约束 、规 则 和 触 e r0 5 v 2 发 器 等措 施保 证 数 据 的完 整性 。
ra wo l. n S ev rd t a yt el r I QL S re a b s ss m, a s c nt it r l o r g rt u r t h ne ry o e d t d a e e we c n ue o s a s ue r tg e o g aa e te itgi ft aa rn , i n e t h .
S ev r QLS re 中约 束 与触 发 器 差 异 比较
王军 弟 , 肃 兰 州 兰 甘 705 ) 3 00
摘
要: 数据库 中的数 据完整性是非 常重要的 , 它涉及到数据库能否真实反映现 实世界 。在 S e e 数据库 中, 以使 QLSr r v 可
Anayss h d fe e e bew e n on tant a ti g r n l e t e i rnc s t e c sri s nd rg e i daa n e rt t i t g i y.Som e on r t a ph ai sm pe ae i n n c c e e p c t on a ls r gve i
域 完整 性是 对 数据 表 中字段 属性 的约 束 ,通 常 指 数 据 的有效 性 , 它包 括字 段 的值 域 、 段 的类 型 及 字 段 字 的有效 规则 等 约束 ,它 是 由确 定关 系 结构 时所 定 义 的 字 段 的属 性 决 定 的 。 限制 数据 类 型 、 省值 、 则 、 缺 规 约 束 、 否可 以为 空 , 是 域完 整性 可 以确 保 不会 输入 无 效 的
数据库设计中的约束和触发器应用指南(二)

数据库设计中的约束和触发器应用指南现代软件系统中,数据库起着至关重要的作用。
数据库设计的好坏,不仅关系着系统的运行效率,还直接影响数据的完整性和一致性。
在数据库设计中,约束和触发器是常用的工具,用以保证数据的有效性和可靠性。
本文将从不同的角度探讨数据库设计中约束和触发器的应用。
一、基本概念和分类在数据库中,约束(Constraint)是一种规则,用于限制表中数据的取值范围及其关系。
常用的约束包括主键约束、唯一约束、外键约束和检查约束等。
触发器(Trigger)是一种特殊的过程,它在数据的插入、更新或删除时自动执行。
触发器可以在数据变化前或数据变化后触发,它可以对数据进行更细粒度的控制。
根据功能和作用域的不同,约束和触发器可以分为以下几类:1. 主键约束:用于标识表中的唯一记录,保证表中每个记录都有一个独一无二的标识符。
2. 唯一约束:用于保证表中一个或多个列的取值唯一。
3. 外键约束:用于保证表与表之间的关系完整性,保证关联字段的数据一致性。
4. 检查约束:用于限制表中字段的取值范围,保证数据的合法性。
5. 数据库约束:在整个数据库范围内实施的约束,包括域约束、参照完整性约束和用户定义的约束。
6. 触发器:在数据操作前或操作后触发执行的过程,可以用于更细粒度的数据控制。
二、约束的应用1. 主键约束:主键约束用于标识一张表中的唯一记录。
在设计表结构时,应该选择一个具有唯一性的列作为主键,并为该列添加主键约束。
主键约束保证了数据的完整性和唯一性,使得表的查询和关联操作更高效。
在使用主键约束时,需要注意主键值的更新和删除操作。
2. 唯一约束:唯一约束用于保证表中一个或多个列的取值唯一。
通过添加唯一约束,可以防止数据重复和冗余,提高数据的一致性和查询效率。
若某个列的取值不应该重复,应该为该列添加唯一约束。
唯一约束可以作用于单个列或多个列的组合。
3. 外键约束:外键约束用于保证表与表之间的关系完整性,保证关联字段的数据一致性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SQL Server约束和触发器的区别
作者:夏果果出处:博客2011-12-30 06:15
SQL Server约束相信大家都比较了解了,那么,SQL Server约束和触发器的区别在哪里呢……
SQL Server约束相信大家都比较了解了,那么,SQL Server约束和触发器的区别在哪里呢?
在SQL Server数据库中提供了两种主要机制来强制使用业务规则和数据完整性,他们是SQL Server约束和触发器。
触发器其实就是一个特殊类型的存储过程,可在在执行某个操作时自动触发。
触发器与约束都可以实现数据的一致性。
那么他们在使用的过程中,有哪些差异呢?简单的来说,触发器可以实现约束的一切功能。
但是在考虑数据一致性问题的时候,首先要考虑通过约束来实现。
如果约束无法完成的功能,则再通过触发器来解决。
两者从功能上来说,他们的关系如下图所示:
触发器可以包含使用SQL代码的复杂处理逻辑。
如果单从功能上来说,触发器可以实现约束的所有功能。
但是由于其自身的种种缺陷,其往往不是实现数据一致性等特定功能的首选解决方案。
总的来说,只有在约束无法实现特定功能的情况下,才考虑通过触发器来完成。
这只是在处理约束与触发器操作过程中的一个基本原则。
对于他们两个具体的差异笔者在下面也进行了比较详细的阐述。
欢迎大家进行补充。
差异一:错误信息的管理上。
当违反系统的SQL Server约束规则时,需要向用户返回一定的错误信息,方便用户进行排错。
约束与触发器在遇到问题时都可以返回给用户一定的错误信息。
但是,约束只能够通过标准化的系统错误信息来传递错误消息。
如果应用程序需要使用自定义消息和较为复杂的错误处理机制,则必须要使用触发器才能够完成。
如现在数据库中有一张产品信息表。
为了保证产品的唯一性,要求产品的编号必须唯一。
如果用户输入的产品编号跟企业现有的产
品编号有重复的话,这条产品信息就不能够被保存。
从技术上来说,约束与触发器都可以实现这个需求。
但是,当违反这个唯一性规则时,他们提供的错误信息是不同的。
如利用约束来实现这个唯一性控制,那么当用户输入重复的编号时,则系统会提示违反了唯一性规则,不允许保存。
但是光凭这条消息的话,可能用户还不能够马上了解是怎么回事情。
有时候程序员希望能够返回更加具体的信息。
如在产品基本信息表中可能有多个字段具有唯一性约束,那么用户希望知道到底是哪个字段违反了唯一性约束。
如用户现在输入产品编号为DT001的产品编号时出现了这个错误。
那么用户可能希望系统能够显示出系统中原来存在的DT001这个产品的具体信息,如他的规格描述、产品名称等等。
这可以帮助员工来判断自己要建立的产品信息是否真的跟原来存在的产品信息重复。
还是只是产品编号的重复而已。
如果要在错误信息中带出更加详细的信息,则数据库管理员不得不采用触发器来对这个唯一性进行控制。
因为只有触发器可以返回数据库管理员自定义的错误信息;而且还可以实现比较复杂的逻辑控制。
而约束只能够范围系统定义的标准错误信息。
另外如果违反一些主键、外键约束的话,系统也只会提示标准的错误信息。
而不会提示到底是哪一张表中存在子记录等等详细的错误信息。
这就给用户排错的时候带来不必要的麻烦。
因为它需要先去查找这个约束或者主键的名字,然后再去看具体的约束定义才能够确定到底是哪里出了问题。
但是普通用户往往是不能够看到约束的具体定义的。
故在遇到这种情况时,最好也能够通过触发器来提供比较详细的错误信息,以提高应用程序的友好性。
差异二:性能上的差异分析。
如现在有两张表,分别为销售订单头与销售订单行。
在销售订单中有一个订单ID,它是这张表的主键,也是销售订单行表的外键。
现在如果更改了销售订单头表的主键的值,那么必须要保证销售订单行表中订单ID的值也随之更改。
否则的话,销售订单头表与销售订单行表就无法对应起来。
此时触发器与约束都可以实现类似的功能。
触发器可以将销售订单头ID的更改通过级联更新的功能传播给数据库中其他相关的表,实现级联更新。
约束也可以实现类似的功能。
而且通常情况下,通过级联引用完整性约束可以更有效的执行这个级联更新。
如当上面这个更改发生后,触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。
当更改外键且新值与其主键不匹配时,这个的触发器将生效。
但是,数据库中有一个现成的解决方案,即FOREIGN KEY 约束通常用于此目的。
如果触发器表上存在约束,则在INSTEAD OF 触发器执行后但在AFTER 触发器执行前检查这些约束。
如果违反了约束,则回滚INSTEAD OF 触发器操作并且不执行AFTER 触发器。
遇到这种情况后,往往就是两种处理方式。
一是如果要更改的主键在其他表中已经存在的话,那么就不允许其进行更改,系统会拒绝保存或者回滚用户的更改操作。
二是如果要更改的主键信息在其他表中已经存在相关的记录,而数据库管理员又允许其更改的话,为了保证数据的一致性,就要出发级联更新的功能。
让数据库系统在更改主键的同时自动更新其他表中的相关信息。
无论采取哪种方式,从性能上来说,约束的执行性能都要高一点。
而且系统本身就提供了一些约束规则,如级联引用完整性约束的等等。
故也省去了管理员写触发器代码的工作量。
不过有一点值得说明的是,虽然约束的执行性能比较高,但是其向用户提供的错误信息确实非常有限的。
如上面第一点所说,系统只提供了一些标准的错误信息。
如果管理员需要向用户提供比较详细的错误信息,则需要通过触发器的自定义错误信息来实现。
故在用户的友好性与数据库的执行性能之间,数据库管理员需要做出一个均衡。