SQL 触发器(学生,课程表,选修表)
SQL 触发器(学生,课程表,选修表)
触发器是一种特殊类型的存储过程,它不由用户通过命令来执行,而是在用户对表执行了插入,删除或修改表中数据等操作时激活执行。可以这样形容:存储过程像一个遥控炸弹,我们可以根据需要控制它何时爆炸;而触发器却像一个地雷,一旦踩中就会爆炸。
一.创建触发器
- --创建一个名为"Update_course"的触发器,如发现课程表的学时列发生变化时,激活触发器,在屏幕上显示"Hello,lqsilly:课程表学时已被修改,触发器起到作用"
- create trigger Update_course
- on 课程
- for insert,update,delete
- as
- if UPDATE(学时)
- select *
- from 课程
- print 'Hello,lqsilly:课程表学时已被修改,触发器起到作用'
- update 课程
- set 学时=88
- where 课程号='1'
二.使用触发器
- --1.了解Inserted表和Deleted表的作用
- --在学生表上创建触发器insert_update_delete_stu,用于查看Inserted表和Deleted表结构和内容.
- create trigger insert_update_delete_stu
- on 学生
- for insert,update,delete
- as
- select * from inserted
- select * from deleted
- sp_help insert_update_delete_stu
- sp_helptext insert_update_delete_stu
- --把学生表中学号为'1001'的学生姓名改为"张永立"
- update 学生
- set 姓名='李小白'
- where 学号='1001'
备注:
上面的运行结果所示表明,更新语句执行时,触发器insert_update_delete_stu被激活,产生Inserted表和Deleted表,Deleted表存放旧数据,此时学生姓名为"张永立",Insert表存放新数据,此时学生姓名为"李小白"
- --2.Insert触发器
- --当向表中插入记录时,insert触发器被激活.一般情况下,这种触发器常用来检查插入的数据是否满足要求.
- --在数据库中创建名为"stu_course_sc"触发器,当向选修表插入一行时,检查该行的学号列在学生表中是否存在,课程号列在课程表中是否存在,如有一项不成立,则不允许插入.并显示出错信息"学生表或课程表中没有相关的记录"
- create trigger stu_course_sc
- on 选修
- for insert
- as
- if exists (select * from inserted
- where inserted.学号 not in (select 学号 from 学生)
- or inserted.课程号 not in (select 课程号 from 课程))
- begin
- raiserror('学生表或课程表中没有相关的记录',16,1)
- rollback
- end
- sp_help stu_course_sc
- sp_helptext stu_course_sc
- insert into 选修 values('10001','11',97,'2013-05-02')
备注:
1.raiserror 函数用于返回用户定义的错误信息并设置系统标志。第2个参数是错误的严重级别;第3个参数表示有关错误调用状态的信息.
2.rollback表示回滚,不允许插入新行
- --3.Delete触发器
- --delete触发器通常用于防止那些确实要删除.但是可能会引起数据一致性问题的情况,一般是那些在其他表的外部键;另一方面用于级联删除操作,即在删除父记录的同时级联删除了记录
- --例:在"学生成绩管理"数据库中有"学生,课程表,选修表"3个表,我们可以这样设想,当某个学生退学不读书了,那么他在选修表中的信息也应该被删除.现创建一个触发器,名为"Delete_sc".如果要删除学生表中的记录,则与该记录学号对应的选修表中的选修记录也一起删除.
- create trigger Delete_sc
- on 学生
- for delete
- as
- delete 选修 where 选修.学号 in(select 学号 from deleted)
- 当执行以下语句,删除选修表中学号为'1001'的记录时,我们可观察到学生表和选修表的变化
- delete 学生
- where 学号='1001'
备注:
从结果可以看出,学生表中学号为1001的记录和选修表中学号为1001的记录同时被删除
三.查看触发器
--用于查看触发器的一般信息。
sp_help [触发器名称]
--用于显示存储过程的源代码
sp_helptext [触发器名称]
--用于查看指定触发器所引用的表或者指定的表涉及的所有触发器。格式如下:
sp_depends [触发器名称]
sp_depends [表名]
例:
sp_depends Delete_sc
sp_depends 选修
四.修改触发器
使用 alter trigger命令修改触发器
例:把触发器Update_course 修改为当删除课程表中的记录时,显示"记录已被删除,触发器起到作用"
alter trigger Update_course
on 课程 for delete
as
select * from 课程
print '记录已被删除,触发器起到作用'
五.重命名触发器
- --把触发器 Update_course 重命名为"Update_课程"
- sp_rename Update_course,Update_课程
- sp_helptext Update_课程
六.删除触发器
- --删除触发器"Update_课程"
- drop trigger Update_课程
SQL 触发器(学生,课程表,选修表)的更多相关文章
- SQL 存储过程(学生,课程表,选修表)
SQL 存储过程(学生,课程表,选修表) 一.存储过程的分类 在SQL Server中存储过程分过两类: 1)系统存储过程("sp_"作为前缀) 2)用户自定义存储过程 二.创建和 ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
- SQL触发器中的inserted表和deleted表
开发也有年头了,但是触发器确实用的比较少,但是无容置疑触发器确实不错, 最近项目要求需要用到的触发器特别多.频繁,觉得很有必要记录和积累下. 在触发器语句中用两个特殊的表一个是deleted表和ins ...
- sql 触发器 针对一张表数据写入 另一张表 的增删改
ALTER TRIGGER [dbo].[tri_test2] ON [dbo].[student] for INSERT,DELETE,UPDATEAS BEGIN if not exists (s ...
- 学生表 课程表 成绩表 教师表 50个常用sql语句
原文:http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572276.html Student(S#,Sname,Sage,Ssex) ...
- 数据库 简单查询 Sql Server 学生表 课程表 选课表
创建教材中的三张表格,并输入相应的数据 Create table student( Sno char(9), Same char(20), Ssex char(2), Sage smallint, S ...
- 数据库SQL语句中 查询选修了全部课程的学生的学号和姓名
一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: select S#,SNAME ...
- sql-hive笔试题整理 1 (学生表-成绩表-课程表-教师表)
题记:一直在写各种sql查询语句,最长的有一百多行,自信什么需求都可以接,可......,想了想,可能一直在固定的场景下写,平时也是以满足实际需求为目的,竟不知道应试的题都是怎么出的,又应该怎么做.遂 ...
- SQL知识整理一:触发器、存储过程、表变量、临时表
触发器 触发器的基础知识 create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,] ...
随机推荐
- WPF中动态添加xaml资源文件
一.新建一个资源文件,然后设置其Build Actoin(生成操作)为Resource(资源): 二.在App.xaml.cs的StartUp事件或者是你需要的时机代码段写上如下代码: Resourc ...
- Frequent values && Ping pong
Frequent values 题意是不同颜色区间首尾相接,询问一个区间内同色区间的最长长度. 网上流行的做法,包括翻出来之前POJ的代码也是RMQ做法,对于序列上的每个数,记录该数向左和向右延续的最 ...
- SGU 168
SGU 168,寻找矩阵中右上方,右方,下方最小的元素,采用动态规划解答. #include <iostream> #include <vector> #include < ...
- svn:revert to this version 和 revert changes from this version的区别 假设我们有许多个版本,版本号分别是1-10
假设我们有许多个版本,版本号分别是1-10 如果我们在7这里选择revert to this version那么7之后的8,9,10的操作都会被消除 如果在7选择revert changes from ...
- Windbg:如何给字符串下条件断点
因为Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp.用法和c中的字符串比较方法一致.在需要比较字符串成员变量的时候,遇到了点问题.因为字符串成员变量无法直接获取字符串内容.p ...
- RabbitMQ消息队列(一): Detailed Introduction 详细介绍(转)
1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...
- 微信公众平台 Premature end of file
今天在研究微信公众平台 自动接收发送消息的时候,在如下代码: public String processRequest(HttpServletRequest request) { String res ...
- python项目
python实战项目: http://www.the5fire.com/category/python实战/ python基础教程中的十个项目: python项目练习一:即时标记 python项目练习 ...
- poj3186 poj3267
两道很不错的dp 3186很神似回文词,合并石子之类的问题: 一开始不知道怎么在dp方程中体现权值天数,很来才想起来 对于一段区间[i,j],里面的东西必然是要卖完的 又因为只能从两头开始卖,所以 d ...
- bzoj1025: [SCOI2009] 游戏 6
DP. 每种排法的长度对应所有循环节长度的最小公倍数. 所以排法总数为和为n的几个数的最小公倍数的总数. #include<cstdio> #include<algorithm> ...