2013-03-25 67 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