SQL 触发器(学生,课程表,选修表)

触发器是一种特殊类型的存储过程,它不由用户通过命令来执行,而是在用户对表执行了插入,删除或修改表中数据等操作时激活执行。可以这样形容:存储过程像一个遥控炸弹,我们可以根据需要控制它何时爆炸;而触发器却像一个地雷,一旦踩中就会爆炸。

一.创建触发器

  1. --创建一个名为"Update_course"的触发器,如发现课程表的学时列发生变化时,激活触发器,在屏幕上显示"Hello,lqsilly:课程表学时已被修改,触发器起到作用"
  2. create trigger Update_course
  3. on 课程
  4. for insert,update,delete
  5. as
  6. if UPDATE(学时)
  7. select *
  8. from 课程
  9. print 'Hello,lqsilly:课程表学时已被修改,触发器起到作用'
  10.  
  11. update 课程
  12. set 学时=88
  13. where 课程号='1'

二.使用触发器

  1. --1.了解Inserted表和Deleted表的作用
  2. --在学生表上创建触发器insert_update_delete_stu,用于查看Inserted表和Deleted表结构和内容.
  3. create trigger insert_update_delete_stu
  4. on 学生
  5. for insert,update,delete
  6. as
  7. select * from inserted
  8. select * from deleted
  9.  
  10. sp_help insert_update_delete_stu
  11.  
  12. sp_helptext insert_update_delete_stu
  13.  
  14. --把学生表中学号为'1001'的学生姓名改为"张永立"
  15. update 学生
  16. set 姓名='李小白'
  17. where 学号='1001'

备注:

上面的运行结果所示表明,更新语句执行时,触发器insert_update_delete_stu被激活,产生Inserted表和Deleted表,Deleted表存放旧数据,此时学生姓名为"张永立",Insert表存放新数据,此时学生姓名为"李小白"

  1. --2.Insert触发器
  2. --当向表中插入记录时,insert触发器被激活.一般情况下,这种触发器常用来检查插入的数据是否满足要求.
  3. --在数据库中创建名为"stu_course_sc"触发器,当向选修表插入一行时,检查该行的学号列在学生表中是否存在,课程号列在课程表中是否存在,如有一项不成立,则不允许插入.并显示出错信息"学生表或课程表中没有相关的记录"
  4. create trigger stu_course_sc
  5. on 选修
  6. for insert
  7. as
  8. if exists (select * from inserted
  9. where inserted.学号 not in (select 学号 from 学生)
  10. or inserted.课程号 not in (select 课程号 from 课程))
  11. begin
  12. raiserror('学生表或课程表中没有相关的记录',16,1)
  13. rollback
  14. end
  15.  
  16. sp_help stu_course_sc
  17.  
  18. sp_helptext stu_course_sc
  19.  
  20. insert into 选修 values('10001','11',97,'2013-05-02')

备注:

1.raiserror 函数用于返回用户定义的错误信息并设置系统标志。第2个参数是错误的严重级别;第3个参数表示有关错误调用状态的信息.

2.rollback表示回滚,不允许插入新行

  1. --3.Delete触发器
  2. --delete触发器通常用于防止那些确实要删除.但是可能会引起数据一致性问题的情况,一般是那些在其他表的外部键;另一方面用于级联删除操作,即在删除父记录的同时级联删除了记录
  3. --例:在"学生成绩管理"数据库中有"学生,课程表,选修表"3个表,我们可以这样设想,当某个学生退学不读书了,那么他在选修表中的信息也应该被删除.现创建一个触发器,名为"Delete_sc".如果要删除学生表中的记录,则与该记录学号对应的选修表中的选修记录也一起删除.
  4. create trigger Delete_sc
  5. on 学生
  6. for delete
  7. as
  8. delete 选修 where 选修.学号 in(select 学号 from deleted)
  9.  
  10. 当执行以下语句,删除选修表中学号为'1001'的记录时,我们可观察到学生表和选修表的变化
  11. delete 学生
  12. 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 '记录已被删除,触发器起到作用'

五.重命名触发器

  1. --把触发器 Update_course 重命名为"Update_课程"
  2. sp_rename Update_course,Update_课程
  3. sp_helptext Update_课程

六.删除触发器

  1. --删除触发器"Update_课程"
  2. drop trigger Update_课程

