`
cqupt_zlf
  • 浏览: 5487 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

instead of触发器

阅读更多

为什么要使用触发器
     触发器的主要作用就是其能够实现由主键和外所不保证的复杂的参照完整性和数据的一致性。除此之外触发器还有其它许多不同的功能 
 触发器定义
      触发器实际上是一种特殊的存储的过程。触发器的主要功能是监视用户对数据的修改。如果针对一个数据表建了触发器,则 当数据表被修改(插入、更新或者删除)时,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 触发器
分享到:
评论

相关推荐

    insteadof触发器1

    INSTEAD OF 触发器的主要优点是可以使不能更新的视图支持更新。INSTEAD OF 触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部

    insteadof触发器.pdf

    insteadof触发器.pdf

    insteadof触发器汇编.pdf

    insteadof触发器汇编.pdf

    SQL Server误区30日谈 第4天 DDL触发器就是INSTEAD OF触发器

    DDL触发器的实现原理其实就是一个AFTER触发器。这个意思是先发生DDL操作,然后触发器再捕捉操作(当然如果你在触发器内写了Rollback,则也可能回滚)

    instead of 触发器

    INSTEAD OF INSERT AS BEGIN SET NOCOUNT ON IF (NOT EXISTS (SELECT P.SSN FROM Person P, inserted I WHERE P.SSN = I.SSN)) INSERT INTO Person SELECT SSN,Name,Address,Birthdate,Comment FROM ...

    数据库实验五.docx

    Instead of触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确,如果正确才进行相应的操作...

    Oraclet中的触发器

    只能对视图和对象视图建立INSTEAD OF触发器,而不能对表、模式和数据库建立INSTEAD OF 触发器。 FOR EACH ROW选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响...

    sqlserver触发器例子

    Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等...

    DM8与Oracle12c兼容性白皮书.pdf

    目前,大多数应用程序使用的是Oracle数据库,而用户或多或少的使用了Oracle的...Oracle兼容性方面实现的功能包括:ROWNUM表达式、多列IN语法、层次查询、外连接语法“(+)”、INSTEADOF触发器、%TYPE以及记录类型等

    触发器练习答案(附有测试文档)

    在SC表中作一触发器,当添加,删除或修改一行之后,将该学生在Student表中的总成绩和平均成绩相应改变。 插入或修改(修改课程号时)选课信息时,若该课程的选课人数已满,则不允许操作,并抛出相应的错误提示。

    探究 SQL Server 的触发器:第二部分VC源代码

    我会从 INSTEAD OF 触发器以及它与AFTER 触发器差别开始讲起。然后我会在讨论一些使用 INSTEAD OF 触发器的情形。其中包括允许几个视图对多个表进行更新。最后,我会讨论触发器怎样去处理事务,编写改变某个表中多行...

    Oracle_plsql基本语法笔记.txt

    Oracle 常用命令举例 标题 基本语法 %type用法,%rowtype用法,TYPE用法 游标的使用 for 循环 loop循环 ...标题 触发器 ... 建立简单的触发器 ... 触发器分类 ... 稍复杂的触发器 ... instead of 触发器

    SQL2005入门到精通(13)

    第13章 触发器 274 13.1 触发器概述 274 13.1.1 触发器的作用 274 13.1.2 触发器的分类 274 13.1.3 触发器的工作原理 275 13.2 设计触发器 275 13.2.1 理解AFTER、INSTEAD OF触发器的使用要求 275...

    触发器---FOR INSERT与INSTEAD OF

    触发器---FOR INSERT与INSTEAD OF ,SQL中触发器的讲述,可以利用触发器来处理数据库相关程序

    数据库触发器是一种存储过程

    触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,当在表(视图)中插入、更新...触发器分为两种一个是INSTEAD OF 触发器;一个是AFTER 触发器。

    oracle触发器使用,很详细

    触发器使用教程和命名规范 1 1,触发器简介 1 ...6,例三:INSTEAD OF触发器 6 7,例四:语句级触发器之一 8 8,例五:语句级触发器之二 9 9,例六:用包封装触发器代码 10 10,触发器命名规范 11

    Sql Server触发器的使用

    Sql Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护,它们存在于内存中而不是数据库中。...三、for、after、instead of触发器 after:触发器在触发它们的语句完成后执行

    了解SQLServer触发器及触发器中的事务

    在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器&DDL触发器)和After触发器&InsteadOf触发器的应用不同,开始说起它们,然后是说与事务有关的故事。如果,你有什么建议和...

    SQL Server触发器及触发器中的事务学习

    在这边文章里面,我不会从触发器和事务的概念去讲述,而是从常见的两种触发器类型(DML触发器 & DDL触发器)和After触发器 & Instead Of 触发器的应用不同,开始说起它们,然后是说与事务有关的故事。如果,你有什么...

Global site tag (gtag.js) - Google Analytics