开发触发器.PPT

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

开发触发器 触发器的概念 触发器是与表、视图相关联的Transact SQL程序 当特定的事件发生时,就会触发相应的触发器。 触发器的执行是隐式的。 设计触发器的原则 用触发器实施那些不能使用完整性约束实现的业务规则 如果触发器中的代码过长,应当将其编写为存储过程,并在触发器中调用它。 不要过度地使用触发器,以免为调试制造问题。 触发器的构成 触发器的名称 触发器的类型: 对于表:After、 Instead of 对于视图:Instead of 触发的事件:INSERT、UPDATE、DELETE 触发器所属的对象:表名、视图名 触发器体:Transact SQL程序块 两种触发器的类型的比较 事务及触发器的执行 执行Identity insert检查。 检查为空性约束。 检查数据类型。 执行instead of触发器。如果存在instead of触发器,将停止执行触发它的DML语句。instead of触发器是不可递归调用的。因此,如果一个instead of触发器执行了一个DML命令,而这个命令再次触发了同一个事件(insert、update或者delete),第二次产生的这个事件将不会再次触发instead of触发器。 检查主键约束。 检查Check约束。 检查外部键约束。 执行DML语句,并更新事务日志。 执行After触发器。 提交事务。 写入数据文件。 创建触发器的语法 CREATE TRIGGER trigger_name ON { table | view } { ????{ { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } ????????AS ????????Tsql_statement [ ...n ] ????} } After触发器的例子 创建触发器 CREATE TRIGGER TriggerOne On Student AFTER Insert AS PRINT In the After Trigger‘ 测试触发器 Insert Into Student (Sno, Sname, Sdept) Values (95006, ABCD, 物理) select * from Student where sno=95006 Instead触发器的例子 创建触发器 CREATE TRIGGER TriggerTwo ON Student INSTEAD OF Insert AS PRINT In the Instead of Trigger Go 测试触发器 Insert Into Student (Sno, Sname, Sdept) Values (95007, DEFG, 物理) select * from Student where sno=95007 禁用触发器 用户的DML语句是无法绕开触发器的检查的,但系统管理员可以临时性地禁用触发器。如果触发器妨碍到数据修改任务的进行,使用禁用触发器的方法要优于删除并重建触发器的方法。 要临时性地禁用触发器,可以使用如下命令: ALTER TABLE TableName ENABLE or DISABLE TRIGGER TriggerName 禁用触发器的例子 禁用触发器 ALTER TABLE Student DISABLE TRIGGER TriggerTwo 测试效果 Insert Into Student (Sno, Sname, Sdept) Values (95007, DEFG, 物理) select * from Student where sno=95007 触发器与安全性 只有符合以下条件之一的用户才有权限创建、修改、删除、启用或者禁用触发器: 拥有sysadmin固定服务器角色的用户 拥有db_owner或db_ddladmin固定数据库角色的用户 表的所有者 确定被更新的列 如果某一个列被DML事务更新了,那么update(该列的属性名)就会返回真值 。 insert操作将会更新所有列,而update操作则只会对指定的列进行更新。 注意,update()函数只会根据DML语句是否对列进行了更新操作来报告列的更新状态,而不管列中的数据是否真的发生了变化。所以,如果DML将列中的数据从’abc’又改为’abc’,update()函数仍旧会报告该列被更新了。 确定被更新的列-例子 修改触发器 ALTER TRIGGER TriggerOne ON Student AFTER Insert, Update AS IF Update(Sname) PRINT 修改了姓名 ELSE PRINT 没有修改姓名 测试修改结果

文档评论(0)

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

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

1亿VIP精品文档

相关文档