SQL触发器

    技术2022-05-20  56

    定义: 在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。  常见的触发器有三种:分别应用于Insert , Update , Delete 事件。

    Trigger语法 CREATE TRIGGER trigger_name ON { table | view } [ WITH ENCRYPTION ] --用于加密触发器 { { { FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS [ { IF UPDATE ( column ) [ { AND | OR } UPDATE ( column ) ] [ ...n ] | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask ) { comparison_operator } column_bitmask [ ...n ] } ] sql_statement [ ...n ] } }

    比如,这么两个表:       Create Table Student(              --学生表         StudentID int primary key,       --学号         ....        )       Create Table BorrowRecord(               --学生借书记录表         BorrowRecord   int identity(1,1),       --流水号           StudentID      int ,                    --学号         BorrowDate     datetime,                --借出时间         ReturnDAte     Datetime,                --归还时间         ...       )

    用到的功能有:         1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号);         2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。      等等。

    这时候可以用到触发器。

    创建一个Update触发器:      Create Trigger truStudent        On Student                         --在Student表中创建触发器        for Update                          --为什么事件触发      As                                        --事件触发后所要做的事情        if Update(StudentID)                   begin          Update BorrowRecord            Set StudentID=i.StudentID            From BorrowRecord br , Deleted   d ,Inserted i      --Deleted和Inserted临时表            Where br.StudentID=d.StudentID        end       

    注意Deleted 与Inserted分别表示触发事件的表“旧的一条记录”和“新的一条记录”。      一个数据库系统中有两个虚拟表用于存储在表中记录改动的信息,分别是:                              虚拟表Inserted                     虚拟表Deleted

    一个Update 的过程可以看作为:生成新的记录到Inserted表,复制旧的记录到Deleted表,然后删除Student记录并写入新纪录。

    创建一个Delete触发器      Create trigger trdStudent        On Student        for Delete      As        Delete BorrowRecord          From BorrowRecord br , Deleted d          Where br.StudentID=d.StudentID

    关于触发器,还应该注意 (1)、DELETE 触发器不能捕获 TRUNCATE TABLE 语句。 (2)、触发器中不允许以下 Transact-SQL 语句: ALTER DATABASE CREATE DATABASE DISK INIT DISK RESIZE DROP DATABASE LOAD DATABASE LOAD LOG RECONFIGURE RESTORE DATABASE RESTORE LOG (3)、触发器最多可以嵌套 32 层。

    修改触发器 将 CREATE TRIGGER ... 修改为 ALTER TRIGGER ...

    --删除触发器 DROP TRIGGER xxx 

     

    触发器的基础知识和例子 :create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,][delete] [with encryption] as {batch | if update (col_name) [{and|or} update (col_name)] } 说明: 1 tr_name :触发器名称 2 on table/view :触发器所作用的表。一个触发器只能作用于一个表 3 for 和after :同义 4 after 与instead of :sql 2000新增项目afrer 与 instead of 的区别 After 在触发事件发生以后才被激活,只可以建立在表上 Instead of 代替了相应的触发事件而被执行,既可以建立在表上也可以建立在视图上 5 insert、update、delete:激活触发器的三种操作,可以同时执行,也可选其一 6 if update (col_name):表明所作的操作对指定列是否有影响,有影响,则激活触发器。此外,因为delete 操作只对行有影响, 所以如果使用delete操作就不能用这条语句了(虽然使用也不出错,但是不能激活触发器,没意义)。 7 触发器执行时用到的两个特殊表:deleted ,inserted deleted 和inserted 可以说是一种特殊的临时表,是在进行激活触发器时由系统自动生成的,其结构与触发器作用的表结构是一 样的,只是存放 的数据有差异。

     

    注意:update 操作相当于先进行delete 再进行insert ,所以在进行update操作时,修改前的数据拷贝一条到deleted 表中,修改后的数据在存到触发器作用的表的同时,也同时生成一条拷贝到insered表中


    最新回复(0)