【发布时间】:2013-04-25 08:08:49
【问题描述】:
我在 sql server 2005 中有触发器 它检查重复记录,然后更新记录。
USE [CheckeCon]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tgUserRoleExistForUpdate] ON [dbo].[Sec_UserRoles]
INSTEAD OF Update
AS
declare @UserRoleId int, @UserId int,@RoleId int, @FromDate datetime,@ToDate datetime,@CntlCreatedBy nvarchar,@CntlModifiedAt nvarchar,@CntlCurLockNo smallint;
select @UserRoleId=i.UserRoleId from inserted i;
select @UserId=i.UserId from inserted i;
select @RoleId=i.RoleId from inserted i;
select @FromDate=i.FromDate from inserted i;
select @ToDate=i.ToDate from inserted i;
select @CntlCreatedBy=i.CntlCreatedBy from inserted i;
select @CntlModifiedAt=i.CntlModifiedAt from inserted i;
select @CntlCurLockNo=i.CntlCurLockNo from inserted i;
BEGIN
-- BEGIN TRAN
IF NOT EXISTS
(
SELECT *
FROM Sec_UserRoles SEUR
JOIN inserted i ON
SEUR.RoleId = i.RoleId
AND SEUR.UserId = i.UserId
Where i.FromDate BETWEEN SEUR.FromDate AND SEUR.ToDate
)
Update Sec_UserRoles Set UserId = @UserId,RoleId = @RoleId,FromDate = @FromDate,ToDate = @ToDate,
CntlCreatedBy = @CntlCreatedBy,CntlModifiedAt = @CntlModifiedAt,CntlCurLockNo = @CntlCurLockNo Where UserRoleId = @UserRoleId
--Commit;
Else
RAISERROR('User Role Association Already Present',15,1);
--ROLLBACK;
End
但问题是它不能更新记录,只引发了我在触发器中给出的错误。 如何使用触发器更新记录?
【问题讨论】:
-
您的代码只是假设每行都会调用一次触发器。这在 SQL Server 中不是。如果您的
UPDATE语句影响多行,则触发器将被调用 为该语句一次,并且您的Inserted伪表将包含 多行 - 所以您在此处的分配 @ 987654324@ 只会从Inserted表中分配一个任意值,并忽略Inserted中的所有其他行 .... -
不,不,不,不,不,不,不。
inserted可以包含 0、1 或多行。所有这些select @scalarvariable=...语句都可能从不同的 行中选择值。对于您的IF EXISTS测试,可能有 some 行的存在测试返回 true,而 some 行返回 false。
标签: sql-server sql-server-2005 triggers