如何为insert,update编写触发器

时间:2014-01-07 08:02:07

标签: sql

我正在尝试编写插入触发器,更新代码

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

这有什么问题?

1 个答案:

答案 0 :(得分:1)

FOR INSERT,update更改为instead of insert, update,它应该可以正常工作。

在插入/更新完成后,您的触发器正在发生,而不是触发器根本不会让插入/更新发生。

您可能需要将两个触发器分开(即一个用于instead of insert,另一个用于instead of update)以使其正常工作,只需尝试即可。

如果这不起作用,你应该发布你正在使用的SQL服务器 - 我假设MS SQL,这应该有效。

此外,您应该避免使用@@IDENTITY。它包含最后插入的标识值,可能是您期望的值,也可能不是。相反,您应该使用触发器中的inserted表,其中包含导致触发器触发的所有插入/更新的行。

例如,如果您同时更新了多个行,@@IDENTITY只会更改最后一行,并且您不会对之前的行进行任何更改。

此外,您似乎正在创建一个完全不必要的触发器数量 - 您确定它们足够不同以至于这是一个很好的解决方案吗?