我有两个表用户和用户日志.用户日志表基本上记录了对用户表所做的所有更改(插入/更新/删除).
我在User表上有一个触发器,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
当对用户表进行插入/更新或删除时,上面的triigger不会在userlog表中插入数据.代码有什么问题吗?
您不应该从INSERTED和DELETED设置变量.这些"表"可能会在其中包含多于一行,并且使用set将丢失数据.这样做(在INSERT和DELETE块上):
INSERT INTO UserLog(UserName, FirstName, LastName, Email, RoleID, [DateTime], UpdatedBy)
SELECT UserName, FirstName, LastName, Email, RoleID, getdate(), ModifiedBy
FROM INSERTED
Run Code Online (Sandbox Code Playgroud)
如果进行了更改,则甚至不需要IF/ELSE块,因为它只会根据这些表中是否有行来INSERT/DELETE.
此外,不需要检查@@ ROWCOUNT.你应该能够完全删除它.