触发器

                                  触发器

 

1、什么是触发器

 

    触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:updateinsertdelete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有createalterdrop语句。

 

 

 

2DML触发器分为:

 

       1 after触发器(之后触发)

 

        ainsert触发器

 

        bupdate触发器

 

        cdelete触发器

 

     2instead of 触发器 (之前触发)

 

 

 

    其中after触发器要求只有执行某一操作insertupdatedelete之后触发器才被触发,且只能定义在表上。而instead of触发器表示并不执行其定义的操作(insertupdatedelete)而仅是执行触发器本身。既可以在表上定义instead of触发器,也可以在视图上定义。

 

 

3、创建触发器(实例)

 

 

create trigger tgr_name

on table_name

with encrypion –加密触发器

    for update...

as

    Transact-SQL

 

    # 创建insert类型触发器

 

--创建insert插入类型触发器

if (object_id('tgr_classes_insert', 'tr') is not null)

    drop trigger tgr_classes_insert

go

create trigger tgr_classes_insert

on classes

    for insert --插入触发

as

    --定义变量

    declare @id int, @name varchar(20), @temp int;

    --inserted表中查询已经插入记录信息

    select @id = id, @name = name from inserted;

    set @name = @name + convert(varchar, @id);

    set @temp = @id / 2;    

    insert into student values(@name, 18 + @id, @temp, @id);

    print '添加学生成功!';

go

--插入数据

insert into classes values('5', getDate());

--查询数据

select * from classes;

select * from student order by id;

     insert触发器,会在inserted表中添加一条刚插入的记录。

 

 

 

    # 创建delete类型触发器

 

--delete删除类型触发器

if (object_id('tgr_classes_delete', 'TR') is not null)

    drop trigger tgr_classes_delete

go

create trigger tgr_classes_delete

on classes

    for delete --删除触发

as

    print '备份数据中……';    

    if (object_id('classesBackup', 'U') is not null)

        --存在classesBackup,直接插入数据

        insert into classesBackup select name, createDate from deleted;

    else

        --不存在classesBackup创建再插入

        select * into classesBackup from deleted;

    print '备份数据成功!';

go

--

--不显示影响行数

--set nocount on;

delete classes where name = '5';

--查询数据

select * from classes;

select * from classesBackup;

   delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。

 

 

 

    # 创建update类型触发器

 

--update更新类型触发器

if (object_id('tgr_classes_update', 'TR') is not null)

    drop trigger tgr_classes_update

go

create trigger tgr_classes_update

on classes

    for update

as

    declare @oldName varchar(20), @newName varchar(20);

    --更新前的数据

    select @oldName = name from deleted;

    if (exists (select * from student where name like '%'+ @oldName + '%'))

        begin

            --更新后的数据

            select @newName = name from inserted;

            update student set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%';

            print '级联修改数据成功!';

        end

    else

        print '无需修改student表!';

go

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值