SQL 触发器(学生,课程表,选修表)的更多相关文章

  1. SQL 存储过程(学生,课程表,选修表)

    SQL 存储过程(学生,课程表,选修表) 一.存储过程的分类 在SQL Server中存储过程分过两类: 1)系统存储过程("sp_"作为前缀) 2)用户自定义存储过程 二.创建和 ...

  2. SQL触发器中的deleted表和inserted表

    SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...

  3. SQL触发器中的inserted表和deleted表

    开发也有年头了,但是触发器确实用的比较少,但是无容置疑触发器确实不错, 最近项目要求需要用到的触发器特别多.频繁,觉得很有必要记录和积累下. 在触发器语句中用两个特殊的表一个是deleted表和ins ...

  4. sql 触发器 针对一张表数据写入 另一张表 的增删改

    ALTER TRIGGER [dbo].[tri_test2] ON [dbo].[student] for INSERT,DELETE,UPDATEAS BEGIN if not exists (s ...

  5. 学生表 课程表 成绩表 教师表 50个常用sql语句

    原文:http://www.cnblogs.com/zengxiangzhan/archive/2009/09/23/1572276.html Student(S#,Sname,Sage,Ssex) ...

  6. 数据库 简单查询 Sql Server 学生表 课程表 选课表

    创建教材中的三张表格,并输入相应的数据 Create table student( Sno char(9), Same char(20), Ssex char(2), Sage smallint, S ...

  7. 数据库SQL语句中 查询选修了全部课程的学生的学号和姓名

    一.SQL语言查询选修了全部课程的学生的学号和姓名. 两种解决途径: 第一种: 我们可以表示为在SC表中某个学生选修的课程数等于C表中课程总数.相应的SQL语言如下: select S#,SNAME ...

  8. sql-hive笔试题整理 1 (学生表-成绩表-课程表-教师表)

    题记:一直在写各种sql查询语句,最长的有一百多行,自信什么需求都可以接,可......,想了想,可能一直在固定的场景下写,平时也是以满足实际需求为目的,竟不知道应试的题都是怎么出的,又应该怎么做.遂 ...

  9. SQL知识整理一:触发器、存储过程、表变量、临时表

    触发器 触发器的基础知识 create trigger tr_name on table/view {for | after | instead of } [update][,][insert][,] ...

随机推荐

  1. WPF中动态添加xaml资源文件

    一.新建一个资源文件,然后设置其Build Actoin(生成操作)为Resource(资源): 二.在App.xaml.cs的StartUp事件或者是你需要的时机代码段写上如下代码: Resourc ...

  2. Frequent values && Ping pong

    Frequent values 题意是不同颜色区间首尾相接,询问一个区间内同色区间的最长长度. 网上流行的做法,包括翻出来之前POJ的代码也是RMQ做法,对于序列上的每个数,记录该数向左和向右延续的最 ...

  3. SGU 168

    SGU 168,寻找矩阵中右上方,右方,下方最小的元素,采用动态规划解答. #include <iostream> #include <vector> #include < ...

  4. 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 ...

  5. Windbg:如何给字符串下条件断点

    因为Windgb支持MASM语法,字符串的比较方法有$scmp和$sicmp.用法和c中的字符串比较方法一致.在需要比较字符串成员变量的时候,遇到了点问题.因为字符串成员变量无法直接获取字符串内容.p ...

  6. RabbitMQ消息队列(一): Detailed Introduction 详细介绍(转)

    1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...

  7. 微信公众平台 Premature end of file

    今天在研究微信公众平台 自动接收发送消息的时候,在如下代码: public String processRequest(HttpServletRequest request) { String res ...

  8. python项目

    python实战项目: http://www.the5fire.com/category/python实战/ python基础教程中的十个项目: python项目练习一:即时标记 python项目练习 ...

  9. poj3186 poj3267

    两道很不错的dp 3186很神似回文词,合并石子之类的问题: 一开始不知道怎么在dp方程中体现权值天数,很来才想起来 对于一段区间[i,j],里面的东西必然是要卖完的 又因为只能从两头开始卖,所以 d ...

  10. bzoj1025: [SCOI2009] 游戏 6

    DP. 每种排法的长度对应所有循环节长度的最小公倍数. 所以排法总数为和为n的几个数的最小公倍数的总数. #include<cstdio> #include<algorithm> ...