我的触发不起作用

时间:2013-12-12 04:44:24

标签: sql sql-server triggers

我在Table1中插入后会触发将在Table2中插入,更新后,Table1中的columnA将在Table2中更新Status_Column,其中Table1.id = table2.id,删除table1之后的行将删除table2中的行table1.id = table2 .ID。

 create TRIGGER mytrigger
       ON  Table1
       after UPDATE,INSERT,DELETE
    AS 
    Begin
        if  update (columnA)
            BEGIN
            SET NOCOUNT ON; 
                declare @ID int
                select @ID = ID from DELETED    
                UPDATE Table2 
                SET T2.Status_Column ='Updated'
                From Table2 T2
                inner join Table1 T1 on T1.ID = T2.ID
                where T1.ID = @ID
            End
        else if exists (select * from inserted)
            Begin 
            declare @table2_ID int
            select @table2_ID = ID from inserted    
                insert into table2 (ID,Status_Column) values  (@table2_ID,'New')
            End
        else if exists (select ID from deleted)
            Begin
                delete from table2
                from table2 T2 , Deleted d
                where t2.id= d.id
            End
    End

只有删除声明工作:(

1 个答案:

答案 0 :(得分:0)

您的根本缺陷是,您似乎希望触发器每行一次 - 这在SQL Server中是 NOT 。相反,触发器会在每个语句时触发,而伪表Deleted可能包含多行

鉴于该表可能包含多行 - 您希望在这里选择哪一行?

select @ID = ID from DELETED        

未定义 - 您可以从Deleted中的任意行获取值。

您需要使用Deleted WILL 包含多行的知识重写整个触发器!您需要使用基于集合的操作 - 不要只期望Deleted中的一行!