2018年11月16日SQL Server实验内容(触发器实验)
--注意:先把studentmanager数据库中的所有表用select into命令复制一份,
--然后用复制后新表完成下面的实验,同时,对每个触发器都要进行验证。
select *into department2 from department
select *into course2 from course
select *into class2 from class
select *into teacher2 from teacher
select *into t_c2 from t_c
select *into s_c2 from s_c
select *into student2 from student
--1、创建触发器tr_s1,在录入学生信息时同时显示表中的所有记录,并执行测试语句。
create trigger tr_s1
on student2
for insert
as
select *from student2
print'信息已录入学生表!from_tr_s1'
go
insert into student2(s_id,s_name) values('2016030303','aa')
--2、创建触发器tr_s2,
--在录入学生信息时同时将此学生的学号及大学英语课程号录入到成绩表s_c中(大学英语是公共必修课),
--同时显示录入的记录信息。
create trigger tr_s2
on student2
for insert
as
declare @v_sid char(10)
declare @v_cid char(10)
select @v_sid=(select s_id from inserted)
select @v_cid=
(
select distinct c.course_id from s_c2,course2 c
where s_c2.course_id=c.course_id and course_name='大学英语'
)
insert into s_c2(s_id,course2.course_id) values(@v_sid,@v_cid)
print'信息已录入成绩表!from_tr_s2'
select *from s_c2 where s_id=@v_sid
go
insert into student2(s_id,s_name) values('2016030305','bc')
--3、创建触发器tr_s3,在删除一个毕业生的信息的同时删除这个学生的成绩记录。
--如果没有此学生则给出提示信息。
create trigger tr_s3
on student2
for delete
as
declare @v_sid char(10)
select @v_sid=(select s_id from deleted)
if not exists(select *from s_c2 where s_id=@v_sid)
print '没有此学生from_tr_s3'
else
delete from s_c2 where s_id=@v_sid
go
delete from student2 where s_id='2016030305'
select *from s_c2
--4、 创建触发器tr_s4,当更新某个学生的学号时更新这个学生的选课信息。
create trigger tr_s4
on student2
for update
as
declare @v_sid char(10)
select @v_sid=(select s_id from inserted)
declare @v_dsid char(10)
select @v_dsid=(select s_id from deleted)
if UPDATE(s_id)
begin
update s_c2 set s_id=@v_sid where s_id=@v_dsid
print '更新成功!from_tr_s4'
select * from s_c2
end
go
insert into student2(s_id,s_name) values('2016030310','dr')
update student2 set s_id='2016030311' where s_id='2016030310'
select *from s_c2
select *from student2 where s_id='2016030310'
--5、创建触发器tr_s5,在向学生表插入、更新记录时检测出生日期与入学日期的合法性,
--即出生日期应早于入学日期,若不合法给出提示,并撤销此操作。
create trigger tr_s5
on student2
for insert,update
as
declare @v_S_Born datetime
select @v_S_Born=(select s_borndate from inserted)
declare @v_S_Enroll datetime
select @v_S_Enroll=(select s_enrolldate from inserted)
if ( @v_S_Born)>=(@v_S_Enroll)
begin
raiserror ('error!出生日期应早于入学日期from_tr_s5',16,1)
rollback transaction
end
go
insert into student2(s_id,s_name,s_borndate,s_enrolldate) values('2016030313','dcc',2016-01-01,1998-10-16)
--error!出生日期应早于入学日期
--消息 3609,级别 16,状态 1,第 1 行
--事务在触发器中结束。批处理已中止。
select * from student2
--6、创建触发器ts_s6,用来控制不能更新“姓名”列。
create trigger ts_s6
on student2
for update
as
if UPDATE(s_name)
begin
raiserror('error!姓名不能更新!from_tr_s6',16,1)
rollback transaction
end
go
update student2 set s_name='ccc' where s_name='dr'
--姓名不能更新
--消息 3609,级别 16,状态 1,第 1 行
--事务在触发器中结束。批处理已中止。
select*from student2
--7、分别使用管理平台和SQL语句删除、禁用、启用触发器
--(1)删除触发器tr_21 drop trigger 触发器名
drop trigger tr_21
--(2)禁用触发器tr_s1 alter table 表名 disable trigger 触发器名
alter table student2 disable trigger tr_s1
--(3)启用触发器tr_s1 alter table 表名 enable trigger 触发器名
alter table student2 enable trigger tr_s1
附录:实验过程中用到的知识:
1、使用CREATE TRIGGER语句定义触发器,ALTER TRIGGER语句修改触发器,DROP TRIGGER语句删除触发器。
2、如果触发语句对应的表上有完整性约束,这些完整性约束必须不违背时,相应的触发语句才能执行,然后才能触发对应的触发器。
3、SQL SERVER为每个触发器都创建了两个临时表INSERTED表和DELETED表,这两个表的逻辑结构与被触发器作用的表一样,用户可以读取这两个表的内容,但不能对它们进行修改,触发器执行完后,这两个表也会自动删除。当执行INSERT时,INSERTED表中保存要向表中插入的所有行;当执行DELETE时,DELETED表中保存要从表中删除的所有行;当执行UPDATE时,修改前的行保存在DELETED表中,修改后的行保存在INSERTED行中。
2018年11月16日SQL Server实验内容(触发器实验)的更多相关文章
- 2018年11月16日 我和SB交流有代沟-继续字符串4
test="abcdeffedcba" v=test.lstrip("bcabc")#寻找的是最多匹配然后移除指定字符串 print("1.lstri ...
- linux学习第四天 (Linux就该这么学)2018年11月16日
今天主要讲了 管道符,重写向与环境变量 输入输出重写向 标准输出重写向 (标准,覆盖,错误) > 将标准输出重写向到一个文件中 >> 追加到文件 2>错误输出重定向 2> ...
- 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦
上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...
- 2016年11月16日 星期三 --出埃及记 Exodus 20:7
2016年11月16日 星期三 --出埃及记 Exodus 20:7 "You shall not misuse the name of the LORD your God, for the ...
- 北京Uber优步司机奖励政策(11月16日~11月22日)
用户组:人民优步“关羽组”(适用于11月16日-11月22日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/ ...
- Apache Struts最新漏洞 远程代码执行漏洞预警 2018年11月08日
2018年11月8日,SINE安全监控检测中心,检测到Apache Struts官方更新了一个Struts漏洞补丁,这个漏洞是Apache Struts目前最新的漏洞,影响范围较广,低于Apache ...
- CocoaPods管理iOS项目 2018年11月06日
一.创建Test工程项目 二.打开终端 当前pod版本(1.6.0.beta.2最新版本2018年11月06日)和gem源路径(https://gems.ruby-china.com): 1.cd+当 ...
- CocoaPods更新2018年11月06日16:06:48
https://gems.ruby-china.org点进去就知道了…… CocoaPods命令 更新 sudo gem install -n /usr/local/bin cocoapods --p ...
- 2016年11月17日--SQL主、外键,子查询
主键 数据库主键是指表中一个列或列的组合,其值能唯一地标识表中的每一行.这样的一列或多列称为表的主键,通过它可强制表的实体完整性.当创建或更改表时可通过定义 PRIMARY KEY约束来创建主键.一个 ...
随机推荐
- 记一次 Billu_b0x渗透
目录: 0x01 寻找ip 1.这边我们是使用的nmap来寻找我们的靶机IP地址,开始Ip是1,结束是254,153是我kali的ip,所以158就是我们的靶机的ip地址了. 2. 查看端口服务 这边 ...
- 实现 MyBatis 流式查询的方法
基本概念流式查询指的是查询成功后不是返回一个集合而是返回一个迭代器,应用每次从迭代器取一条查询结果.流式查询的好处是能够降低内存使用.如果没有流式查询,我们想要从数据库取 1000 万条记录而又没有足 ...
- sentry can not delete release bug
sentry can not delete release bug bug $ ./node_modules/@sentry/cli/bin/sentry-cli releases list $ ./ ...
- 编程术语 All In One
编程术语 All In One js 名词,术语 函数 函数签名 一个函数签名 (或类型签名,或方法签名) 定义了 函数 或 方法 的输入与输出. 一个签名可以包括: 参数 及参数的 类型 一个返回值 ...
- queueMicrotask & EventLoop & macrotask & microtask
queueMicrotask https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/queueMicro ...
- Masterboxan INC :个股出现疯涨,投资者需警惕股市泡沫
随着标普500指数自去年三月以来的暴涨,引发了很多亏损企业股价飙升,同时许多场外投资者盲目跟风,加剧了个股的疯涨.对于此现象,美国万事达资产管理有限公司不得不多次发文提醒投资者:个股出现疯涨,投资者需 ...
- iOS拍照定制之AVCapturePhotoOutput
问题 领导安排任务,写个拍照功能,界面跟系统拍照有点出入 拍完照片,底部显示已拍照片,有个拍照上限[在此不论] 点击已拍照片,可以预览.放大缩小查看 思路 系统拍照肯定不行了,只能定制,没提是否拍照禁 ...
- 视频+图文串讲:MySQL 行锁、间隙锁、Next-Key-Lock、以及实现记录存在的话就更新,如果记录不存在的话就插入如何保证并发安全
导读 Hi,大家好!我是白日梦!本文是MySQL专题的第 27 篇. 下文还是白日梦以自导自演的方式,围绕"如何实现记录存在的话就更新,如果记录不存在的话就插入."展开本话题.看看 ...
- Python插入排序
升序 import random l = [] for i in range(8): l.append(random.randint(0,9)) print(l) for cur in range(1 ...
- 阿里巴巴Druid,轻松实现MySQL数据库连接加密!
为什么要加密? 现在的开发习惯,无论是公司的项目还是个人的项目,都会选择将源码上传到 Git 服务器(GitHub.Gitee 或是自建服务器),但只要将源码提交到公网服务器就会存在源码泄漏的风险,而 ...