如何编写插入,更新触发器

快乐的

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

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

这是怎么了?

a安

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

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

您可能必须将这两个触发器分开(例如,一个用于instead of insert,另一个用于instead of update)以使这项工作有效,只需尝试一下即可。

如果这不起作用,则应发布您正在使用的SQL Server类型-我假设是MS SQL,这应该在哪里工作。

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

例如,如果您一次更新了多个行,@@IDENTITY则只会更改最后一行,而不会对之前的行做任何更改。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章