2011-08-01 158 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上的检查是不必要的。你应该能够完全删除它。