SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表
该文章为原创,日后可能会根据实际开发经验和网友评论,进行相应地方修改,为获得最新博客动态,望在转发博客的时候注明出处。
触发器要实现的功能:
(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触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表的更多相关文章
- php5.4以上 mysqli 实例操作mysql 增,删,改,查
<?php //php5.4以上 mysqli 实例操作mysql header("Content-type:text/html;charset=utf8"); $conn ...
- C# ADO.NET (sql语句连接方式)(增,删,改)
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]
[MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...
- 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据
第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
- 【转】Android 增,删,改,查 通讯录中的联系人
一.权限 操作通讯录必须在AndroidManifest.xml中先添加2个权限, <uses-permission android:name="android.permission. ...
随机推荐
- [转]odoo常用openerp-server.conf配置参数详解
参数 说明 用法 addons_path addons模块的查找路径,多个路径用逗号分隔 addons_path = E:\GreenOdoo8.0\source\openerp\addons csv ...
- C#调用webservice简单实例
如何利用IIS创建webservice不多做阐述,直接讲C#代码中如何调用已创建好的webservice. 首先在VS2010中新建一个工程项目,然后右键点击工程名选择添加服务引用. 在URL一栏中输 ...
- JS和JQuery的总结
JS部分 一, 词法结构 区分大小 注意://单行 /*多行注释*/ 字面量(直接量literal) 12 // 数字 5.8//小数 "hello" 'hello' true ...
- jasig CAS 实现单点登录 - java、php客户端登录实现
jasig CAS项目本身就是一个完整的CAS单点登录服务 1.服务端需要把 认证处理类.用户属性返回值处理类 调整成我们自己处理类即可实现单点登录 2.java客户端需要引入cas-client- ...
- css笔记1: html页面的CSS、DIV命名规则
原地址:http://www.cnblogs.com/rising-fay/archive/2013/02/25/2932592.html CSS命名规则 头:header 内容:content/co ...
- 低功耗蓝牙BLE之连接事件、连接参数和更新方法
转自:http://blog.csdn.net/zzfenglin/article/details/51304084 连接事件 在一个连接当中,主设备会在每个连接事件里向从设备发送数据包.一个连接事件 ...
- windows下编译及使用libevent
Libevent官网:http://libevent.org/ windows 7下编译: 编译环境: windows 7 + VS2010 (1)解压libevent到F:\libevent\lib ...
- Android Studio 之 no render target selected
今天第一次使用android studio, 莫名其妙出现 no render target selected的错误,没有设计界面, 各种百度之后在 stackoverflow.com/questio ...
- 一把鼻涕一把泪 搭建公网ftp服务器
至于为什么要搭建公网ftp服务器,就当我心血来潮吧. ftp开源工具很多,咱用的是filezilla服务器.后来为了方便搭建web服务器,就改成了集成工具xampp.客户端工具也是filezilla ...
- 在此为LCT开一个永久的坑
其实我连splay都还不怎么会. 今天先抄了黄学长的bzoj2049,以后一定要把它理解了. 写LCT怎么能不%数据结构大神yeweining呢?%%%chrysanthemums %%%切掉大森林 ...