SQL-UPDATE触发器练习
&练习一
如下所示三张表( student,grade,student_updata_before ):
student表
grade表
Student_update_before表
# 触发器需要实现一下要求:修改学生信息后,将修改前的学生信息添加到student_updata_before表中,并记录操作的用户ip和修改时间。
触发器如下(如有问题,欢迎指出):
1 CREATE TRIGGER Up_stu
2 ON student
3 FOR UPDATE
4 AS
5 IF ( SELECT COUNT(1) FROM inserted ) > 1
6 BEGIN
7 RAISERROR('每次只能更新一条数据',16,10);
8 ROLLBACK;
9 END
10 ELSE
11 BEGIN
12 DECLARE @Ubsid int,@O_sid int,@O_sname varchar(20),@O_sage int,@O_sgname varchar(20),@inf varchar(20),@test varchar(100);
13 SELECT @inf = USER_NAME();
14 SELECT TOP 1 @O_sid=Sid,@O_sname=Sname,@O_sage=Sage,@O_sgname=Sg_name FROM deleted;
15 SET @test ='USER:'+ @inf +'|Old Data:'+ CONVERT(varchar,@O_sid) +'/'+ @O_sname +'/'+ CONVERT(varchar,@O_sage) +'/'+ @O_sgname;
16 IF (SELECT COUNT(1) FROM Student_update_before) = 0
17 SET @Ubsid = 1;
18 ELSE
19 SET @Ubsid = (SELECT MAX(Ubsid) FROM Student_update_before) + 1;
20 INSERT INTO Student_update_before VALUES(@Ubsid,@test,GETDATE());
21 END
22 GO
# 触发器需要实现一下要求:修改学生信息时,不能修改学生的学号信息。
触发器如下(如有问题,欢迎指出):
CREATE TRIGGER tgr_student_up_column
ON student
FOR UPDATE
AS
--列级触发器:是否更新了学生学号
IF (UPDATE(Sid))
BEGIN
RAISERROR('系统提示:学生学号不能修改!', 16, 11);
rollback;
END
go
&练习二
#准备工作:创建员工employee表、部门变动历史dept_history表,工资变动历史sal_history表
#1,创建员工employee表:
CREATE TABLE employee(
eid varchar(20) PRIMARY KEY,
ename varchar(20),
dept varchar(20),
salary int,
uptime date,
status int -- 状态(1表示在职,0表示离职)
)
go
#2,创建部门变动历史dept_history表
1 CREATE TABLE dept_history(
2 did int identity(1,1) primary key,
3 eid varchar(20),
4 olddept varchar(20),
5 newdept varchar(20),
6 uptime date,
7 FOREIGN KEY(eid) REFERENCES employee(eid)
8 )
9 go
#3,创建工资变动历史sal_history表
CREATE TABLE sal_history(
sid int identity(1,1) primary key,
eid varchar(20),
oldsal varchar(20),
newsal varchar(20),
uptime date,
FOREIGN KEY(eid) REFERENCES employee(eid)
)
go
触发器实现功能:当新职工入职时,员工信息表将插入1条数据。同时,触发器在部门变动历史中增加1条记录,其中olddept值为null;在工资变动历史中增加1条记录,其中oldsal值为0。
触发器如下(如有问题,欢迎指出):
1 CREATE TRIGGER Up_em
2 ON employee
3 FOR UPDATE
4 AS
5 IF ( SELECT COUNT(1) FROM DELETED ) > 1
6 BEGIN
7 RAISERROR('每次只能更新一条数据!请重新输入!',16,10)
8 END
9 ELSE
10 BEGIN
11 DECLARE @eid varchar(20),@olddept varchar(20),@newdept varchar(20),@oldsal int,@newsal int,@status int;
12 SELECT TOP 1 @olddept = dept,@oldsal = salary FROM deleted;
13 SELECT TOP 1 @eid = eid,@newdept = dept,@newsal = salary,@status = status FROM inserted;
14 IF NOT EXISTS (SELECT 1 FROM employee WHERE eid = @eid)
15 BEGIN
16 RAISERROR('当前要更新的数据不存在,请插入后进行更新!',16,10);
17 ROLLBACK;
18 END
19 ELSE
20 BEGIN
21 IF @olddept <> @newdept OR @status = 0
22 INSERT INTO dept_history (eid,olddept,newdept,uptime) values(@eid,@olddept,@newdept,GETDATE());
23 IF @oldsal <> @newsal OR @status = 0
24 INSERT INTO sal_history (eid,oldsal,newsal,uptime) values(@eid,@oldsal,@newsal,GETDATE());
25 END
26 END
SQL-UPDATE触发器练习的更多相关文章
- sql update 触发器 可获得被update的行的信息
类型:转载 sql update 触发器 可获得被update的行的信息,需要的朋友可以参考下. 复制代码 代码如下: create trigger TgName on tb for update ...
- SQL server触发器中 update insert delete 分别给写个例子被。
SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...
- 在Sql Server触发器中判断操作是Insert还是Update还是Delete
在Sql Server触发器中判断操作是Insert还是Update还是Delete DECLARE @IsInsert bit, @IsUpdate bit, @IsDelete ...
- SQL Server触发器
一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...
- SQL Server 触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- [SQL] SQL Server 触发器
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- SQL Server 触发器(转)
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- PL/SQL之--触发器
一.简介 触发器在数据库里以独立的对象进行存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来触发运行.oracle事件指的是对数据库的表或视图进行的inse ...
- SQL Server 触发器【转】
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...
- SQL Server 触发器创建、删除、修改、查看示例
一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...
随机推荐
- [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现
[源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现 目录 [源码解析]机器学习参数服务器ps-lite(4) ----- 应用节点实现 0x00 摘要 0x01 基础类 1. ...
- SpringCloud-Alibaba 最新的 依赖版本管理组合以及 整合gateway遇到的问题
一般来说,cloud 与 alibaba 拥有版本组合说明文档wiki,不过这里可以做一个最新的组合的分享. <dependencyManagement> <dependencies ...
- user-agent随笔
常用的user-agent: 一.pc端的user-agent汇总,各大浏览器 1.safari 5.1 – MAC Mozilla/5.0 (Macintosh; U; Intel Mac OS X ...
- RHCAS_DAY06
vi/vim文本编辑器 Vim是从 vi 发展出来的一个文本编辑器,vim 具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性 vi/vim 共分为三种模式:命令模式.输入模式.底线命令模式(末 ...
- MobSF移动安全扫描平台环境搭建与试用
MobSF简介 MobSF(Mobile-Security-Framework)是一种开源自动化的移动应用程序(Android / iOS / Windows)安全测试框架,能够执行静态,动态和恶意软 ...
- shell 获取当前路径 和 2>&1 &的作用
#!/bin/bash current_path=$(cd $(dirname "${BASH_SOURCE[0]}") && pwd) nohup $curren ...
- OSPF的Router-Id
一.实验拓扑 二.实验编址 三.实验步骤: 1.设置PC的IP等信息 2.启动设备(全选) 3.根据实验编址配置路由器端口IP(先不设置lookback端口) R1: R2: R3: R4: 看一下r ...
- OpenCV 之 自定义滤波
图像处理中,"空间域" 指的是图像平面,因此,空间滤波 可定义为:在图像平面内对像素灰度值进行的滤波 1 空间滤波 1.1 滤波过程 如图,Filter 是一个 3x3 滤波核 ...
- 高性能 C++ HTTP 客户端原理与实现
一.什么是Http Client Http协议,是全互联网共同的语言,而Http Client,可以说是我们需要从互联网世界获取数据的最基本方法,它本质上是一个URL到一个网页的转换过程.而有了基本的 ...
- java线程池 面试题(精简)
什么是线程池? 线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理. 如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线 ...