2011-08-01 157 views
1

我有兩個表用戶&用戶日誌。用戶日誌表基本上記錄了對用戶表所做的所有更改(插入/更新/刪除)。SQL Server 2005 - 觸發器沒有觸發

我有用戶表中的觸發器,它是如下:

在用戶日誌表
ALTER TRIGGER [dbo].[TRG_UserLog] 
    ON [dbo].[Users] 
    FOR INSERT,UPDATE,DELETE 
AS 
-- Declare variables here 
DECLARE @UserName VARCHAR(50) 
DECLARE @FirstName VARCHAR(50) 
DECLARE @LastName  VARCHAR(50) 
DECLARE @Email VARCHAR(50) 
DECLARE @RoleID INT 
DECLARE @UpdatedBy VARCHAR(50) 

BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 

    IF @@ROWCOUNT = 0 
    BEGIN 
     RETURN 
    END 


    IF EXISTS(SELECT * FROM INSERTED) 
     --INSERTED/UPDATED 
     BEGIN 
       SET @UserName = (SELECT UserName FROM INSERTED) 
       SET @FirstName = (SELECT FirstName FROM INSERTED) 
       SET @LastName = (SELECT LastName FROM INSERTED) 
       SET @Email  = (SELECT Email FROM INSERTED) 
       SET @RoleID  = (SELECT RoleID FROM INSERTED) 
       SET @UpdatedBy = (SELECT ModifiedBy FROM INSERTED) 
       INSERT INTO UserLog(UserName,FirstName,LastName,Email,RoleID,[DateTime],UpdatedBy) 
        VALUES (@UserName,@FirstName,@LastName,@Email,@RoleID,GETDATE(),@UpdatedBy) 
     END 
    ELSE 
     -- DELETED 
     BEGIN 
       SET @UserName = (SELECT UserName FROM DELETED) 
       SET @FirstName = (SELECT FirstName FROM DELETED) 
       SET @LastName = (SELECT LastName FROM DELETED) 
       SET @Email  = (SELECT Email FROM DELETED) 
       SET @RoleID  = (SELECT RoleID FROM DELETED) 
       SET @UpdatedBy = (SELECT ModifiedBy FROM DELETED) 
       INSERT INTO UserLog(UserName,FirstName,LastName,Email,RoleID,[DateTime],UpdatedBy) 
        VALUES (@UserName,@FirstName,@LastName,@Email,@RoleID,GETDATE(),@UpdatedBy) 
     END 
END 

上面triigger不插入數據時插入/更新或刪除被用戶表進行。代碼有什麼問題嗎?

回答

2

這將永遠是正確的:

SET NOCOUNT ON; -- this sets @@ROWCOUNT to 0 

IF @@ROWCOUNT = 0 
BEGIN 
    RETURN 
END 

,因爲調用SET NOCOUNT ON;影響@@ROWCOUNT,並且因爲沒有行被這句話的影響,它被設置爲0。因此,其餘代碼永遠不會運行。至少,您可以在SET NOCOUNT ON;之前運行該代碼(或將@@ROWCOUNT存儲在一個變量中供以後使用),但正如其他答案所示,無論如何,這是完全不必要的。

5

您不應該從INSERTED和DELETED設置變量。這些「表」可能會在其中保存多於一行,並且使用set將丟失數據。做到這一點,而不是(在兩個插入和刪除塊):

INSERT INTO UserLog(UserName, FirstName, LastName, Email, RoleID, [DateTime], UpdatedBy) 
SELECT UserName, FirstName, LastName, Email, RoleID, getdate(), ModifiedBy 
FROM INSERTED 

如果你做出的改變,你甚至都不需要的if/else塊,因爲它只會插入/刪除基於是否這些表中沒有行。

此外,@@ ROWCOUNT上的檢查是不必要的。你應該能夠完全刪除它。