数据库触发器for,instead of和after的使用

Posted toohoo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库触发器for,instead of和after的使用相关的知识,希望对你有一定的参考价值。

  最近搞SQL server2008 R2数据库课程设计,在使用for,instead of和after是遇到一点小阻碍,最终解决:

创建的触发器如下:

 1 USE [choose_Man]
 2 GO
 3 /****** Object:  Trigger [dbo].[tri_field]    Script Date: 11/24/2017 20:49:38 ******/
 4 SET ANSI_NULLS ON
 5 GO
 6 SET QUOTED_IDENTIFIER ON
 7 GO
 8 ALTER trigger [dbo].[tri_field] on [dbo].[tb_field]
 9 for insert,update
10 as
11 if(select COUNT(*) from tb_college,inserted
12      where tb_college.collegeid = inserted.collegeid)=0
13 begin 
14        print \'未找到该专业的院系信息,请添加相应院系后重试!\'
15        rollback
16 end
17 else IF
18     (SELECT    COUNT(*) from tb_field,inserted
19      where tb_field.fieldid=inserted.fieldid)>0
20  begin 
21     print\'专业号码产生冲突,请核对后重试!\'
22     rollback
23  end
24  

插入的数据如下:

1 insert into tb_field(fieldid,collegeid,fieldname,fieldmaster,telephone) values(\'F0022\',\'C0008\',\'数学与统计系\',\'夏宏兴\',\'3345901\')

报错:

解决:

首先使用for,代码第九行,我插入的数据时,触发器是在SQL语句执行完成之后才触发的,所以在插入数据之后,触发器再检查时就检查出有相同的fieldid了,所以应该将检查条件设置成大于1,而不是0

(SELECT    COUNT(*) from tb_field,inserted
19      where tb_field.fieldid=inserted.fieldid)>1

最后成功插入数据。

用for控制时,它的作用默认是和after一样的,用instead of是,执行SQL语句之前触发触发器,最后显示(1行受影响),但是我查询表数据的时候发现并没有将数据插入表中,应该是SQL语句没有执行,在此告知。

 

以上是关于数据库触发器for,instead of和after的使用的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 触发器中的“INSTEAD OF”,从 SQL Server 转换而来

如何使用 INSTEAD OF 触发器在视图中插入数据?

INSTEAD OF INSERT 触发器未触发视图 - SQL Server

SQL Server INSTEAD OF INSERT 触发器失败

sql - INSTEAD OF INSERT 触发器 - 插入前清除值

为啥 INSTEAD OF UPDATE 触发器的 INSERTED 表为空?