I have two tables User & User Log . User log table basically logs all the changes(insert/update/delete) made to user table.
I have a trigger on User table which is as below:
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
The above triigger is not inserting data in userlog table when insert/update or delete is made to user table. Is there anything wrong with the code?
This will always be true:
because calling
SET NOCOUNT ON;affects@@ROWCOUNT, and since no rows are affected by that statement, it’s set to 0. So the rest of the code never runs. At the very least, you would run that code beforeSET NOCOUNT ON;(or store@@ROWCOUNTin a variable for later use), but as indicated by the other answer, it’s completely unnecessary anyway.