`
cqupt_zlf
  • 浏览: 5900 次
  • 性别: 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触发器.pdf

    《理解SQL中的INSTEAD OF触发器》 在SQL数据库管理中,触发器是一种非常重要的对象,它允许我们在数据修改(如INSERT、UPDATE或DELETE)时执行额外的操作。特别是INSTEAD OF触发器,它是对标准触发器的一种扩展,...

    insteadof触发器汇编.pdf

    从提供的文件内容中,我们可以了解到一些有关SQL Server中的INSTEAD OF触发器的知识点。触发器是数据库管理系统中的一种特殊类型的存储过程,它会在满足某种条件时自动执行。触发器通常用于在对数据表进行插入、更新...

    insteadof触发器1

    标题"INSTEAD OF触发器1"涉及到数据库管理系统中的一个重要概念,即`INSTEAD OF`触发器。`INSTEAD OF`触发器是一种特殊的SQL触发器,它在用户尝试对数据库表或视图执行INSERT、UPDATE或DELETE操作时被触发,而不是在...

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

    然而,一个常见的误解是将DDL触发器等同于INSTEAD OF触发器,这实际上是不准确的。 DDL触发器的运作机制实际上类似于AFTER触发器,它在DDL操作执行之后触发。这意味着当用户尝试执行一个DDL语句,如ALTER TABLE,...

    触发器---FOR INSERT与INSTEAD OF

    今天,我们将讨论FOR INSERT与INSTEAD OF触发器。 FOR INSERT触发器 FOR INSERT触发器是指在INSERT操作完成后执行的触发器。例如,在上面的示例中,我们创建了一个名为tri_tb1的触发器,该触发器在tb1表中插入新...

    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 ...

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

    触发器可以分为两类:INSTEAD OF触发器和AFTER触发器。 AFTER触发器,也称为FOR触发器,是在实际的数据修改操作(INSERT、UPDATE、DELETE)完成并满足所有约束条件后触发的。这意味着,一旦在表或视图上执行了相应...

    SQLServer2005数据库触发器应用

    在Instead of触发器中,SQL Server接收到SQL语句请求后,会先建立临时表,然后直接触发触发器,将数据操作的执行权交给触发器。而在After触发器中,服务器首先执行实际的数据修改,然后再激活触发器。 Instead of...

    SQL Server数据库中DML触发器的教学探讨.pdf

    由于初学者通常容易混淆AFTER触发器和INSTEAD OF触发器,本文通过通俗的语言介绍了触发器,并对触发器的工作原理进行了阐述,分析了AFTER触发器与INSTEAD OF触发器的主要区别与应用,旨在帮助初学者准确快速地掌握...

    SQL_Server触发器创建、删除、修改、查看示例教程.doc

    这两种触发器的差别在于他们被激活的时机:Instead of 触发器用于替代引起触发器执行的 T-SQL 语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。After 触发器在一个 Insert,...

    巧妙应用SQL Server触发器.pdf

    触发器的种类主要包括INSTEAD OF触发器和AFTER触发器。INSTEAD OF触发器用于替代原本的T-SQL语句,可以应用于表和视图。它们常用于视图更新不支持的情况下,通过INSTEAD OF触发器来扩展视图的更新功能。而AFTER...

    触发器的应用触发器的应用

    本篇文章将重点介绍SQL Server 2005中三种类型的触发器——After触发器、数据定义语言(DDL)触发器以及Instead Of触发器的概念、工作原理及应用场景。 #### AFTER触发器 AFTER触发器是SQL Server 2005默认创建的...

    SQL Server数据库DML触发器的研究与应用.pdf

    在SQL Server中,主要有两种类型的DML触发器:AFTER触发器和INSTEAD OF触发器。 AFTER触发器是在数据行已经被插入、更新或删除之后执行的触发器。它是SQL Server中较传统的一种触发器类型,通常用于执行一些附加的...

    利用SQL Server 2005触发器保证数据完整性之研究.pdf

    AFTER触发器在数据记录更新操作(INSERT、DELETE和UPDATE)以及INSTEADOF触发器和约束之后被激发,用于检查和处理记录变化后的数据完整性。而INSTEADOF触发器则在处理约束之前被激发,特别适用于更新视图,并允许...

    SQLServer触发器语法.pdf

    2. INSTEAD OF 触发器:执行触发器而不是执行触发 SQL 语句,从而替代触发语句的操作。 3. FOR 触发器:相当于 AFTER 触发器,但可以选择是否指定触发器所有者名称。 三、触发器的执行顺序 触发器的执行顺序如下所...

    如何使用SQL语句创建触发器

    与AFTER触发器不同,INSTEAD OF触发器在试图进行更新操作时立即执行,而不是在操作完成后。这个触发器的作用是,当尝试更新`Student_view`中的成绩时,实际上是在`sc`表中进行更新,确保了数据更改发生在正确的位置...

Global site tag (gtag.js) - Google Analytics