- 1、本文档共43页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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 没有修改姓名 测试修改结果
您可能关注的文档
最近下载
- 2024《学前教育法》解读PPT课件.pptx
- 康明发 K280水平关节机器人说明书3.pdf
- 过程控制系统(毕业论文)精馏塔控制系统设计.doc
- 2025年南京市河西新城区国有资产经营控股集团有限责任公司人员招聘笔试模拟试题及答案解析.docx VIP
- 金堂县自来水红旗水库取水工程——原水输水管道复线工程非重大变动环境影响分析.pdf
- 医疗器械的人类受试者临床研究-临床试验质量管理规范(ISO 14155 :2020)中文版.pdf VIP
- 2025年学校体育活动经费预算计划.docx VIP
- 打造企业文化之基助力企业和谐发展.pdf VIP
- 动火作业安全培训.ppt VIP
- BM11_05_BladeEditor.ppt VIP
文档评论(0)