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为每个触发 ...
随机推荐
- JIPB | 两篇连发:华中农大黄俊斌团队报道二羟基异丁酰化调控稻曲病菌致病新机制
水稻是我国重要的粮食作物,稻曲病是水稻三大病害之一,不仅造成稻米产量损失,更重要的是稻曲球中的稻曲菌素的毒性和致畸作用,给人畜健康带来严重威胁.病原菌对植物的侵袭是由病原菌的毒力和植物免疫系统相互作用 ...
- 测试JUC安全类型的集合:CopyOnWriteArrayList
测试JUC安全类型的集合:CopyOnWriteArrayList 代码: package multithreading.TestSynchronized; import com.sun.xml.in ...
- Git出错:“Please make sure you have the correct access rights and the repository exists.”
此问题是需要重置ssh密钥 解决步骤如下: 1.重置用户名和邮箱: 打开Git Bash 进入Git命令,输入以下命令 git config --global user.name "你的用户 ...
- jupyter notebook使用python虚拟环境
jupyter指定环境启动 背景 系统环境中安装有jupyter及相关库,因项目需要,新建了一个torch相关的虚拟环境并安装了对应的内容, 此时,想通过系统中的jupyter启动一个可以应用虚拟环境 ...
- 【Vulnhub】DC-1靶机
一.信息收集 1.1 环境 kali : 192.168.124.141 DC-1 : 192.168.124.150 1.2 nmap进行扫描 :nmap -sV 192.168.124.150 I ...
- MySQL自动填充
一.数据库级别 1.1 表设计 create_time默认值添加CURRENT_TIMESTAMP. update_time默认值添加CURRENT_TIMESTAMP,更新打勾. 1.2 验证是否成 ...
- Centos7上yum安装mongodb(安装epel中的版本可能会比较老)
yum install epel-release 搜索mongodb-server 安装mongodb yum install mongodb-server.x86_64 配置mongodb vim ...
- 如何快速排查发现redis的bigkey?4种方案一次性给到你!
本篇文章将以redis的bigkey为主题进行技术展开,通过从认识redis的高性能,bigkey的危害.存在原因.4种解决方案,到模拟实战演练的介绍方式,来跟大家一起认识.探讨和学习redis. 先 ...
- C#中IEumerable的简单了解
参考网址:https://blog.csdn.net/qq_39806817/article/details/115024666 一.IEnumerable简单介绍IEnumerable是可枚举类型, ...
- C++智能指针的原理和实现
一.智能指针起因 在C++中,动态内存的管理是由程序员自己申请和释放的,用一对运算符完成:new和delete. new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针: delete:指向 ...