为什么要使用触发器
     触发器的主要作用就是其能够实现由主键和外所不保证的复杂的参照完整性和数据的一致性。除此之外触发器还有其它许多不同的功能 
 触发器定义
      触发器实际上是一种特殊的存储的过程。触发器的主要功能是监视用户对数据的修改。如果针对一个数据表建了触发器,则 当数据表被修改(插入、更新或者删除)时,SQL Server便使触发器自动执行,以便对数据的修改采用一些适当的措施,从而保证数据的完整性和安全性。

触发器分类
      After 触发器在触发操作(Insert、Update 或Delete)后和处理完任何约束后激发。可通过指定 After 或 for 关键字来请求 After 触发器。因为 For 关键字与 After 的效果相同,所以具有 For 关键字的触发器也归类为 After 触发器。
Instead Of 触发器代替触发动作进行激发,并在处理约束之前激发。

注意:对于每个触发操作(Update、Delete和Insert),每个表或视图只能有一个 Instead Of 触发器。而一个表对于每个触发操作可以有多个 After触发器。

Instead Of 触发器
      INSTEAD OF触发器指定执行触发器而不是执行触发 的SQL 语句,从而替代触发语句的操作。
在表或视图上,每个 INSERT、UPDATE 或 DELETE 语句最多可以定义一个 INSTEAD OF 触发器。然而,可以在每个具有 INSTEAD OF 触发器的视图上定义视图。

nstead Of 触发器举例
I     nstead Of 触发器的主要优点是可以使不能更新的视图支持更新。包含多个基表的视图必须使用 Instead Of 触发器来支持引用表中数据的插入、更新和删除操作。Instead Of触发器的另一个优点是使您得以编写这样的逻辑代码:可以拒绝批处理中的某些部分同时允许批处理的其它部分成功。
 Instead Of 触发器可以进行以下操作:

  • 忽略批处理中的某些部分。
  • 不处理批处理中的某些部分并记录有问题的行。
  • 如果遇到错误情况则采取备用操作。

将此逻辑作为 Instead Of 触发器的一部分进行编码,可避免所有访问数据的应用程序必须重新执行该逻辑。在下列 Transact-SQL 语句序列中Instead Of触发器更新视图中的两个基表。另外,显示两种处理错误的方法: 
忽略对 People 表的重复插入,并且插入的信息将记录在 PeopleRepeat 表中。
表Teacher的重复插入转变为 Update 语句,该语句将当前信息检索至 Teacher,而不会产生重复键侵犯。用Transact-SQL 语句创建两个基表、一个视图、一个记录错误表和视图上的 INSTEAD OF 触发器。下面的这些表将个人数据和业务数据分开并且是视图的基表:下面的视图使用某个人的两个表中的所有相关数据立报表:

Instead Of 触发器举例代码如下

--身份证表
Create Table People
   (
    PeopleID Int Primary Key,--身份证号
    PeopleName Varchar(20) not null,--姓名
    PeopleSex Char(2) Default('男'),--性别
    Constraint Check_Sex Check(PeopleSex in ('男','女')),
   )
--教师表
Create Table Teacher
   (
    TeacherID int Primary Key,--教师编号
    PeopleID int References People(PeopleID),--身份证号
    Salary Money,--工资
   )

--记录重复身份证号
Create Table PeopleRepeat
   (
    PeopleID Int,--身份证号
    PeopleName Varchar(20) not null,--姓名
    PeopleSex Char(2) Default('男'),--性别
    OperateName Char(50),--操作员
    OperateTime DateTime,--操作时间
   )

--创建视图    
Alter View View_Teacher As
Select P.PeopleID,PeopleName,PeopleSex,TeacherID,Salary
From People P Inner Join Teacher T
   On P.PeopleID = T.PeopleID

--Instead Of 触发器在单独视图的多个基表中插入行。
--将对插入具有重复社会安全号的行的尝试记录在 PersonDuplicates 表中。
--将Teacher 中的重复行更改为更新语句。

If Exists (Select Name From Sysobjects
      Where name = Ltrim('Trig_Insert_ViewTeacher') And type = 'TR')
   Drop Trigger Trig_Insert_ViewTeacher
Go

Create Trigger Trig_Insert_ViewTeacher ON View_Teacher
Instead Of Insert
As
Begin
Set Nocount On
-- 检查PeopleID是否重复,不重复则插入记录
If (Not Exists (Select P.PeopleID
      From People P, Inserted I
      Where P.PeopleID = I.PeopleID))
   Insert Into People
      Select PeopleID,PeopleName,PeopleSex
      FROM inserted
Else
-- 记录重复插入的信息(错误处理方法一:忽略对 People 表的重复插入,并且插入的信息将记录在 PeopleRepeat 表中。)
   Insert into PeopleRepeat                                                          
      Select PeopleID,PeopleName,PeopleSex,Suser_Sname(),Getdate()
      From Inserted
--检查是否存在TeacherID,如果不存在则插入记录
If (Not Exists (Select T.TeacherID
      From Teacher T, inserted I
      Where T.TeacherID = I.TeacherID))
   Insert Into Teacher
      Select TeacherID,PeopleID,Salary 
      From inserted
else
--如果重复了,则改为Upate,则不会出现重复插入的错误 即前面所讲的遇 到错误备用操作
--(错误处理方法二:表Teacher的重复插入转变为 Update 语句,该语句将当前信息检索至 Teacher,而不会产生重复键侵犯。)
   Update Teacher
      Set TeacherID = I.TeacherID,
          Salary = I.Salary
   From Teacher T, Inserted I
   Where T.PeopleID = I.PeopleID
End

Go

Insert Into View_Teacher
       Values(0001,'小敏','女',2,5000)

