&练习一

如下所示三张表( 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触发器练习的更多相关文章

  1. sql update 触发器 可获得被update的行的信息

    类型:转载   sql update 触发器 可获得被update的行的信息,需要的朋友可以参考下. 复制代码 代码如下: create trigger TgName on tb for update ...

  2. SQL server触发器中 update insert delete 分别给写个例子被。

    SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...

  3. 在Sql Server触发器中判断操作是Insert还是Update还是Delete

    在Sql Server触发器中判断操作是Insert还是Update还是Delete DECLARE    @IsInsert bit,    @IsUpdate bit,    @IsDelete  ...

  4. SQL Server触发器

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...

  5. SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  6. [SQL] SQL Server 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  7. SQL Server 触发器(转)

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  8. PL/SQL之--触发器

    一.简介 触发器在数据库里以独立的对象进行存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来触发运行.oracle事件指的是对数据库的表或视图进行的inse ...

  9. SQL Server 触发器【转】

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  10. SQL Server 触发器创建、删除、修改、查看示例

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...

随机推荐

  1. 打开JAVA之门:idea的安装及JAVA环境的创建

    打开JAVA之门:idea的安装及JAVA环境的创建 1.idea的下载安装 首先打开 ->->->(IntelliJ IDEA: The Capable & Ergonom ...

  2. Server-Speaks-First 有点坑,Linkerd 2.10 中的协议检测和不透明端口

    协议检测(Protocol detection),顾名思义,允许 Linkerd 自动检测 TCP 连接中使用的协议. Linkerd 的设计原则之一是"just work",协议 ...

  3. Javac 编译器

    编译过程 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器. 解析与填充符号表过程,包括: 词法.语法分析,将源代码的字符流转变为标记集合,构造出抽象语法 ...

  4. Bugku-web-秋名山老司机

    计算式子的值然后使用post方法传值.直接脚本跑. import requestsimport reurl = "http://123.206.87.240:8002/qiumingshan ...

  5. 使用AVPro Video在Unity中播放开场视频(CG)笔记

    游戏中的开场CG(播放视频),采用的插件为AVPro Video1.x(和W的版本一致),Unity版本为2018.4.0f1 Asset Store:AVPro Video - Core Andro ...

  6. 1002 A+B for Polynomials (25分) 格式错误

    算法笔记上能踩的坑都踩了. #include<iostream> using namespace std; float a[1001];//至少1000个位置 int main(){ in ...

  7. 使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法

    使用sklearn中的fetch_mldata的错误情况以及可能可行的解决方法 在notebook使用的时候出现了报错 from sklearn.datasets import fetch_mldat ...

  8. Nginx整数溢出漏洞 Writeup

    Nginx整数溢出漏洞 CVE-2017-7529 题目URL:http://www.whalwl.site:8040/ 漏洞描述 在 Nginx 的 range filter 中存在整数溢出漏洞,可 ...

  9. 【工作篇】再次熟悉 SpringMVC 参数绑定

    前言 主要现在项目中使用的参数绑定五花八门的,搞得很头大,例如有些用字符串接收日期,用字符串接受数组等等,完全没有利用好 SpringMVC 的优势,这里自己也总结一下,免得到时又要百度谷歌查找. 以 ...

  10. 当Transactional碰到锁,有个大坑,要小心。

    你好呀,我是why. 前几天在某平台看到一个技术问题,很有意思啊. 涉及到的两个技术点,大家平时开发使用的也比较多,但是属于一个小细节,深挖下去,还是有点意思的. 来,先带你看一下问题是什么,同时给你 ...