触发器捕获批量修改

  最近在批量更新数据时,发现无论怎么操作触发器都仅仅捕获到了一条数据,触发器代码大致如下。

ALTER TRIGGER [dbo].[Trigger_Demo_Update]
   ON  [dbo].[B_Demo_TB]
   AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @NewData INT,@OldData INT;

    SELECT @OldData=Data FROM DELETED

    SELECT @NewData=Data FROM INSERTED

        IF(@OldData!=@NewData)
        BEGIN
            INSERT INTO M_TriggleSoft(Data)
            VALUES(@NewData)
        END

END

我们知道在触发器中DELETE和INSERTED其实是两张虚表,因此用变量获取仅能得到一条数据,但是如果用游标的话可以获取到位于虚表中的所有数据,批量处理。于是修改如下:

ALTER TRIGGER [dbo].[Trigger_Demo_Update]
   ON  [dbo].[B_Demo_TB]
   AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @NewData INT,@OldData INT;

    DECLARE cursorDel CURSOR FOR SELECT Data FROM DELETED

    DECLARE cursorINSERT CURSOR FOR SELECT Data FROM INSERTED

    open cursorDel
    open cursorINSERT

    FETCH NEXT FROM cursorDel INTO @OldData

    FETCH NEXT FROM cursorINSERT INTO @NewData

    WHILE @@FETCH_STATUS=0
        BEGIN
            IF(@OldData!=@NewData)
            BEGIN
                INSERT INTO M_TriggleSoft(Data)
                VALUES(@NewData)
            END
            FETCH NEXT FROM cursorDel INTO @OldData

            FETCH NEXT FROM cursorINSERT INTO @NewData
         END
    CLOSE cursorDel
    DEALLOCATE cursorDel
    CLOSE cursorINSERT
    DEALLOCATE cursorINSERT
END

既然明白了触发器中DELETE和INSERTED是两张虚表,那么其实上述的操作也可以这么来:

ALTER TRIGGER [dbo].[Trigger_Demo_Update]
   ON  [dbo].[B_Demo_TB]
   AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @NewData INT,@OldData INT;

    SELECT @OldData=Data FROM DELETED

    SELECT @NewData=Data FROM INSERTED

            INSERT INTO M_TriggleSoft(DATA) SELECT Data FROM INSERTED INNER JOIN DELETED ON INSERTED.ID=DELETED.ID WHERE INSERTED.DATA=DELETED.DATA
        END

END
时间: 2024-10-17 15:15:17

触发器捕获批量修改的相关文章

linux下批量修改用户密码

对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用 passwd user 这样的命令来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect 这样的软件来实现,难道修改一下密码还需要单独安装一个软件包吗? 不,我们其实还有其他很多方法可以让我们避开交互的,下面具体写一下具体的实现方式: 第一种:echo "123456" | passwd --stdin root echo doiido:helloboy |chpasswd 优

c#开发:批量修改文件名称

公司有编辑部同事要求写个小程序,能把几百张图片按照一定的规则命名.根据要求,写了一个小程序.这里的规则是死的,没有考虑很多种要求. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;

(转)linux passwd批量修改用户密码

linux passwd批量修改用户密码 原文:http://blog.csdn.net/xuwuhao/article/details/46618913 对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用 passwd user 这样的命令来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect 这样的软件来实现,难道修改一下密码还需要单独安装一个软件包吗? 不,我们其实还有其他很多方法可以让我们避开交互的,下面具体写一下具体的实现方式:

SQL Server如何用触发器捕获DML操作的会话信息

原文:SQL Server如何用触发器捕获DML操作的会话信息 需求背景 上周遇到了这样一个需求,维护人员发现一个表的数据经常被修改,由于历史原因:文档缺少:以及维护人员的经常变更,导致他们对系统也业务也不完全熟悉,他们也不完全清楚哪些系统和应用程序会对这个表的数据进行操作.现在他们想找出有哪些服务器,哪些应用程序会对这个表进行INSERT.UPDATE操作.那么问题来了,怎么去解决这个问题呢? 解决方案 由于数据库版本是标准版,我们选择了使用触发器来捕获进行DML操作的会话的相关信息,例如,H

利用shell脚本批量修改表

最近公司里因为开发新功能,程序员需要快速在某一个库里的所有表添加字段,于是就用shell脚本简单快速实现批量修改表添加字段 #!/bin/bash export mysql_bin=/usr/local/mysql/bin export database=database export tables=`$mysql_bin/mysql -Bse "use ${database};show tables;"` for i in ${tables}         do          

Altium原理图中利用封装管理器批量修改元器件封装

批量修改封装,或者别人拿来原理图让我们画板时,发现封装全不对.如果原理图中同样封装的器件很多时,那么批量修改封装将大大减少你的工作量.下面将我批量修改封装的方法共享给大家. 在原理图界面,打开封装管理器:快捷键T-G,如图,在Design Item ID下选择需要修改的元器件ID,这个ID在设计原理图就确定了,不可以随便改变.如果全局修改本类别的元器件选择这个选项.也可以根据需求选择其他选项.如图,选中需要更改的PC814,并全选. 在图的右下角有Add添加按钮,添加封装,如图: 这时在窗口可以

mysql表名等大小写敏感问题、字段类型timestamp、批量修改表名、oracle查询历史操作记录等

mysql表名等大小写敏感问题:http://blog.csdn.net/postnull/article/details/72455768: 1 MySQL在Linux下数据库名.表名.列名.别名大小写规则是这样的: 2 1.数据库名与表名是严格区分大小写的: 3 2.表的别名是严格区分大小写的: 4 3.列名与列的别名在所有的情况下均是忽略大小写的: 5 4.字段内容默认情况下是大小写不敏感的. ================================================

gitlab连接并批量修改数据库账号邮箱地址(上)

最近,由于公司的域名发生变化,导致需要批量修改gitlab的账号.这个工作对于运维人员来说,工作量还是相对较大的.因此,尝试通过脚本修改数据库的方式进行批量修改. 整个过程大致分为几个阶段: 1)搞清楚gitlab的数据库结构 2)使用Python对相关的字段进行修改,若发现以@xxx结尾的域名,自动替换为@aaa的域名 注:本文中所采用的gitlab安装方式为官方默认的yum安装 1)gitlab的数据库采用的是postgresql,连接库时需要修改pg_hba.conf文件的相关配置 vim

如何批量修改200台以上web服务器密码

作为一个运维工作人员,有时候我们需要对自己负责的web服务器批量修改密码,如果一台一台改,会相对来说较为麻烦,所以在这里我们可以使用NIS账户统一认证. 我们假设有一部账号主控服务器来管理网域中所有主机的账号, 当其他的主机有用户登入的需求时,才到这部主控服务器上面要求相关的账号.密码等用户信息,如此一来,如果想要增加.修改.删除用户数据,只要到这部主控服务器上面处理即可, 这样就能够降低重复设定使用者账号的步骤了! NIS=Network Information Service   网络信息服