SQL insert触发器问题

--当向【客户表(Client)】增加数据时,如果要增加的客户名称在客户表中已存在时,---- 则提示错误,回滚事务---一下是代码
alter trigger trig_InsertClient
on Client
for insert
as
declare @ClientName nvarchar(30)
select @ClientName=ClientName from inserted
if exists(select * from Client where ClientName=@ClientName)
begin
rollback tran
raiserror('该客户名已存在,请重新输入客户名!',16,1)
end现在问题是 如果要增加的客户的客户名称不存在于【客户表】,它也会提示错误,回滚事务为什么会这样啊

第1个回答  2013-08-02
你用的for insert 肯定是不行的
在你执行触发器检测之前,sql就已经插入数据到你的数据库中去了
解决方案有两种
1 是不用触发器,自己在插入数据之前手动进行检测,如果存在,则不在插入
2 把for insert改成 instead of insert
sql中的前置触发器是instead of,这种触发器在数据更新前发生
但要注意,在检查数据通过后,要在该触发器中重发更新语句,否则不会发生更新动作.
就是说
if exists(select * from Client where ClientName=@ClientName)
begin
rollback tran
raiserror('该客户名已存在,请重新输入客户名!',16,1)
end
这里还要改 改成
if exists(select * from Client where ClientName=@ClientName)
begin
rollback tran
raiserror('该客户名已存在,请重新输入客户名!',16,1)
end
else
insert into Client ...(你的插入语句)

总的说来 第一方法简单些,而且性能相对来说好一些
第2个回答  2013-08-02
你的事务处理从哪开始的?
也不一定是这个触发器引起的回滚。
第3个回答  2013-08-02
简单点,你把ClientName设置成主键,不就可以了吗?重复的也插入不进去。
第4个回答  2013-08-02
在这里无法回滚已经完成的操作

SQL insert触发器问题
1 是不用触发器,自己在插入数据之前手动进行检测,如果存在,则不在插入 2 把for insert改成 instead of insert sql中的前置触发器是instead of,这种触发器在数据更新前发生 但要注意,在检查数据通过后,要在该触发器中重发更新语句,否则不会发生更新动作.就是说 if exists(select * from Cli...

SQL触发器SQL触发器语法
SQL触发器是数据库中的一种机制,通过特定的SQL语句定义,用于在特定的数据修改操作(INSERT、DELETE、UPDATE)后自动执行特定的操作。触发器名称需唯一,符合标识符规则,可以使用WITH ENCRYPTION加密并设置NOT FOR REPLICATION防止复制过程中的触发。触发器通常包含Transact-SQL语句,用于检查或修改数据,但不会...

sql做一个触发器,一个表中添加了一条信息,另一个表中的某个列值就加一...
触发器名称 insert_table on tablea --哪个表的触发器for insert --哪个动作触发as update tableb set n=n+1 -- 无条件更新,只要tablea有insert操作,tableb的n就加一GO

创建一个名为stu_insert的触发器,当向学生表student中插入记录时,自动...
1、首先打开sqlyog并和mysql建立连接。2、在sqlyog软件左侧树形菜单中要到触发器选项。3、在触发器选项上点击右键找到创建触发器选项,或者选择触发器选项按f4也可以弹出创建触发器弹窗。4、想要创建一个名称为trigger的触发器,那么就在弹窗的输入框中输入trigger并点击确定即可。5、想要创建一个biao1中插...

MSSQL触发器单条插入没问题,当监听表为批量插入的时候报告不止一个...
这个是因为 MSSQL触发器 不是 逐行触发的. 而是 逐语句触发的.当你 INSERT ... FROM SELECT ... 的时候。一条 INSERT 语句可能插入了 10 行数据,这种情况下, inserted 里面, 就有 10行数据。你那句 更新语句, 可以尝试修改为:update SendRecordset rec_status= inserted....

SQL触发器inserted问题
Create Trigger Tri_CheacEmployeeSexOn EmployeeInfoAfter InsertASIF exists(Select 0 From inserted where EmployeeSex Not in('男','女'))Begin print '员工性别不符合规范' Rollback TransactionEnd

SQL 触发器问题,为什么我写的触发器总是能够执行if exists,即使是新插 ...
你的触发器是后触发的(等同于after insert),它是在数据插入之后该触发器被执行的。也就是说,在新的数据插入表之后,触发器内容被执行,因为记录已经在表中了,故exists检测永远会返回true。建议使用替代触发(instead of)。或者,如果有另外的键值,则再加入一个键值条件来判断(如果另外一个键值不同,...

sql 触发器使用方法
SQL触发器是一种特殊类型的存储过程,它们在特定的数据库操作事件(如插入、更新、删除)发生时自动执行。触发器的使用方法取决于FOR关键字后的操作类型,如INSERT、UPDATE或DELETE。此关键字确保触发器仅在相应事件上触发,排除了其他操作如SELECT、TRUNCATE或UPDATETEXT等。以注册系统为例,为了防止用户更改...

SQL建立触发器,如果插入相同记录则提示不能插入
ROLLBACK TRANENDELSEPRINT '可以插入记录'2.在某一数据库中建立一个名为HH的INSERT触发器,存储在”C”表中.该触发器的作用是:当用户向”C”表中插入记录时,如果插入了”C”表中的记录不是空值,则提示可以插入记录,否则提示不可以插入记录.ALTER TRIGGER HHON CFOR INSERTASDECLARE @A VARCHAR(20...

sql中在触发器设计中,什么时候用到inserted表?什么时候用到deleted表...
需要触发器操作新数据时用到inserted表,也就是说inserted是新数据表 需要触发器操作新旧据时用到deleted表,也就是说deleted是旧数据表 如:用户执行insert操作,触发器里只有inserted表有数据,因为插入数据操作是没有旧数据的 用户执行update操作,触发器里不但inserted表有数据,deleted表也有数据 用户执行...

相似回答