关于触发器的使用,有很多争议。
触发器的好处不言而喻是增强了数据的校验能力,能够有效地实现复杂的业务逻辑。在一定程度上走的比约束和check走的更远。
关于触发器的坏处,最典型的就是触发器的使用会导致系统性能下降,数据的不可控性,尤其是跨表检测,以及可能导致的触发器递归更加加深了数据的维护难度和不可控性。

本文无意讨论触发器的原理和好坏,旨在描述一个关于批量数据提交时的触发器是如何设计的。

SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE TRIGGER [TRI_xxx] ON xxx
FOR INSERT,UPDATE
AS
SET NOCOUNT ON

DECLARE 
--检测标志设置
  @CHECK INT,    
--定义公共变量 
  @TODAY DATETIME
--定义基表变量
  @field1 INT,
  @field2 INT,
  @field3 VARCHAR(20),
  @fieldN INT,
--定义跨表变量  
  @table1_field1 INT,
  @table1_field2 INT,
  @tableN_fieldM INT
--定义游标
  DECLARE cur_xxx CURSOR FOR
    SELECT field1,field2,field3,fieldN FROM INSERTED 
--如果非集合修改,则定义为如下
/*
SELECT @field1=field1,
       @field2=field2,
       @field3=field3,
       @field4=field4,
FROM INSERTED
*/

SET @TODAY=CONVERT(VARCHAR(10),GETDATE(),120)
  
  OPEN CUR_ZYGD
  FETCH NEXT FROM cur_xxx INTO @field1,@field2,@field3,@fieldN

WHILE (@@FETCH_STATUS=0) 
  BEGIN

------------------------------------------------------------------------
--------------------以下针对不同的规则,进行相关处理--------------------
------------------------------------------------------------------------

--满足某某条件,则不处理直接退出
  IF cond1
  BEGIN
    CLOSE cur_xxx             --非游标,无需该语句
    DEALLOCATE cur_xxx        --非游标,无需该语句
    RETURN
  END

--满足某某条件,则提示处理直接退出
  IF cond2
  BEGIN  
    RAISERROR('XXX错误!',16,1)
    ROLLBACK TRAN 
    CLOSE cur_xxx             --非游标,无需该语句
    DEALLOCATE cur_xxx        --非游标,无需该语句
    RETURN  
  END
  
--跨表检查,满足某某条件,则提示处理直接退出
  SELECT TOP 1 @table1_field1=field1 FROM table1 WHERE 1=1
  IF cond3 IS NOT NULL
  BEGIN
    RAISERROR('XXX错误!',16,1)
    ROLLBACK TRAN
    CLOSE cur_xxx            --非游标,无需该语句
    DEALLOCATE cur_xxx       --非游标,无需该语句
    RETURN  
  ELSE 
  BEGIN
    SET @field1=@table1_field1  --可能会根据其他跨表的结果更新当前值
  END  
  
  --最后根据主键更新相关值
  UPDATE xxx 
     SET field1=@field1,
         field2=@field2
   WHERE PrimaryKey=@PrimaryKey AND (ISNULL(field1,'')<>ISNULL(@field1,'') OR ISNULL(field2,0)<>ISNULL(@field2,0))

FETCH NEXT FROM cur_xxx INTO @field1,@field2,@field3,@fieldN

END

CLOSE CUR_xxx
DEALLOCATE CUR_xxx

SET NOCOUNT OFF

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

