• 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_课程


     

    清清软件园 http://sillysoft.taobao.com
  • 相关阅读:
    Android LogCat使用详解
    新时代新潮流WebOS 【20】WebKit的结构与解构
    Android调试的必杀技——反汇编
    真机缺少com.google.android.maps.jar解决方法:
    test
    VMware让ubuntu与win7共享文件方法
    android手机通过笔记本无线wifi上网
    新时代新潮流WebOS 【22】WebKit,鼠标引发的故事
    获取证书
    获取局域网内部机器的MAC地址
  • 原文地址:https://www.cnblogs.com/lqsilly/p/3055739.html
Copyright © 2020-2023  润新知