Select * From People
Select * From Teacher
Select * From PeopleRepeat
Select * From View_Teacher

总结要点

  • Instead Of 触发器并不(Insert,Update,Delete)操作,这些触发器在执行任何约束前执行,因此可执行预处理以补充约束操作
  • Instead Of 触发器的主要优点是可以使不能更新的视图支持更新
  • 在含有用 DELETE 或 UPDATE 操作定义的外键的表上,不能定义 INSTEAD OF DELETE 和 INSTEAD OF UPDATE 触发器

instead of触发器相关推荐

  1. MySQL 学习笔记(8)— 触发器

    1. 触发器概念 触发器是 MySQL 响应以下任意语句而自动执行的一条 MySQL 语句(或位于BEGIN 和 END 语句之间的一组语句) INSERT UPDATE DELETE 其他 MySQ ...

  2. Oracle 触发器 Update 不能操作本表的疑问

    今天要解决一个需求,类似表A有个字段叫flag存储的是0 or  1 ,当一行记录更改为1的时候,其他行同字段要变为0. 这样的需求第一个思路想尝试下能否用触发器来实现 create or repla ...

  3. SQL SERVER 触发器示例

    触发器是一种特殊的存储过程. 触发器语法 : CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] { FOR | A ...

  4. mysql触发器菜鸟_mysql触发器学习

    创建一个触发器 语法:create trigger 触发器名字create trigger xiaoshou_update_trigger after update on xiaoshou for e ...

  5. 【Postgresql】触发器某个字段更新时执行,行插入或更新执行

    [Postgresql]触发器某个字段更新时执行,行插入或更新执行 1. postgresql触发器 2. 触发器的创建及示例 1) 字段更新时,触发 2) 行插入或更新时,触发 3. 触发器的删除 ...

  6. 数据库实验:数据库和表、查询、视图与安全性、存储过程及游标、触发器、综合实验-水果商店进阶

    数据库实验:数据库和表.查询.视图与安全性.存储过程及游标.触发器.综合实验-水果商店进阶 实验一.数据库和表 源码1: 源码2: 小结 实验二.查询 源码 小结 实验三.视图.安全性 源码: 小结 ...

  7. Sqlserver的触发器的简单使用

    1,触发器有两种 (1)After触发器(之后触发) 触发器有个好处:就是你之前有过什么操作他会将你的操作的数据信息完整的保存下来,比如你删过什么信息,如果用触发器,那么删除后就会显示两行受影响,那么 ...

  8. 实验6 触发器的使用

    实验6 触发器的使用 实验目的 掌握触发器的创建.修改和删除操作. 掌握触发器的触发执行. 掌握触发器与约束的不同. 二.实验要求 1.创建触发器. 2.触发器执行触发器. 3.验证约束与触发器的不同 ...

  9. Sql Server 因为触发器问题导致数据库更新报错“在触发器执行过程中引发了错误,批处理已中止”的问题处理...

    在维护一个非常旧的项目时,由于该项目版本已经非常老了,而且在客户现场运行的非常稳定,更要命的是本人目前没有找到该项目的代码,为了处理一个新的需求而且还不能修改程序代码,于是决定从数据库入手,毕竟该项目 ...

  10. 利用MySQL触发器实现check和assertion

    MySQL虽然输入check语句不会报错,但是实际上并没有check的功能.但是MySQL 依然可以利用触发器来实现相应功能. 本文将根据两个例子简要阐述MySQL实现check和assertion的 ...

最新文章

  1. libjpeg-turbo介绍及测试代码
  2. 心酸科研路:3年前CVPR论文,仅被引用11次,如今成就黑洞照片!
  3. git 下载项目和更新项目(1)
  4. 码分复用的matlab仿真,基于matlab的多路时分复用仿真.doc
  5. linux网络编程二十:socket选项:SO_RCVTIMEO和SO_SNDTIMEO
  6. weblogic与sitemesh乱码问题
  7. 微信的一个隐藏功能,我身边绝大多数人都不知道,其实很实用
  8. 视频图像不正常的几个表现及解决方法
  9. html如何创建关键帧动画旋转,[教程] 用 CSS3 Animations(动画) 和 Keyframes(关键帧) 创建简单的网页动画 – CSS3 实现弹跳球动画...
  10. php 5.4.39 安装,Lamp 安装(CentOS6.6, php-5.4.39, httpd-2.4.12, mysql-5.6.24)
  11. 【LOJ】 #2521. 「FJOI2018」领导集团问题
  12. AngularJs + angular-ui-router + bootstrap 实现blog基础导航功能
  13. SqlServer-RBAC五表权限
  14. stvd c语言编译器,STM8--STVD编译工具安装与程序下载
  15. matlab生成摆线齿廓线,基于Matlab的摆线针轮齿廓修形参数的求解
  16. Computer Networking——transport layer QA
  17. sofa与springboot的入门案例
  18. android 消息提示机制
  19. python实现签名ElGamal算法
  20. 英语快照1---英语正能量

热门文章

  1. 10个成语理解项目管理的价值观和方法论
  2. JS实现中文转拼音首字母和五笔简码
  3. 李宏毅2021机器学习笔记——Transformer
  4. was cached in the local repository, resolution will not be reattempted until the update interval of
  5. 【数据库设计】假设每个学生选修若干门课程,且每个学生每选一门课只有一个成绩,每个教师只担任一门课的教学,一门课由若干教师任教。画出E-R图
  6. Python——输入若干行,每行若干行整数,求所有整数的最大值
  7. “校园知网”5月5日冲刺计划书
  8. 通过 prosody 搭建 XMPP 服务器
  9. keep practicing for fast tying
  10. 【记录一下】训练yolov5解决can not train without labels