2013-03-25 76 views
2

更新行ID我有一个表Employee如何获得SQL Server中触发

Emp_Id Name 
    1  XYZ 
    2  ABC 

和另一个表DivisionInfo

DivisionID Division Emp_Id 
     1  mmm   1 
     2  nnnn   1 
     3  oooo   1 

我需要写一个触发器回滚Employee表的更新,如果Emp_Id存在于DivisionInfo表中。在这种情况下Emp_Id = 1

如何获取SQL触发器中正在更新的行的行ID?

这是我的触发代码:

ALTER TRIGGER [dbo].[EmployeeTrigger] 
ON [dbo].[Employee] 
FOR UPDATE 
AS 
    IF((SELECT COUNT([DivisionID ]) 
     FROM [DivisionInfo] AS D 
     INNER JOIN Employee AS E ON D.[Emp_Id] = E.Emp_Id 
     WHERE D.[Emp_Id] = E.Emp_Id) > 0) 
    BEGIN 
     RAISERROR ('Testing', 10, 1); 
     ROLLBACK TRANSACTION 
     RETURN 
    END 

这总是真的

+0

我也觉得很奇怪,如果要更新的员工的名字,你如果他被分配到一个部门,他不能这样做。 – HLGEM 2015-01-06 15:57:46

回答

1

试试这个:

ALTER TRIGGER [dbo].[EmployeeTrigger] 
ON [dbo].[Employee] 
FOR UPDATE 
AS 
IF((
    SELECT COUNT([DivisionID ]) 
    FROM [DivisionInfo] D 
    JOIN INSERTED I ON I.[Emp_Id] = D.[Emp_Id])>0) 
BEGIN 
     RAISERROR ('Testing', 10, 1); 
    ROLLBACK TRANSACTION 
    RETURN 
END 
+0

感谢您的快速回答。它的工作 – Somashekhar 2013-03-25 09:49:19

+1

YOu需要了解有关触发器的一件事,你永远不能假设只有一个记录正在处理。所以你不要想到获得行更新的行ID,更新一百万行。现在触发器将回滚所有记录,如果有任何记录在分区信息表中,并且如果您获得了多记录更新,其中一些记录更新在分区表中,其中一些记录更新不在分区表中,则这可能不是您想要的。您总是必须在触发器中计划(并测试)多个记录更新。 – HLGEM 2015-01-06 15:56:13