我正在尝试编写插入触发器,更新代码
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
这有什么问题?
答案 0 :(得分:1)
将FOR INSERT,update
更改为instead of insert, update
,它应该可以正常工作。
在插入/更新完成后,您的触发器正在发生,而不是触发器根本不会让插入/更新发生。
您可能需要将两个触发器分开(即一个用于instead of insert
,另一个用于instead of update
)以使其正常工作,只需尝试即可。
如果这不起作用,你应该发布你正在使用的SQL服务器 - 我假设MS SQL,这应该有效。
此外,您应该避免使用@@IDENTITY
。它包含最后插入的标识值,可能是您期望的值,也可能不是。相反,您应该使用触发器中的inserted
表,其中包含导致触发器触发的所有插入/更新的行。
例如,如果您同时更新了多个行,@@IDENTITY
只会更改最后一行,并且您不会对之前的行进行任何更改。
此外,您似乎正在创建一个完全不必要的触发器数量 - 您确定它们足够不同以至于这是一个很好的解决方案吗?