SQL 使用触发器常见错误
今天做代码审查时,看见以下一段触发器的创建脚本,我们一起来分析一下
create trigger [trigger_puClassRoomType]
on [dbo].[puClassRoomType]
AFTER update
as
declare @roomname nvarchar(100),@roomnumber nvarchar(100)
select @roomname = TypeName,@roomnumber=TypeNumber from Inserted
begin
update ExamingClasses set TypeName=@roomname where TypeNumber=@roomnumber
update PlanNumTimePlace set ClassroomName=@roomname where Classroomnum=@roomnumber
end
go
书写这段代码的程序员可能对 1、SQLServer变量赋值 2、触发器Inserted表 这两个概念模糊,首先我们谈谈Inserted表,代码段中对Inserted表的查询方式没有带任何条件,似乎这张表只有单行一样,这明显是错误的。
SQL Server为每个触发器创建了两个专业表:INSERTED表和DELETED表。这两个逻辑表,由系统来维护。用户不能对它们进行修改。它们存放在内存中而不是数据库中。这两个表的结构总与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也被删除。
- INSERTED表:存放由于执行INSERT或UPDATE语句而要向表中插入的所有行。在执行INSERT或UPDATE操作时,新的行同时添加到激活触发器的表和INSERTED表中,INSERTED表的内容是激活触发器的表中的新行的备份。
- DELETED表:存放由于执行DELETE或UPDATE语句而要从表中删除的所有行。在执行DELETE或UPDATE操作时,被删除的行从激活触发器的表中被移动到DELETED表,这两个表不会有共同的行。
认识到INSERTED表的内容是根据更新条件来的,所以我觉得在使用INSERTED表的时候可以配合游标CURSOR来使用。同时提醒一下,以上代码段中读取INSERTED表的方式,将会返回INSERTED表的最后一行来进行赋值。
SQL Server变量赋值的方式用两种,分别是SET和SELECT,代码段中选择了使用SELECT,而SQL Server推荐使用SET对变量进行赋值。虽然我们在日常工作中使用SELECT的场景比较多,两个赋值方式的概念也了比较解,但他们两者的区别我还是想再强调一下,当赋值失败时,SET和SELECT 的行为是不一样的。这里的赋值失败可能是没有数据或者数据类型不匹配等。此时SELECT会返回上一个值(如果上一个值已经赋值成功),而SET会把NULL赋值给变量。
- 使用SET的情景:1、需要直接赋值,且不需要任何查询,比如变量初始化。2、故意赋予NULL值。3、为了将来的移植而遵循ANSI标准。4、赋予非标量值。
- 使用SELECT的情景:1、直接赋予多值变量。2、通过查询来赋予变量(单值或多值均可)。3、减少代码量。4、为了获取变量如@@ROWCOUNT和@@ERROR的值。
SQL 使用触发器常见错误的更多相关文章
- 【oracle使用笔记1】SQL报的常见错误
项目中使用最多的就是oracle数据库了,在实际的开发中书写SQL时遇到过许多错误,趁着现在不太忙,把之前遇到的总结一下,以后遇到的会持续更新总结. 1. ORA-00001:违反唯一约束条件 [原因 ...
- SQL Server 2008 常见异常收集(持续更新)
写在前面: 最近,在使用SQL Server 2008时,出现了不少问题.发现,很多问题都是以前碰见过的,并且当时也寻找到了解决方法(绝大部分来源于“百度”与“Google”),只是时间一长,又忘记了 ...
- 配置sql server 2000以允许远程访问 及 连接中的四个最常见错误
地址:http://www.cnblogs.com/JoshuaDreaming/archive/2010/12/01/1893242.html 配置sql server 2000以允许远程访问适合故 ...
- SQL Server 损坏修复 之一 常见错误解读
SQL Server 对数据库损坏的错误类型做了细化,在此对几个典型的错误作一下介绍. 错误信息是:“在文件 '%ls'中.偏移量为 %#016I64x 的位置执行 %S_MSG 期间,操作系统已经向 ...
- 【常见的SQL Server连接失败错误以及解决方法】
[常见的SQL Server连接失败错误以及解决方法] http://blog.csdn.net/feixianxxx/article/details/5523922 ADO连接SQL Server ...
- spring + myBatis 常见错误:SQL语法错误
在程序运行时,有时候会出现如下错误: 这个错误通常是你的sqlmapper.xml中sql语句语法有错误.所以请仔细查看你sql语句是否正确,比如{#id}这样写就会报上述错误,其实应该#{id}这样 ...
- DB2常见错误
+098 01568 动态SQL语句用分号结束+100 02000 没有找到满足SQL语句的行+110 01561 用DATA CAPTURE定义的表的更新操作不能发送到原来的子系统+111 0159 ...
- 喜忧参半的SQL Server触发器
SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...
- SQL性能优化常见措施(Lock wait timeout exceeded)
SQL性能优化常见措施 目 录 1.mysql中explain命令使用 2.mysql中mysqldumpslow的使用 3.mysql中修改my.ini配置文件记录日志 4.mysql中如何加索引 ...
随机推荐
- VSS配置
http://www.cnblogs.com/FreeDong/articles/2193151.html
- Gson应用:从json格式简单字符串中获取value
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; i ...
- Note: OBLIVIATE: A Data Oblivious File System for Intel SGX
OBLIVIATE redesigned ORAM for SGX filesystem operations for confuse access patterns to protect user ...
- java知识点积累(一)
知识点积累 1.关于final的重要知识点: final关键字可以用于成员变量.本地变量.方法以及类: final修饰的成员变量必须在声明时被初始化,或者在构造器中初始化,否则就会报编译错误: 不能够 ...
- 关于特殊目录如com null无法删除的处理办法
1.把以下批处理做成一个del.bat放在桌面 del /f /a /q \\?\%1 rd /s /q \\?\%1 2.需要删除的文件或者文件夹拉到这个文件上就可以了 可以删除没有属性项目中没有安 ...
- jmeter-提取器之正则表达式提取器
在接口测试中,有很多的接口参数值是需要从上一个接口的返回值中获取的,这个时候就可以用正则表达式提取器啦 例如: 接口1 /user/login 返回{ "user_ticket" ...
- 基础篇 - pg_isready
pg_isready 发起一个到指定 PostgreSQL数据库的连接检查. 使用方法: pg_isready [选项]... 选项: -d, --dbname=DBNAME 数据库名 -q, --q ...
- Objective-C的Runtime System
[0] Outline -- [1] 版本和平台 -- [2] 与Runtime System交互 -- [3] 方法的动态决议 -- [4] 消息转发 -- [5] 类型编码 -- [6 ...
- LCD浮点数显示函数的探讨
LCD浮点数显示函数的探讨 原创 2017年12月19日 单片机开放附赠的学习资料里面很少见到显示浮点数的函数,显示浮点数的操作也相当烦坠! 一般转换显示法 拿STM32单片机资源,我们选取ADC采样 ...
- Intervals POJ - 1201 差分约束
You are given n closed, integer intervals [ai, bi] and n integers c1, ..., cn. Write a program that: ...