一个关于SQL Server数据库的触发器实例

/******************************************************************
** 文件名:
** Copyright (c) 2003-2004 *********
** 创建人:
** 日 期:2004-5-26
** 修改人:
** 日 期:
** 描 述:
** affair_read表的一个插入触发器,用于将T_Sys_Message表的相应消息删除
** 版 本:v1.0
**----------------------------------------------------------------------------
******************************************************************/
    CREATE TRIGGER [affair_read_InsertTrigger] ON dbo.affair_read
    FOR INSERT
    AS
   
    /* 声明触发器使用的变量 */
    DECLARE
    @doc_no varchar(30),--邮件发送人
    @tcode varchar(250),--邮件阅读人
    @Message_ID int,--消息ID
    @ename  varchar(64), --职工姓名
    @ecode varchar(24) --职工代码
    /* 开始事务 Remove_TopSubject*/
    BEGIN TRAN Remove_TopSubject
   /*取出插入记录的相应字段值*/

   /*赋值要使用Select*/
    Select @doc_no=doc_no From Inserted
    Select @tcode=tcode From Inserted
    /* 保存插入前保存点,防止出错 */
    Save Tran my_Save1
   
    /* 删除T_Sys_Message表的相应消息 */
    DELETE FROM T_Sys_Message WHERE Message_ID IN
           (SELECT Message_ID FROM (SELECT a.Message_ID FROM T_Sys_Message a,T_Sys_MessageInterface b
                   WHERE a.Message_ID=b.Message_ID AND a.Takeover_Person=@tcode AND b.Column_Value=@doc_no)  AS TMP)
    If @@Error = 0
    Commit Transaction
    Else
    Begin
    Rollback Transaction my_Save1
    Raiserror('数据库错误,请与系统管理员联系',16,1)
    End
   
    /*------------------代码结束---------------------*/

 

 

 

/******************************************************************
** 文件名:
** Copyright (c) 2003-2004 *********
** 创建人:
** 日 期:2004-5-26
** 修改人:
** 日 期:
** 描 述:
** private_affair表的一个修改触发器,用于向T_Sys_Message表插入一条消息
** 版 本:v1.0
**----------------------------------------------------------------------------
******************************************************************/
    CREATE TRIGGER [private_affair_UpdateTrigger] ON dbo.private_affair
    FOR UPDATE
    AS
   
    /* 定义触发器使用的变量 */
    DECLARE
    @creator varchar(24),--邮件发送人
    @receiver varchar(250),--邮件接收人,可能多个ecode,用逗号连接
    @starting_date Datetime,--邮件发送时间
    @title  varchar(60), --邮件标题
    @ename  varchar(64), --职工姓名
    @ecode varchar(24), --职工代码
    @affair_id varchar(20), --邮件编号
    @procedure Char(1) --邮件状态

    /* 声明临时表 */
    DECLARE @tmp table
    (
     [Messagg_Name] [nvarchar] (1000) ,
 [Issue_Person] [nvarchar] (255) ,
 [Takeover_Person] [varchar] (24) ,
 [Message_Date] [datetime] ,
 [Messagg_Type] [smallint] ,
 [Marker] [varchar] (20)  ,
 [Remark] [nvarchar] (500) 
    )


    /*取出插入记录的相应字段值*/   

    /*Update,Delete操作共用系统提供的Deleted表,Insert操作使用系统提供的Inserted表*/

    SELECT @affair_id=affair_id From Deleted


    SELECT @creator=creator FROM private_affair WHERE affair_id=@affair_id
    SELECT @receiver=receiver FROM private_affair WHERE affair_id=@affair_id
    SELECT @starting_date=starting_date FROM private_affair WHERE affair_id=@affair_id
    SELECT @title=title FROM private_affair WHERE affair_id=@affair_id   
    SELECT @procedure=[procedure] FROM private_affair WHERE affair_id=@affair_id


 
    /* 开始事务 */
    BEGIN TRAN Remove_TopSubject

    /* 保存插入前保存点,防止出错 */
    Save Tran my_Save1
   
    /* 分拆邮件接收人 */

    DECLARE
    @Counter Smallint, --计数器
    @Separator char(1)  --分隔符
   
    SELECT @Counter=0
    SELECT @Separator=','
   
     /* 获取发送人职工姓名 */
    SELECT @ename=ename FROM ecode WHERE ecode=@creator

    /* 判断本邮件是否已经在消息表中 */
    IF (NOT EXISTS(SELECT 1 FROM T_Sys_MessageInterface WHERE Column_Value=@affair_id)) AND (@procedure=1)
    BEGIN
        WHILE len(@receiver)>0
        BEGIN
             SELECT @ecode=substring(@receiver,0,CHARINDEX(@Separator,@receiver))
             /* 插入数据到T_Sys_Message表 */
             INSERT INTO T_Sys_Message(Messagg_Name,Issue_Person,Takeover_Person,Message_Date,Messagg_Type)
                    VALUES(@title,@ename,@ecode,@starting_date,'10')

             /* 将关键字值插入T_Sys_MessageInterface表 */ 
             INSERT INTO T_Sys_MessageInterface(Message_ID,Table_Name,Column_Name,Column_Value)
                    VALUES(@@IDENTITY,'affair_read','doc_no',@affair_id)
     
             SELECT @Counter=@Counter+1
             SELECT @receiver=substring(@receiver,CHARINDEX(@Separator,@receiver)+1,len(@receiver))
        END
    END

    If @@Error = 0
    Commit Transaction
    Else
    Begin
    Rollback Transaction my_Save1
    Raiserror('邮件发送错误,请与系统管理员联系',16,1)
    End
   
    /*------------------代码结束---------------------*/

posted on 2004年5月27日 17:05

阅读更多
个人分类: 数据库技术
想对作者说点什么? 我来说一句

SQL触发器使用实例

2012年06月22日 9KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