设为首页 收藏本站
查看: 946|回复: 0

[经验分享] SQL Server -- 触发器总结(练习&约束)

[复制链接]

尚未签到

发表于 2018-10-15 11:41:12 | 显示全部楼层 |阅读模式
  http://www.cnblogs.com/yank/p/4193820.html
  概念
  触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。
  触发器可以查询其他表,而且可以包含复杂的 SQL 语句。 它们主要用于强制服从复杂的业务规则或要求。 例如,您可以根据客户当前的帐户状态,控制是否允许插入新订单。
  触发器也可用于强制引用完整性,以便在多个表中添加、更新或删除行时,保留在这些表之间所定义的关系。
  作用
  1)触发器可通过数据库中的相关表实现级联更改;通过级联引用完整性约束可以更有效地执行这些更改。
  2)触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
  3)触发器还可以强制执行业务规则
  4)触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
  实际应用
  尽管触发器有很多优点,但是在实际的项目开发中,特别是OOP思想的深入,触发器的弊端也逐渐突显,主要:
  1、过多的触发器使得数据逻辑变得复杂
  2、数据操作比较隐含,不易进行调整修改
  3、触发器的功能逐渐在代码逻辑或事务中替代实现,更符合OO思想。
  建议:
  使用触发器需慎重。
  语法
  CREATE TRIGGER trigger_name
  ON {table_name | view_name}
  {FOR | After | Instead of } [ insert, update,delete ]
  AS
  sql_statement
  触发器类型
  SQL Server 包括两种常规类型的触发器:数据操作语言 (DML) 触发器和数据定义语言 (DDL) 触发器。 当INSERT、UPDATE 或 DELETE 语句修改指定表或视图中的数据时,可以使用 DML 触发器。 DDL 触发器激发存储过程以响应各种 DDL 语句,这些语句主要以CREATE、ALTER 和 DROP 开头。 DDL 触发器可用于管理任务,例如审核和控制数据库操作。
  通常说的触发器就是DML触发器。
  DML 触发器在 INSERT、UPDATE 和 DELETE 语句上操作,并且有助于在表或视图中修改数据时强制业务规则,扩展数据完整性。
  在SQL Server2005后又增加了DDL触发器。
  DDL 触发器将激发存储过程以响应事件。但与 DML 触发器不同的是,它们不会为响应针对表或视图的 UPDATE、INSERT 或 DELETE 语句而激发。相反,它们将为了响应各种数据定义语言 (DDL) 事件而激发。这些事件主要与以关键字 CREATE、ALTER 和 DROP 开头的 Transact-SQL 语句对应。执行 DDL 式操作的系统存储过程也可以激发 DDL 触发器。
  DDL 触发器使用场合:
  ·要防止对数据库架构进行某些更改。
  ·希望数据库中发生某种情况以响应数据库架构中的更改。
  ·要记录数据库架构中的更改或事件。
  在这里我们只讲述DML触发器。DML触发器又分以下分类:
  1、 After触发器
  After触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。
  

1)insert触发器  

  2)update触发器
  

  3)delete触发器
  

  2、Instead of 触发器
  Instead of 触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。
  inserted与deleted对比
  触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

对表的操作
Inserted逻辑表
Deleted逻辑表
增加记录(insert)
存放增加的记录

删除记录(delete)

存放被删除的记录
修改记录(update)
存放更新后的记录
存放更新前的记录  具体应用
  在触发器实际应用中,主要还是建立约束以及级联更新。在这里主要通过简单实例予以说明。
  1、触发器新增
  原理:
  当触发INSERT触发器时,新的数据行就会被插入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入动作。inserted表还允许引用由初始化INSERT语句而产生的日志数据。触发器通过检查inserted表来确定是否执行触发器动作或如何执行它。inserted表中的行总是触发器表中一行或多行的副本。
  场景:增加学生信息时,要校验其年龄,暂定其年龄必须大于18,否则新增失败
  作用:校验约束
  具体实例:
  复制代码
  --触发器新增:只允许录取18岁以上学生
  IF OBJECT_ID (N'TRIGER_Students_Insert', N'tr') IS NOT NULL
  DROP TRIGGER TRIGER_Students_Insert;
  GO
  CREATE TRIGGER TRIGER_Students_Insert
  ON Students
  FOR INSERT
  AS
  declare @age int
  select @age=  Students.age FROM Students INNER JOIN inserted ON Students.ID =inserted.ID
  PRINT @ageif(@ageif(@age  SELECT FROM Students
  SELECT  FROM Majors
  --删除触发器:删除课程时,同时删除该课程的选课信息
  IF OBJECT_ID (N'TRIGER_Courses_Delete', N'tr') IS NOT NULL
  DROP TRIGGER TRIGER_Courses_Delete;
  GO
  CREATE TRIGGER TRIGER_Courses_Delete
  ON Courses
  FOR DELETE
  AS
  DELETE SC
  FROM SC,deleted
  WHERE SC.CourseID = deleted.ID
  --测试用例

  DELETE FROM Courses WHERE>  --执行结果
  SELECT FROM Students
  SELECT  FROM Courses
  SELECT * FROM SC
  --Instead Of触发器:删除课程时,同时删除该课程的选课信息
  IF OBJECT_ID (N'TRIGER_Courses_Instead_Delete', N'tr') IS NOT NULL
  DROP TRIGGER TRIGER_Courses_Instead_Delete;
  GO
  CREATE TRIGGER TRIGER_Courses_Instead_Delete
  ON Courses
  Instead Of DELETE
  AS
  declare @courseId int
  --获取要删除的课程ID
  SELECT @courseId=ID FROM deleted
  --删除选课信息
  DELETE FROM SC WHERE CourseID = @courseId
  --删除课程信息

  DELETE FROM Courses WHERE>  --测试用例

  DELETE FROM Courses WHERE>  --执行结果
  SELECT FROM Students
  SELECT  FROM Courses
  SELECT * FROM SC
  其他
  关于raiserror可见:
  https://msdn.microsoft.com/zh-cn/library/ms178592.aspx



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-621889-1-1.html 上篇帖子: Global Azure上创建、配置、管理SQL Server信息 下篇帖子: SQL的sum()函数总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表