zoukankan      html  css  js  c++  java
  • 触发器课程SQL Server 知识梳理九 触发器的使用

    本文纯属个人见解,是对前面学习的总结,如有描述不正确的地方还请高手指正~

        

        一、触发器概述

        1、SQL Server供提两种类型的触发器:AFTER触发器和INSTEADOF触发器。

        l  AFTER触发器作用在表上,晚于约束处置。对于AFTER触发器,如果一个表同时拥有约束和触发器,在行进据数作操时,首先行进约束查检,查检功成后再活激触发器。如果查检失败将中断据数作操,并且法无活激触发器。

        l  INSTEAD OF触发器作用在表或视图上,早于约束处置。INSTEAD OF触发器将替换据数作操语言,执行INSTEAD OF触发器中的码代。

        2、触发器可以拜访两种动态生成的殊特表:inserted表、deleted表。

         

        二、创立触发器

        1、语法

        (1)DML

        CREATETRIGGER 触发器名 ON 表或视图名

        [WITHENCRYPTION]

        For|AFTER|INSTEADOF [[INSERT],[UPDATE],[DELETE]]

        AS

                 (主体部份)

        (2)DDL

        CREATETRIGGER 触发器名

        ON ALLSERVER | DATABASE

        For|AFTER

        (事件)

        AS

                 (主体部份)

         

        附注:

        事件:CREATE_TABLE、ALTER_TABLE、DROP_TABLE....

        2、例实

        (1)DML

        ①计设一个单简的AFTER INSERT触发器,这个触发器的作用是:在插入一条录记的时候,收回“又添加了一个先生的成就”的好友提示。

        create triggerscore_insert

        on 成就表

        after insert

        as

        begin

        print '又添加了一个先生的成就'

        end

        ②在成就表上创立一个instead of insert触发器,实现:当向表成就表插入录记时查检分数的合理性,如果不合理就不行进插入作操,否则答应。

        create triggerscore_insert_instead

        on 成就表

        instead of insert

        as

        begin

        set nocounton

        declare @scoreint

        select @score=成就frominserted

        if(@score<0or @score>100)

           print '分数不合理'

        else

           insert into 成就表(学号,课程编号,成就)

           select 学号,课程编号,成就frominserted               

        end

        ③给score表创立一个after insert触发器,实现:当向成就表插入录记时,提示‘向成就表插入了内容为:…的录记’,也就是把插入表中的录记息信示显出来。

        CREATE TRIGGER示显_Insert

        ON 成就表

        AFTER INSERT

        AS

        BEGIN

        declare

        @编号int,

        @学号varchar(14),

        @课程编号int,

        @成就int

        select @编号=编号,@学号=学号,@课程编号=课程编号,@成就=成就from inserted

        print '插入的录记为:'+CAST(@编号AS varchar(16))+','+@学号+','+CAST(@课程编号AS varchar(16))+','+CAST(@成就AS varchar(6))

        END

        ④创立一个触发器‘删除课程表录记_tri’:实现当删除课程表中某门课程的录记时,对应于选课表中相干该课程的有所录记也均删除。

        每日一道理
    记不清有多少个夜晚,在我翻阅纸张的指间滑落;记不清有多少支蜡烛,在我的凝视中化为灰烬。逝者如斯,我时时刻刻会听见自己对生命承诺的余音,感到岁月的流转在渐渐稀释我的年少无知,我愿自己是一只上足了发条的时钟,在昼夜不停的流转中留下自己充实的每一刻。

        create trigger删除课程表录记_tri on 课程表

        for delete

        as

        delete 选课表from 选课表,deleted

        where 选课表.课程号=deleted.课程号

        ⑤创立一个触发器‘课授表录记作操_tri’:当向课授表中插入新记录时查检该记录的职工号在教师表中是不是存在,同时查检课程号在课程表中是不是存在,如有一项不满足件条,则返回错误息信

        create trigger课授表录记作操_tri on 课授表

        for update

        as

        begin

        declare @职工号 varchar(10),@课程号varchar(10)

        if exists(select* from 课授表 where @职工号=职工号)

        begin

           if exists(select *from 课程号 where @课程号=课程号)

               insert into 课授表(职工号,课程号)

               values(@职工号,@课程号)

           else

               print '课程号不存在'

        end

        else

        print '该记录的职工号不存在'

        end

        ⑥创立触发器‘修改先生表1据数_tri’:实现当修改先生表1的录记时,返回提示息信‘先生表1的据数被修改!!’。

        create trigger修改先生表据数_tri on 先生表

        for update

        as

        begin

        print '先生表的据数被修改!!'

        end

        (2)DDL

        ①建立一个DDL触发器,于用护保据数库中的据数表不被修改,不被删除。

        create trigger制止对据数表作操

        on database

        for ALTER_TABLE,DROP_TABLE

        as

        begin

        PRINT '对不起,您不能对据数表行进作操'

        ROLLBACK

        end

        ②建立一个DDL触发器,于用护保前当SQL Server服务器里有所据数库不能被删除。

        CREATE TRIGGER不答应删除据数库

        ON allserver

        FOR DROP_DATABASE

        AS

        begin

        PRINT '对不起,您不能删除据数库'

        ROLLBACK

        end

         

        三、修改触发器

        1、语法

        ALTER TRIGGER 触发器名 ON 表或视图名

        [WITHENCRYPTION]

        For|AFTER|INSTEADOF [[INSERT],[UPDATE],[DELETE]]

        AS

                 (主体部份)

        2、例实

        ①修改‘修改先生表1据数_tri’,添加insert激起件条

        alter trigger修改先生表据数_tri on 先生表

        for update,insert

        as

        begin

        print '先生表的据数被修改!!'

        end

         

        四、删除触发器

        1、语法

        DROPTRIGGER [schema_name.]trigger_name [ ,...n ] [ ; ]

        DROPTRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL SERVER }

        2、例实

        ①删除‘修改先生表据数_tri’

        drop trigger 修改先生表据数_tri

    文章结束给大家分享下程序员的一些笑话语录: 看新闻说中国输入法全球第一!领先了又如何?西方文字根本不需要输入法。一点可比性都没有。

  • 相关阅读:
    jQuery选择器
    jquery处理json笔记
    观察者模式
    shiro自定义realm
    AysncTask更新progressbar
    android自定义控件
    任务的挂起和激活
    main方法添加2个集合存储图形
    矩形类-内部类刷新
    圆类-内部类多线程刷新
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3052126.html
Copyright © 2011-2022 走看看