2014-01-07 47 views
0

我想写触发插入,低于怎么写触发INSERT,UPDATE

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 [email protected]@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 [email protected]@IDENTITY) 
     set @name= (select name from tbl_demographic_details where [email protected]@IDENTITY) 

     update tbl_list_purple_flag set [email protected]_sc,[email protected],[email protected] where date = CONVERT(VARCHAR(8), SYSDATETIME(), 10) 
    end 
end 

if (@purple_sc > 105) 
begin 
    set @id= (select ID from tbl_demographic_details where [email protected]@IDENTITY) 
    set @name= (select name from tbl_demographic_details where [email protected]@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

FOR INSERT,update更改为instead of insert, update它应该工作得很好。

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

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

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

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

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

另外,看起来你正在创建一个完全不必要的触发器数量 - 你确定它们不同,这是一个很好的解决方案吗?

+0

谢谢我将尝试更改概念 – Happy

+1

对于更新触发器,“@@ IDENTITY”会比无用的更糟 - “UPDATE”不会影响它。但是你的观点对于多行插入仍然有意义。 –

相关问题