• SqlServer 中的触发器


    SqlServer 触发器实现多表之间同步增加、删除与更新

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

     

    触发器的使用模版如下

     

    CREATE TRIGGER 触发器名称 
    ON 表名称
    AFTER INSERT /UPDATE/DELETE
    AS 
    
    BEGIN INSERT INTO 
    B表(B表字段1,B表字段2,B表字段3)
    SELECT A表字段1,A表字段2,A表字段3 
    FROM INSERTED/DELETED
    END
    

     

      

     

     

    新建两张表,如下,第一张是操作表,第二张表是为了测试触发器效果的

    create table dbo.testtable(
    id int identity (1,1),
    name varchar(20))
    
    create table dbo.htesttable(
    id int identity (1,1),
    name varchar(20),
    timerecord datetime,
    updatedt datetime)
    

     

    新增的触发器

    CREATE TRIGGER [DBO].[TRG_TESTTABLE_INSERT] ON [DBO].[TESTTABLE] AFTER INSERT AS
    BEGIN
    
    INSERT INTO HTESTTABLE 
    SELECT I.NAME+'INSERT' ,GETDATE(),GETDATE()
    FROM INSERTED I 
        
    END
    

    更新的触发器

    ALTER/Create  TRIGGER [dbo].[TRG_TESTTABLE_update] ON [dbo].[testtable] AFTER update AS
    BEGIN
    
    INSERT INTO HTESTTABLE 
    SELECT I.NAME + 'update',getdate(),getdate()
    FROM deleted I 
    
    INSERT INTO HTESTTABLE 
    SELECT I.NAME + 'update2',getdate(),getdate()
    	FROM inserted I 
        
    END
    

    解释:
    在删除(delete)数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted
    而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。

    更新操作可以认为是执行了两个操作,先把那一行记录delete掉,然后再insert,
    这样update操作实际上就对deleted表和inserted表的操作,所以不会有updated表了;

    有的时候两个表是主外键关系,想删除主表数据的同时把子表相关的数据也删除,
    这个时候如果用触发器就没有效果了,因为这个触发器是在你删除表后才触发的,
    这个时候直接终止,提示“有主外键关系,不能删除等”,所有这样的删除触发器是没有效果的

      

    删除的触发器

    CREATE   TRIGGER [DBO].[TRG_TESTTABLE_DELETE] ON [DBO].[TESTTABLE] AFTER DELETE AS
    BEGIN
    
    INSERT INTO HTESTTABLE 
    SELECT D.NAME + 'DELETE',GETDATE(),GETDATE()
    FROM DELETED D
        
    END
    

     

     

    如果需要对触发器重命名,只要记住触发器是特殊的存储过程即可,命令如下

    exec sp_rename oldxxx, newxxx

    如何查询触发器

    SELECT * FROM SYSOBJECTS WHERE XTYPE='TR'

    禁用:alter table 表名 disable trigger 触发器名称
    启用:alter table 表名 enable trigger 触发器名称

     

  • 相关阅读:
    c++笔试题3
    C++笔试题
    C++编程指南续(10-11)
    C++详解(8-9)
    C++编程指南(6-7)
    C++编程指南续(4-5)
    C++编程指南续
    C++的编程指南
    HPSocket介绍与使用
    WinForm中TreeView控件实现鼠标拖动节点(可实现同级节点位置互换,或拖到目标子节点)
  • 原文地址:https://www.cnblogs.com/qianjinyan/p/10330717.html
Copyright © 2020-2023  润新知