2011-08-01 24 views
1

私は2つのテーブルUser &ユーザーログを持っています。ユーザログテーブルは基本的に、ユーザテーブルに対して行われたすべての変更(挿入/更新/削除)を記録します。挿入/更新または削除は、ユーザ・テーブルに対して行われるユーザ・ログテーブル内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が挿入されていないデータ:

Iは以下の通りであるユーザテーブルにトリガを有します。コードに何か問題はありますか?

答えて

2

これは常にtrueになります。

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から設定しないでください。これらの "テーブル"は潜在的に1行以上を保持する可能性があり、setを使用するとデータが失われます。 (INSERTの両方にしてブロックをDELETE)の代わりにこれを行います。

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

あなたがその変更を行った場合、それが唯一の有無に基づいてDELETE/INSERTますから、あなたも、IF/ELSEブロックを必要としませんこれらのテーブルには行がありません。

また、@@ ROWCOUNTのチェックは不要です。あなたはそれを完全に取り除くことができるはずです。

関連する問題