第7章数据库完整性.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第7章数据库完整性剖析

* * SQL Server中的触发器 用途 在数据库中的相关表上实现级联更改 引用完整性可以通过外键约束定义,但可使用触发器在级联更新或删除时确保采用适当的行为。 若触发表上定义了约束,它们在触发器执行之前检查。若违反了约束,则触发器不执行 强制比 CHECK 约束更复杂的数据完整性 定义用户定制的错误信息 通过使用触发器,可以在特定条件出现时调用预定义或动态定义的定制错误信息 约束、规则和默认只能通过标准系统错误信息来表达错误。若需要定制信息或更复杂的错误处理,需要使用触发器 维护非标准数据,特别是处理较为复杂的逻辑 * * SQL Server中的触发器 触发器与CHECK 约束 CHECK 约束只能根据逻辑表达式或同一表中的另一列来验证列值。 如果应用程序要求根据另一个表中的列验证列值,则必须使用触发器。 约束只能通过标准的系统错误信息传递错误信息。 如果应用程序要求使用(或能从中获益)自定义信息和较为复杂的错误处理,则必须使用触发器 触发器可以引用其它表中的列 例如,触发器可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,触发器可以支持约束的所有功能;但并不总是最好的方法。 * * SQL Server中的触发器 inserted表和deleted表 Inserted表 存放insert或update语句执行过程中,插入到触发表中的新数据行的副本 inserted 表中的行是和触发表中的新数据行相同. Deleted表 存放delete 或update语句执行过程中,从触发表中删除的旧数据行的副本 deleted表和触发表不会有相同的行. 触发操作完成后,与触发器相关的表被自动删除掉 * * 7.5.3 使用触发器 通过触发器实现数据完整性 【例 7?9】创建限制更新数据的触发器,限制将SC表中不及格学生的成绩改为及格。 CREATE TRIGGER tri_grade ON SC FOR UPDATE AS IF UPDATE (Grade) IF EXISTS (SELECT * FROM INSERTED JOIN DELETED ON INSERTED.Sno = DELETED.Sno WHERE INSERTED.GRADE = 60 AND DELETED.Grade 60) BEGIN RAISERROR (不允许将不及格学生的成绩改为及格!) ROLLBACK END * * 触发器的工作过程 一个表中可有同类型的多个 AFTER 触发器 一个表只能有一个给定类型的 INSTEAD OF 触发器, INSTEAD OF 指定执行触发器而不是执行触发的 SQL 语句,从而替代触发语句的操作 INSTEAD OF 触发器可使一般不支持更新的视图可以被更新,截获对视图的操作,将其重导向底层表 INSERT 触发器的工作过程 DELETE 触发器的工作过程 UPDATE 触发器的工作过程 INSTEAD OF 触发器的工作过程 * * INSERT 触发器的工作过程 INSERT 触发器的工作过程 在定义了 INSERT 触发器的表上执行 INSERT 语句 INSERT 语句插入的行被记录下来 触发器动作被执行 inserted 表 触发 INSERT 触发器时,新行被同时增加到触发器表和 inserted 表中 inserted 表是保存了插入行的副本的逻辑表,它并不实际存在于数据库中 inserted 表允许用户引用 INSERT 语句所插入的数据,这样触发器可以根据具体数据决定是否执行以及如何执行特定语句 * * INSERT 触发器的工作过程 Order Details OrderID 10522 10523 10524 ProductID 10 41 7 UnitPrice 31.00 9.65 30.00 Quantity 7 9 24 Discount 0.2 0.15 0.0 5 19.00 2 0.2 10525 触发器代码: USE Northwind CREATE TRIGGER OrdDet_Insert ON [Order Details] FOR INSERT AS UPDATE P SET UnitsInStock = (P.UnitsInStock – I.Quantity) FROM Products AS P INNER JOIN Inserted AS I ON P.ProductID = I.ProductID * * INSERT 触发器的工作过程 在定义了 INSERT 触发器的表上执行 INSER

文档评论(0)

586334000 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档