应无所住,而生其心
排名
6
文章
6
粉丝
16
评论
8
{{item.articleTitle}}
{{item.blogName}} : {{item.content}}
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2024TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

sqlserver触发器

5319人阅读 2020/3/21 17:20 总访问:4816122 评论:0 收藏:0 手机
分类: 数据库


触发器


什么是触发器:触发器是个特殊的存储过程,不是由用户触发,是系统根据事件来触发。对表操作比如

              添加,删除,修改。 也就是在进行DML操作的时候可以触发我们自己写的逻辑


触发器的作用:数据同步(数据同步更新,同步修改), 做一些数据自定义约束.....,可以根据具体业务来实现



触发时间:    操作之前和操作之后,比如添加之前执行,添加之后执行,更新之前,更新之后......

              操作之前: instead of [事件]

              操作之后: after  [事件] / for [事件]



触发器的语法:create trigger 触发器名称

              on 表 [时间] [事件]

              as

              begin

                    ........触发后具体要实现的功能...........

              end



实现一个用户表添加之后执行的触发器: 

               

             create trigger tri_insert

             on userinfo after  insert

             as

             begin


             end


下面是实际的一点例子:

--实现一个用户表添加之后执行的触发器: 
alter trigger tri_insert
on UserInfo after insert
as
begin
  print('更新之后执行')
end

--实现一个用户表修改之前执行的触发器:
create trigger tri_beforeupdate
on userinfo instead of update
as
begin
  print('更新之前执行')
end

--添加之前 (实现一个自定义限制,添加的时候班级必须是.net一班)
go
alter trigger tri_beforeinsert
on userinfo after insert
as
begin
  --print('查看刚刚新添加的数据库内容')
  
  --inserted是触发器中的临时表,用户记录刚刚新添加的内容
  --定义一个变量用于接收用户添加用户的内容
  --declare @tempname nvarchar(64)
  --select @tempname =username from inserted
  --insert UserInfo(username) values(@tempname) 
  
  declare @tempclass nvarchar(64)
  --从临时表中取出来uclass
  select @tempclass = uclass from inserted 
  if(@tempclass = '.NET一班')
     insert UserInfo select username,number,uclass from inserted
  else
  begin
      print('无法添加')
      --报错
      --raiserror('该表只能添加.net一班',16,1)
  end 
    
end
--数据同步,比如有两张表,一张主表,一张附表


alter trigger tri_beforeinsert
on userinfo after insert
as
begin
  --print('查看刚刚新添加的数据库内容')
  
  --inserted是触发器中的临时表,用户记录刚刚新添加的内容
  --定义一个变量用于接收用户添加用户的内容
  --declare @tempname nvarchar(64)
  --select @tempname =username from inserted
  --insert UserInfo(username) values(@tempname) 
  
  -- 添加附表
  insert UserInfo2 select username,number,uclass from inserted
    
end

alter trigger tri_update
on userinfo for update
as
begin
  --select * from inserted
  declare @id int
  declare @username nvarchar(64)
  select @id = id,@username = username from inserted
  --同步修改附表
  update UserInfo2 set username = @username where id = @id
end



--create trigger tri_beforeupdate
--on userinfo instead of update
--as
--begin
--    declare @id int
--    declare @username nvarchar(64) 
--    select @id = id,@username = username from inserted
--    if(@id>5)
--    begin
--       update UserInfo set username = @username where id = @id
--    end
--    else
--    begin
--      raiserror('id1-5无法被修改',16,1)
--    end
--end


alter trigger tri_beforeupdate
on userinfo instead of update
as
begin
   --要先直接使用inserted点出来就需要加一个from inserted 不然是会报错的
   update UserInfo set username = inserted.username from inserted where UserInfo.id =inserted.id
end



select * from UserInfo

 select * from UserInfo2




insert UserInfo values('fff','NS001','.NET一班')
update UserInfo set username = '吕小布ss' where id =1


欢迎加群讨论技术,群:677373950(满了,可以加,但通过不了),2群:656732739

评价