关于触发器的使用,有很多争议。

触发器的好处不言而喻是增强了数据的校验能力,能够有效地实现复杂的业务逻辑。在一定程度上走的比约束和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. 如何:在OpenText Workflow 6.5模型中保存和读取多行数据

    在Captaris Workflow 6.0和之前的版本中,保存多行数据似乎没有被提及,因此大部分(包括我的团队)都要自己建立(利用IDE的向导也算)数据库来保存订单项.物品列表.人员列表这样的多行集 ...

  2. vue实现多行数据提交_(Vue起步)3.Vue设计模式:MVVM模式

    ①公众号:王酱酱记 ②记录跟着文档学习Vue的一些关键点,持续更新.感兴趣的小白建议关注一下 ③Vue的MVVM模式与传统的MVC模式有什么区别呢?这道题被面试大大虐过,之前无知的我好惨,赶快看起来吧 ...

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

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

  4. 利用SQL中的递归返回多行数据的连接

    有个数据表testC,数据为 col                                                ---------------------------------- ...

  5. txt文件参数化200用户,返回在表格中查看只能看到100行数据

    1.找到安装目录下的config/vugen文件 2.找到参数MaxVisibleLines 3.修改自己定义的最大值

  6. vue实现多行数据提交_2020年大厂面试指南 Vue篇

    点击蓝字 「前端小苑」关注我 导读 vue的一些基础知识,以及相关实现原理,一直是面试中比较热门的题目,本文梳理了常见的Vue面试题. 注意:关于底层实现原理,建议最好还是参照源码进行学习,有些原理相 ...

  7. vue实现多行数据提交_Vue+Mockjs,模拟接口数据,实现前后端独立开发

    前后端分工协作是一个非常高效的做法,但是有时前后端分离不彻底会很痛苦.前后端应该是异步进行的,进度互不影响,但是在没有mock的时候,前端却严重依赖后端的接口,总会苦苦等待后端接口出来才能继续开发.为 ...

  8. Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中

    Python之Pandas:利用pandas实现行数据添加,即将字典格式的数据,按照行数据,从头开始循环添加到dataframe中e中 目录 利用pandas实现行数据添加,即将字典格式的数据,按照行 ...

  9. java list 赋值jsp,在Struts中使用JavaBean和List(多行数据)类型属性-JSP教程,Java技巧及代码...

    在 strust 中,我们可能经常要在 actionform 中使用其他 javabean 作为属性类型,这里就存在着如何使用好这些属性与 html form 之间的数据交换,下面我们就这些问题做一讲 ...

最新文章

  1. python计算平方面积_python中求平方
  2. Effective Java之列表由于数组(二十五)
  3. Flink SQL Client注册Python UDF完整流程
  4. mysql数据库单用户_SQLServer数据库之SqlServer数据库单用户模式无法删除的处理
  5. 为什么我不推荐敏捷开发?
  6. ANDROID开发中注意不同手机CPU架构对SO文件的不同需求。
  7. java azure blobs sas_仅使用SAS令牌连接到Azure存储帐户?
  8. matlab中做出球面和圆柱面,matlab画柱面与球面切线
  9. eclipse中debug断点上有一个斜杠是什么
  10. 杭电CTF 练习题RE WP
  11. 算法基础课【合集1】
  12. Python利用Matplotlib绘图无法显示中文字体的解决方案
  13. php后端程序员58同城,后端开发 PHP等 高新区javaWeb
  14. HP-UNIX 磁带备份-----make_tape_recovery命令详解
  15. 马云:房价熄火,2020年或再现一个“暴利”行业,将造就一波新的财富传奇
  16. git和github到底是什么的缩写?
  17. 关于IOS的Autolayout特性的理解以及使用
  18. CSS样式书写顺序 与 浏览器内部加载原理
  19. 2021年广西省安全员C证考试报名及广西省安全员C证考试资料
  20. 21天学通C语言-学习笔记(3)

热门文章

  1. pcb天线和纯铜天线_一种2.4GHz水平极化全向天线设计
  2. FPGA之道(83)功能仿真之仿真语法(Graphic Waveform )
  3. Debugging JTAG
  4. FPGA开发之RAM IP的使用
  5. iOS下的 Fixed BUG
  6. 转:Android之 MTP框架和流程分析
  7. if...else 小练习
  8. 谈谈弹性Web托管的“弹性”
  9. keepalived+nginx
  10. 完整java开发中JDBC连接数据库代码和步骤