初识SQLSERVER触发器(一)

    触发器是一种特殊的存储过程,类似于其它编程语言中的事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,当在表(视图)中插入、更新、删除记录时,触发一个或一系列 T-SQL 语句。
    本专题的目的并非是向您详尽地介绍触发器,而是系统地向您介绍触发器的常用知识与相关应用,并与您一起探讨应用经验,如果您需要了解触发器不常用的知识点,请参见 SQL Server™ 联机丛书(安装 SQL Server™ 时默认是安装的)。
a.基础-创建一个简单的触发器

   触发器是一种特殊的存储过程,类似于事件函数,SQL Server™ 允许为 INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列 T-SQL语句。

    触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写 T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。

创建触发器用 CREATE TRIGGER

CREATE TRIGGER 触发器名称
ON 表名
FOR INSERT、UPDATE 或 DELETE
AS
    T-SQL 语句

注意:触发器名称是不加引号的。

如下是联机丛书上的一个示例,当在 titles 表上更改记录时,发送邮件通知 MaryM。

CREATE   TRIGGER  reminder
ON  titles
FOR   INSERT UPDATE DELETE  
AS
   
EXEC  master..xp_sendmail  ' MaryM '
      
' Don '' t forget to print a report for the distributors. '

b.基础-删除触发器

    用查询分析器删除
    在查询分析器中使用 drop trigger 触发器名称 来删除触发器。
    也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称...
    注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在:
    if Exists(select name from sysobjects where name=触发器名称 and xtype='TR')

    用企业管理器删除
    在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。

c.基础-重命名触发器

    用查询分析器重命名
    exec sp_rename 原名称, 新名称
sp_rename 是 SQL Server™ 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

    用企业管理器重命名
在表上点右键->“所有任务”->“管理触发器”,选中所要重命名的触发器,修改触发器语句中的触发器名称,点击“确定”。

d.复杂一点的触发器

    INSTEAD OF
    执行触发器语句,但不执行触发触发器的 SQL 语句,比如试图删除一条记录时,将执行触发器指定的语句,此时不再执行 delete 语句。例:

初识SQLSERVER触发器(一) create   trigger  f
初识SQLSERVER触发器(一)
on  tbl
初识SQLSERVER触发器(一)instead 
of   delete
初识SQLSERVER触发器(一)
as
初识SQLSERVER触发器(一)    
insert   into  Logs初识SQLSERVER触发器(一)

   IF UPDATE(列名)
检查是否更新了某一列,用于 insert 或 update,不能用于 delete。例:

create   trigger  f
on  tbl
for   update
as
    
if   update (status)  or   update (title)
        sql_statement 
-- 更新了 status 或 title 列

 

inserted、deleted
这是两个虚拟表,inserted 保存的是 insert 或 update 之后所影响的记录形成的表,deleted 保存的是 delete 或 update 之前所影响的记录形成的表。例:

create   trigger  tbl_delete
on  tbl
for   delete
as
    
declare   @title   varchar ( 200 )
    
select   @title = title  from  deleted
    
insert   into  Logs(logContent)  values ( ' 删除了 title 为: '   +  title  +   ' 的记录 ' )


说明:如果向 inserted 或 deleted 虚拟表中取字段类型为 text、image 的字段值时,所取得的值将会是 null。

你可能感兴趣的:(sqlserver)