关于SQLServer2000中触发器的使用——多行数据提交的更多相关文章

  1. 【2017-07-03】JS连续删除table中的选中的多行数据

    deleteRow() 连续删除多行 应用:删除表格选中的一行或多行.html代码如下: <table > <tr> <td >复选框</td> < ...

  2. JQuery 遍历table中的checkbox 并对行数据进行校验

    JQuery中confirm的使用 $(document).ready(function () { $("#Btn_Print").click(function () { var ...

  3. element-ui 中 el-table 根据scope.row行数据变化动态显示行内控件

    加入本行的数据为scope.row,其数据格式为 { "propertyId": 4, "propertyName": "标题", &quo ...

  4. php中magic_quotes_gpc的作用 解决日文数据提交后多出来反斜杠的问题

    magic_quotes_gpc发生作用是在传递$_GET,$_POST,$_COOKIE时 1.条件: magic_quotes_gpc=off写入数据库的字符串未经过任何过滤处理.从数据库读出的字 ...

  5. GridControl 主从模式(Master-detail)子表格获取行数据

    今天遇到一个问题,gridcontrol使用主从表的时候,在子表中获取子表的行数据时居然获取不到,郁闷了很久.然后在网上找到方法(出处在这里:https://q.cnblogs.com/q/83412 ...

  6. PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码

    项目环境是php5.3.28 项目用的ThinkPHP3.2.3  已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...

  7. SQL中触发器的使用

    创建触发器 是特殊的存储过程,自动执行,一般不要有返回值 类型: 1.后触发器 (AFTER,FOR)先执行对应语句,后执行触发器中的语句 2.前触发器  并没有真正的执行触发语句(insert,up ...

  8. mssql sqlserver 禁止删除数据表中指定行数据(转自:http://www.maomao365.com/?p=5323)

    转自:http://www.maomao365.com/?p=5323 摘要:下文主要讲述,如何禁止删除数据表中指定行数据 最近收到用户一个需求,禁止所有人删除”表A”中,ID 为1.2.3.4.5的 ...

  9. MFC 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,已解决。

    CKagulaCEdit是CEdit的一个继承类,m_edit的CKagulaCEdit类型的一个变量 调用的时候,是这样的: 编辑框中字体大小改变,行高不能改变,只能显示一半的问题,问题如下: 这时 ...

随机推荐

  1. mysql中limit的用法详解[数据分页常用]

    在我们使用查询语句的时候,经常要返回前几条或者中间某几行的数据,这个时候怎么办呢?不用担心,mysql已经为我们提供了这样一个功能. SELECT * FROM table LIMIT [offset ...

  2. Oracle管道函数(Pipelined Table Function)实现的实例

    1. 简单的例子(返回单列的表) 1>创建一个表类型 create or replace type t_table is table of number; 2>创建函数返回上面定义的类型 ...

  3. 如果从码云上git clone项目

    1.本地找个文件夹右击选择 git base 2.输入地址 弹出一个窗口 需要输入用户名.密码(就是码云的登录名.密码) 3.完成

  4. 学习笔记20151211——AXI4 STREAM DATA FIFO

    AXI4 STREAM DATA FIFO是输入输出接口均为AXIS接口的数据缓存器,和其他fifo一样是先进先出形式.可以在跨时钟域的应用中用于数据缓冲,避免亚稳态出现.支持数据的分割和数据拼接.在 ...

  5. Android 4.3发布 新增4大改变25日推送升级[附Android 4.3 工厂镜像]

    北京时间7月25日,谷歌举行发布会,正式发布了全新的Nexus 7平板电脑以及Android 4.3系统. 其中Android 4.3系统隶属于4.X果冻豆(Jelly Bean)系列,是目前最新的操 ...

  6. start-stop-daemon自动启动、关闭后台程序参数传递

    /************************************************************************* * start-stop-daemon自动启动.关 ...

  7. Codeforces 580B: Kefa and Company(前缀和)

    http://codeforces.com/problemset/problem/580/B 题意:Kefa有n个朋友,要和这n个朋友中的一些出去,这些朋友有一些钱,并且和Kefa有一定的友谊值,要求 ...

  8. 白帽子讲web安全——白帽子兵法(设计安全方案中的技巧)

    1.Secure By Default原则 白名单:筛选出被允许的,屏蔽其他. 黑名单:屏蔽可能造成的威胁. 2.XSS和SSH XSS攻击:跨站脚本(cross site script)攻击是指恶意 ...

  9. HDU5296 Annoying problem(LCA)

    //#pragma comment(linker, "/STACK:1677721600") #include <map> #include <set> # ...

  10. 设计模式(Python)-简单工厂,工厂方法和抽象工厂模式

    本系列文章是希望将软件项目中最常见的设计模式用通俗易懂的语言来讲解清楚,并通过Python来实现,每个设计模式都是围绕如下三个问题: 为什么?即为什么要使用这个设计模式,在使用这个模式之前存在什么样的 ...