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

    

    一、触发器概述

    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

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