该文章为原创,日后可能会根据实际开发经验和网友评论,进行相应地方修改,为获得最新博客动态,望在转发博客的时候注明出处。

触发器要实现的功能:

(1)获取对表Table1数据操作操作类型(insert、delete或update)。

(2)将表修改后的数据保存到表Table2(该表结构与Table1表结构类似)。

例如:

1>向表Table1添加数据1,表保存后,将数据1添加到表Table2,并将操作类型:insert,保存到表Table2的ChangeType列。

2>修改表Table1,将数据1改成数据2,表保存后,将数据2添加到表Table2,并将操作类型:update,保存到表Table2的ChangeType列。

3>删除表Table1数据1,表保存后,将数据2添加到表Table2,并将操作类型:delete,保存到表Table2的ChangeType列。

表结构:

(1)表Table1

 CREATE TABLE Table1(
[ID] [BIGINT] IDENTITY(1,1) NOT NULL,
[Name] [NVARCHAR](20) NULL,
[Sex] [NVARCHAR](2) NULL,
[Address] [NVARCHAR](50) NULL,
[Age] [INT] NULL,
[Birthday] [DATE] NULL
) ON [PRIMARY]

(2)表Table2

 CREATE TABLE Table2(
[ID] [BIGINT] IDENTITY(1,1) NOT NULL,
[Name] [NVARCHAR](20) NULL,
[Sex] [NVARCHAR](2) NULL,
[Address] [NVARCHAR](50) NULL,
[Age] [INT] NULL,
[Birthday] [DATE] NULL,
[ChangeType] [NVARCHAR](50) NOT NULL
) ON [PRIMARY]

触发器Tri_Table1

 CREATE  TRIGGER [Tri_Table1] ON [Table1]
--After触发器,对表进行insert、delete、update后触发
AFTER INSERT, DELETE, UPDATE
AS
BEGIN
BEGIN TRY
BEGIN TRAN;
DECLARE @maxID NVARCHAR(50) ,
@inserted INT ,
@deleted INT ,
@ChangeType NVARCHAR(20);
SELECT @inserted = COUNT(1)
FROM Inserted;
SELECT @deleted = COUNT(1)
FROM Deleted;
--判断对表Table1的操作类型
IF @inserted > 0
AND @deleted = 0
BEGIN
SET @ChangeType = 'INSERT';
END;
ELSE
IF @inserted > 0
AND @deleted > 0
BEGIN
SET @ChangeType = 'UPDATE';
END;
ELSE
IF @inserted = 0
AND @deleted > 0
BEGIN
SET @ChangeType = 'DELETE';
END;
IF @ChangeType = 'DELETE'
BEGIN
SELECT @maxID = Id
FROM Deleted;
--如果对Table1同一条数据,进行多次操作,则Table2只保存最新数据
IF EXISTS ( SELECT COUNT(1)
FROM Table2
WHERE Id = @maxID )
BEGIN
DELETE FROM Table2
WHERE Id = @maxID;
END;
INSERT INTO Table2
(
)
SELECT ID,
Name,
Sex,
Address,
Age,
Birthday,
@ChangeType AS ChangeType
FROM Deleted;
END;
ELSE
BEGIN
SELECT @maxID = Id
FROM Inserted;
IF EXISTS ( SELECT COUNT(1)
FROM Table2
WHERE Id = @maxID )
BEGIN
DELETE FROM Table2
WHERE Id = @maxID;
END;
INSERT INTO Table2
(
ID,
Name,
Sex,
Address,
Age,
Birthday,
ChangeType
)
SELECT ID,
Name,
Sex,
Address,
Age,
Birthday,
@ChangeType AS ChangeType
FROM Inserted
END;
COMMIT TRAN;
END TRY
BEGIN CATCH
IF XACT_STATE() = -1
ROLLBACK TRAN;
END CATCH;
END;

SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表的更多相关文章

  1. php5.4以上 mysqli 实例操作mysql 增,删,改,查

    <?php //php5.4以上 mysqli 实例操作mysql header("Content-type:text/html;charset=utf8"); $conn ...

  2. C# ADO.NET (sql语句连接方式)(增,删,改)

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...

  3. [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]

    [MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...

  4. 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据

    第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...

  5. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  6. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  7. ADO.NET 增 删 改 查

    ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...

  8. MVC EF 增 删 改 查

    using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...

  9. 【转】Android 增,删,改,查 通讯录中的联系人

    一.权限 操作通讯录必须在AndroidManifest.xml中先添加2个权限, <uses-permission android:name="android.permission. ...

随机推荐

  1. [Android] Android统计Apk , jar包方法数

    reference to : http://www.jianshu.com/p/61e8f803e0d1 Android在开发过程中,随着引用的库以及业务的增多,不可避免的会出现64K limit问题 ...

  2. PHP表单与验证

    一.Header()函数 标头 (header) 是服务器以 HTTP 协议传 HTML 资料到浏览器前所送出的字符串,在标头与 HTML 文件之间尚需空一行分隔. /*一.Header()函数 */ ...

  3. c#去掉小数点后的无效0

    decimal d = 0.0500m; d.ToString("0.##")就出来了 也可以这样 string.Format("{0:0.##}",d000) ...

  4. Struts2学习(一)

    struts2 就是 web层开发框架,符合MVC模式 入门程序 创建web工程 导入jar包 下载struts2的jar包  struts-2.3.15.1-all 版本. 注意:在struts2开 ...

  5. SpringMVC学习(二)

    SpringMVC入门(注解方式) 需求 实现商品查询列表功能. 第一步:创建Web项目 springmvc02 第二步:导入jar包 第三步:配置前端控制器 在WEB-INF\web.xml中配置前 ...

  6. 【Mybatis框架】查询缓存(一级缓存)

    做Java的各位程序员们,估计SSH和SSM是我们的基础必备框架.也就是说我们都已经至少接触过了这两套常见的集成框架.当我们用SSH的时候,相信很多人都接触过hibernate的两级缓存,同样,相对应 ...

  7. jq点击显示,再点击隐藏

    每次都会遇到的问题: <script> $("button").click(function(){ if($(".div").css("d ...

  8. ggplot2包的说明文档[分享]

  9. 【BZOJ】3751: [NOIP2014]解方程

    题意 求\(\sum_{i=0}^{n} a_i x^i = 0\)在\([1, m]\)内的整数解.(\(0 < n \le 100, |a_i| \le 10^{10000}, a_n \n ...

  10. 【Spring RCP】 RULES规则

    Rich Client 约束规则 1.Constraint 定义了一个约束接口,接口中只有1个方法 public boolean test(Object argument); //这个方法指对约束的检 ...