【发布时间】:2021-08-18 19:50:30
【问题描述】:
嘿,
我正在尝试更新SQL Server 2014 表中的一些列,并在trigger 上编写了一些代码,然后使用以下代码过程将新值插入到新表中:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Atrin Noori
-- =============================================
ALTER TRIGGER [dbo].[UsersOnUPDATE]
ON [dbo].[Users]
After UPDATE
AS
BEGIN
SET NOCOUNT ON;
--
DECLARE @user_key int
SELECT @user_key = i.User_key FROM inserted i;
--
IF UPDATE (User_fullname)
BEGIN
DECLARE @newfullname nvarchar(MAX);
DECLARE @oldfullname nvarchar(MAX);
--
SELECT @oldfullname = i.User_fullname FROM deleted i;
SELECT @newfullname = i.User_fullname FROM inserted i;
--
INSERT INTO UsersLogs (UL_user_key_r, UL_date, UL_oldname, UL_newname, UL_IsDeleted)
VALUES (@user_key, GETDATE(), @oldfullname, @newfullname, 0)
END
--
ELSE IF UPDATE (User_password)
BEGIN
DECLARE @newpassword nvarchar(10);
DECLARE @oldpassword nvarchar(10);
--
SELECT @oldpassword = i.User_password FROM deleted i;
SELECT @newpassword = i.User_password FROM inserted i;
--
INSERT INTO UsersLogs (UL_user_key_r,UL_date,UL_oldpass,UL_newpass,UL_IsDeleted)
VALUES (@user_key, GETDATE(), @oldpassword, @newpassword, 0)
END
--
ELSE IF UPDATE (User_username)
BEGIN
DECLARE @newusername nvarchar(10);
DECLARE @oldusername nvarchar(10);
--
SELECT @oldusername = i.User_username FROM deleted i;
SELECT @newusername = i.User_username FROM inserted i;
--
INSERT INTO UsersLogs (UL_user_key_r, UL_date, UL_oldusername, UL_newusername, UL_IsDeleted)
VALUES (@user_key, GETDATE(), @oldusername, @newusername, 0)
END
--
ELSE IF UPDATE (User_position_id_r)
BEGIN
DECLARE @newposid tinyint;
DECLARE @oldposid tinyint;
--
SELECT @oldposid = i.User_position_id_r FROM deleted i;
SELECT @newposid = i.User_position_id_r FROM inserted i;
--
INSERT INTO UsersLogs (UL_user_key_r, UL_date, UL_oldPosid, UL_newPosid, UL_IsDeleted)
VALUES (@user_key, GETDATE(), @oldposid, @newposid, 0)
END
END
当我手动更改每列中的值并插入到名为UsersLogs 的新表中时,此触发器工作正常。
但是,当我使用我正在开发的 c# 应用程序来更新值时,它不能正常工作...
考虑:
我正在尝试通过我的应用程序更改用户的密码 并使用
Stored Procedure。
Stored Procedure 工作正常并更新值,但UserOnUpdate 的触发器将old 的old 和new 值(不是旧密码和新密码)插入到新表(UsersLgos) 并将其他表设置为null(可以为null)。
我的意思是只有这部分代码会运行:
IF UPDATE (User_fullname)
BEGIN
DECLARE @newfullname nvarchar(MAX);
DECLARE @oldfullname nvarchar(MAX);
--
SELECT @oldfullname = i.User_fullname FROM deleted i;
SELECT @newfullname = i.User_fullname FROM inserted i;
--
INSERT INTO UsersLogs (UL_user_key_r, UL_date, UL_oldname, UL_newname, UL_IsDeleted)
VALUES (@user_key, GETDATE(), @oldfullname, @newfullname, 0)
END
根据我刚才所说的...我更改了密码并设置了一个条件来检查更新的列。
但问题是为什么触发器无法意识到通过应用程序更新了哪一列?
注意:
我再说一遍:手动更改和更新可以正常工作
【问题讨论】:
-
一般
deleted和inserted包含一组 记录,而不仅仅是一个记录。因此,您将SELECTs 从它们转换为标量变量通常没有意义。您首先需要先修复这个根本缺陷。 -
但在手动更新时效果很好
标签: c# sql sql-server sql-server-2014