我有一个 SQL Server 数据库,其中有一个带有触发器的表,该触发器在插入后执行。如果我直接一个接一个地插入两个条目,那么只有在触发器执行完成后才插入第二个条目,这一点很重要。我可以依靠这个吗?或者我可能会在某个时候遇到有问题的竞争条件?
触发器的代码如下所示:
ALTER TRIGGER [dbo].[TR_MachineState_Desable_OldData_ON_Insert]
ON [dbo].[machine_state]
AFTER INSERT
AS
BEGIN
DECLARE @RowID INT;
DECLARE @Name NVARCHAR(30);
DECLARE @MachineState NVARCHAR(30);
DECLARE @Devicescount INT;
DECLARE @StartedOn DATETIME;
DECLARE @CreateOn DATETIME;
DECLARE @ToolName NVarchar(30);
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
SELECT
@RowID=[RowId]
,@Name= [Name]
,@MachineState=[MachineState]
,@Devicescount=[Devicescount]
,@StartedOn= [StartedOn]
,@CreateOn =[ActionDate]
,@ToolName=[ToolName]
from inserted ;
update [machine_state]
set [IsActive]=0
where [Name] =@Name and ToolName = @ToolName and RowId <> @RowID
update machine_state
set IsActive =1
where RowId=@RowID
END
正如您所看到的,触发器确保只有具有相同工具名称和相同名称的最后一个条目才为IsActive
true。