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为每个触发 ...
随机推荐
- UE4点选源码分析
在UE插件开发中,时常会用到场景预览窗口的功能,也经常会有点选场景里的物体而同步改变工具界面的需求,网上教程多为讲解如何打开一个预览界面.在最近的一次需求开发中,我粗读了关卡编辑器和蓝图编辑器的Vie ...
- linux50个常用命令
1.存放用户账号的文件在哪里? /etc/passwd 2.如何删除一个非空的目录? rm -rf 目录名 3.查看当前的工作目录用什么命令? pwd 4.创建一个文件夹用什么命令? mkdir 5. ...
- python数据统计之禅道bug统计
背景 通过定期输出 每条产品的 BUG 情况,以此来反馈开发解决问题.测试跟进问题的情况:钉钉群推送提醒开发及时解决 以此我这边开始着手准备编写一个小工具,最终达到目的:自动定期发送统计报告,报告维度 ...
- Vue系列-03-vue-cli自动化工具
使用Vue-CLI创建项目 安装vue-cli脚手架 Mac安装vue-cli脚手架 lichengguo@lichengguodeMacBook-Pro ~ % sudo npm install - ...
- 关于knn算法的总结思考
更多的关于k近邻算法的思考 KNN(K- Nearest Neighbor)法即K最邻近法,数据挖掘分类技术中最简单的方法之一 对k近邻算法的总结: 优点部分 其可以解决分类问题,同时可以天然的解决多 ...
- CMD下编译运行Java程序
准备1:JDK下好了 准备2:环境变量配置好了 准备3:本次测试用的是JDK8,用JDK10的在Eclipse里面好像用不了 满足上面三个条件,那可以继续看下去了 Test_1:带包编译运行 代码: ...
- 剑指 Offer 68 - II. 二叉树的最近公共祖先
剑指 Offer 68 - II. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近 ...
- MongoDB 数据库创建删除、表(集合) 创建删除、数据增删改查
使用数据库.创建数据库 use student 如果真的想把这个数据库创建成功,那么必须插入一个数据. 数据库中不能直接插入数据,只能往集合(collections)中插入数据.不需要专门创建集合,只 ...
- ITIL学习笔记——ITIL入门小知识
1. 什么是ITIL? ITIL即IT基础架构库(Information Technology Infrastructure Library)由英国政府部门CCTA(Central Computing ...
- MVVMLight学习笔记(六)---DispatchHelper更新UI
一.概述 在应用程序中,线程可以被看做是应用程序的一个较小的执行单位.每个应用程序都至少拥有一个线程,我们称为主线程.当调用和操作主线程的时候,该操作将动作添加到一个队列中,每个操作均按照将它们添加到 ...