0


sql server中的触发器

1.触发器的定义

触发器其实就是一个特殊的存储过程,这个存储过程呢,不能调用罢了, 而是当数据发生变化的时候才触发了这个过程,;

2 触发器的分类

    1) ,ddl触发器, 针对数据库的更新变化

            主要是以create,drop,alter开头的语句的触发

    2)dml触发器 这个针对表达数据更新

            after |for 触发器(动作完成之后触发)

                    insert 触发器:

                    delete触发器

                    update触发器

    3)登录触发器

登录触发器将为响应 LOGIN 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器。

3 : dml触发器的工作原理

  在dml触发器执行过程中, 会产生两张临时表 inserted and  deleted  在执行完毕后自动释放;

顺序insert触发器delete触发器update触发器1执行insert语句,在表中插入数据执行delete语句,删除数据
执行update语句

,修改数据
2在临时表inserted中插入新数据的一个副本在deleteed表中插入删除的数据的副本
a:首先备份要更新的数据,插入到deleted表中

b:备份完成后,将更新数据插入到inserted 表中

3
触发器对数据进行检验, 确定是否会滚或者其他操作触发器对删除数据检查, 来执行其他操作插入新的数据

4 触发器的应用

准备数据

工欲善其事,必先利其器,(准备数据):

create table book (
    bid int primary key  not null ,
    bname varchar(200)  not null , 
    bauther varchar(100)   ,
    bprice decimal(10,2) 
)


insert into book(bid,bname,bprice,bauther)
                values (1,'论语'    ,25.6 ,'孔子'),
                       (2,'天龙八部',25.6 ,'金庸') ,
                       (3,'雪山飞狐',32.7 ,'金庸'),
                       (4,'平凡的世',35.8 ,'路遥' ) ,
                       (5,'史记'    ,54.8 ,'司马迁') ,
                       (6,'狂人日记',35.5  ,'鲁迅')    

创建触发器的格式:

CREATE TRIGGER trigger_name
 
ON table_name
 
[WITH ENCRYPTION]  --给触发器文本加密
 
FOR|after |instead of  [DELETE, INSERT, UPDATE]   ---多加一句after和for 是一个功能, 用一个就好了

AS
 
  T-SQL语句
 
GO

[WITH ENCRYPTION] --给触发器文本加密

for 和after -- 其实就是同一个功能,

instead of 就是执行某个操作之前

1.insert触发器

创建触发器

--判断数据库中,是否存在这个触发器
IF (object_id('tr_insert_book','tr') is not null) 
    drop trigger tr_insert_book
go
create trigger tr_insert_book
on book
instead of  insert 
as 
begin 
    declare @bid int ;
    select @bid = bid from inserted ;
    insert into books(bid) values(@bid);
    print'插入成功';
end

测试:

insert into book values(8,'鹿鼎记','金庸',60)

结果:

2delete触发器

   创建触发器:

    
IF(OBJECT_ID('TR_DELETE_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_DELETE_BOOK
GO

CREATE trigger TR_DELETE_BOOK
ON BOOK
FOR DELETE 
AS 
BEGIN 
 
    print'数据备份';
    
    if(object_id('book_back','U') is not null ) 
        insert into book_back select * from deleted; 
    else 
        select * into book_back from deleted;
    print '备份完成'
end;
    

测试:

delete from book where bid =1

select * from book_back

少了bid=1 的数据

book_back成功备份;

3 update 触发器

创建触发器

IF(OBJECT_ID('TR_UPDATE_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_UPDATE_BOOK
GO

CREATE TRIGGER TR_UPDATE_BOOK
ON BOOK 
AFTER UPDATE
AS 
BEGIN 
    waitfor delay '00:00:02'
    select * from book;
END

测试

update book set bname ='金瓶梅' ,bauter='未知',bprice =12345 where bid =8

结果:

补充:

   update列级更新

**需求,**比如book的bid是主键 ,那就不能更改, 我们应该这么办呢?

别急,我们可以用update()函数

IF(OBJECT_ID('TR_UPDATE1_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_UPDATE1_BOOK
GO

create trigger TR_UPDATE1_BOOK
on book
instead of update
as 
begin 
    if(update(bid))
    begin
        print'主键不能更改!!!!';
        rollback; 
    end 
end 
 测试:
update book set bid =1 

select * from book

DDL触发器

创建触发器

IF(OBJECT_ID('TR_drop_BOOK','TR') IS NOT NULL ) 
        DROP TRIGGER TR_drop_BOOK
GO
create trigger TR_drop_BOOK
on database 
instead of DROP_TABLE,ALTER_TABLE
as 
begin 
    print'别想着干坏事!!!!好好工作'
    rollback;
end 

测试

drop table book

结果

5.触发器的启用和禁用

dml触发器:

enable |disable trigger triger_name on table_name ;

ddl触发器:

enable | disable trigger triger_name on database;

标签: 数据库

本文转载自: https://blog.csdn.net/guokeeiron/article/details/129970903
版权归原作者 guokeeiron 所有, 如有侵权,请联系我们删除。

“sql server中的触发器”的评论:

还没有评论