我正在尝试为插入编写触发器,下面更新代码
ALTER TRIGGER [dbo].[tg_tbl_demographic_details_purple]
ON [dbo].[tbl_demographic_details]
FOR INSERT,update
AS
BEGIN
declare @purple_sc varchar(10),@id varchar(10),@name varchar(30)
set @purple_sc= (select Purple from tbl_demographic_details where sno=@@IDENTITY )
if update(Purple)--purle is column name if this column is update below if loop executed
begin
if (@purple_sc > 105)
begin
set @id= (select ID from tbl_demographic_details where sno=@@IDENTITY )
set @name= (select name from tbl_demographic_details where sno=@@IDENTITY )
update tbl_list_purple_flag set Score=@purple_sc,Id=@id,Name=@name where date = CONVERT(VARCHAR(8), SYSDATETIME(), 10)
end
end
if (@purple_sc > 105)
begin
set @id= (select ID from tbl_demographic_details where sno=@@IDENTITY )
set @name= (select name from tbl_demographic_details where sno=@@IDENTITY )
insert into tbl_list_purple_flag (Score,Id,Name,Date) values(@purple_sc,@id,@name,CONVERT(VARCHAR(8), SYSDATETIME(), 10))
end
END
问题是它插入了两次,如下所示
Sno Id Name Score Date
24 0107140000 sd 111 01-07-14
25 NULL NULL 111 01-07-14
这是怎么了?
更改FOR INSERT,update
为instead of insert, update
,它应该可以正常工作。
您的触发器是在插入/更新完成之后发生的,而不是触发器根本不会让插入/更新发生。
您可能必须将这两个触发器分开(例如,一个用于instead of insert
,另一个用于instead of update
)以使这项工作有效,只需尝试一下即可。
如果这不起作用,则应发布您正在使用的SQL Server类型-我假设是MS SQL,这应该在哪里工作。
另外,您应避免使用@@IDENTITY
。它包含最后插入的标识值,该值可能是您期望的值,也可能不是您期望的值。相反,您应该使用inserted
触发器中获得的表,该表包含导致触发器触发的所有插入/更新的行。
例如,如果您一次更新了多个行,@@IDENTITY
则只会更改最后一行,而不会对之前的行做任何更改。
另外,似乎您正在创建完全不必要的触发器数量-您确定它们的区别足够大,这是一个很好的解决方案吗?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句