您好我面临一个关键问题,因为2周后,触发器中涉及的所有表都被锁定在某个场景中,而不是在生产区域的Web应用程序中加载视图页面。下面的SQL语句在同一个request_session_id中连续命中,当客户端使用应用程序时发生锁定,然后触发器中的所有表都被锁定,然后系统在重新启动数据库和IIS服务后工作。不了解问题的原因。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_UpdateWorkFlowStatus]
ON [dbo].[Wf_WorkflowTaskInstanceDocuments]
FOR INSERT, UPDATE
AS
BEGIN
print ''
SET NOCOUNT ON;
DELETE FROM triggertest
DECLARE @Action as char(1);
SET @Action = (CASE WHEN EXISTS(SELECT * FROM INSERTED)
AND EXISTS(SELECT * FROM DELETED)
THEN 'U' -- Set Action to Updated.
WHEN EXISTS(SELECT * FROM INSERTED)
THEN 'I' -- Set Action to Insert.
WHEN EXISTS(SELECT * FROM DELETED)
THEN 'D' -- Set Action to Deleted.
ELSE NULL -- Skip. It may have been a "failed delete".
END)
DECLARE @WorkFlowNo BIGINT =(select top 1 WrokflowInstanceId from Wf_WorkflowTaskInstance WITH (NOLOCK) join inserted on inserted.WorkflowTaskInstanceId= Wf_WorkflowTaskInstance.WorkflowTaskInstanceId)
IF NOT EXISTS(SELECT 1 FROM Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK)
WHERE WorkflowTaskInstanceId IN
(
select WorkflowTaskInstanceId
from Wf_WorkflowTaskInstance
WHERE WrokflowInstanceId=@WorkFlowNo and Status<>4
)
AND
(IsSubmitted = 0 OR IsSubmitted IS NULL)
)
BEGIN
UPDATE Wf_WorkflowInstance SET Status='Completed' where WorkflowInstanceId=@WorkFlowNo
END
ELSE IF EXISTS(SELECT 1 FROM Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK)
WHERE WorkflowTaskInstanceId IN
(
select WorkflowTaskInstanceId
from Wf_WorkflowTaskInstance
WHERE WrokflowInstanceId=@WorkFlowNo
)
AND
(IsSubmitted = 1)
)
BEGIN
UPDATE Wf_WorkflowInstance SET Status='InProgress' where WorkflowInstanceId=@WorkFlowNo
END
if exists(select 1 from Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK) where participants is null)
update Wf_WorkflowTaskInstanceDocuments set participants=dbo.[GetTaskDocumentAssignees](WorkflowTaskInstanceDocumentsId) where participants is null
if(@Action='u')
begin
if exists(select 1 from Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK) where len(ToParticipants)<>len(dbo.UDF_DistinctList(ToParticipants,',')) and WorkflowTaskInstanceDocumentsId in(select WorkflowTaskInstanceDocumentsId from inserted))
begin
update Wf_WorkflowTaskInstanceDocuments set ToParticipants=dbo.UDF_DistinctList(ToParticipants,','),participants=dbo.[GetTaskDocumentAssignees](WorkflowTaskInstanceDocumentsId)
where WorkflowTaskInstanceDocumentsId in(select WorkflowTaskInstanceDocumentsId from inserted)
end
else
update Wf_WorkflowTaskInstanceDocuments set participants=dbo.[GetTaskDocumentAssignees](WorkflowTaskInstanceDocumentsId) where WorkflowTaskInstanceDocumentsId in(select WorkflowTaskInstanceDocumentsId from inserted)
end
if(@Action='I')
BEGIN
insert into Wf_WorkflowTaskDocumentVersionMapping
(
WorkflowTaskInstanceId,
Wf_WorkflowInstanceDocID,
DocRegisterID
)
select
WorkflowTaskInstanceId,
WorkflowTaskInstanceDocumentsId,
DocumentRegisterID
from
Wf_WorkflowTaskInstanceDocuments WHERE WorkflowTaskInstanceDocumentsId not IN(SELECT Wf_WorkflowInstanceDocID FROM Wf_WorkflowTaskDocumentVersionMapping WITH (NOLOCK))
DECLARE @DOCID AS TABLE
(
DocumentRegisterID INT,
WorkflowTaskInstanceDocumentsId INT,
WorkflowTaskInstanceId INT
)
DECLARE @WorkflowTaskInstanceId INT
DECLARE @WorkflowInstanceId INT=0
DECLARE @CurrentWorkflowInstanceId INT=0
DECLARE @DocumentRegisterID INT=0
DECLARE @WorkflowTaskInstanceDocumentsId INT=0
DECLARE @Wf_WorkflowTaskDocumentVersionMapping INT=0
DECLARE @Wf_TaskInstanceLocal INT=0
DECLARE @RowCount int=0
DECLARE @DocVersionLocal int
DECLARE @RevisionLocal varchar(25)
DECLARE @FirstTaskInstanceID int=(select top 1 wti.WorkflowTaskInstanceId from Wf_WorkflowTaskDocumentVersionMapping wtid
join Wf_WorkflowTaskInstance wti WITH (NOLOCK) on wtid.WorkflowTaskInstanceId=wti.WorkflowTaskInstanceId
where wti.WrokflowInstanceId IN(@WorkFlowNo) order by wti.WorkflowTaskInstanceId)
DELETE FROM @DOCID
INSERT INTO @DOCID SELECT DocumentRegisterID,WorkflowTaskInstanceDocumentsId,WorkflowTaskInstanceId FROM Wf_WorkflowTaskInstanceDocuments WITH (NOLOCK) WHERE WorkflowTaskInstanceId=@FirstTaskInstanceID
DECLARE @AdsdDocVersionMappingParent CURSOR
SET @AdsdDocVersionMappingParent = CURSOR FAST_FORWARD
FOR
select DocumentRegisterID
,WorkflowTaskInstanceId
from @DOCID
OPEN @AdsdDocVersionMappingParent
FETCH NEXT FROM @AdsdDocVersionMappingParent
INTO @DocumentRegisterID
,@WorkflowTaskInstanceId
WHILE @@FETCH_STATUS = 0
BEGIN
set @DocVersionLocal=(select top 1 DocVersion from DocumentRegisterLogs where source like '%auto superseded by workflow%' and DocumentRegisterID=@DocumentRegisterID order by DocumentRegisterLogsID desc)
set @RevisionLocal=(select top 1 Revision from DocumentRegisterLogs where source like '%auto superseded by workflow%' and DocumentRegisterID=@DocumentRegisterID order by DocumentRegisterLogsID desc)
DECLARE @AdsdDocVersionMapping CURSOR
SET @AdsdDocVersionMapping = CURSOR FAST_FORWARD
FOR
select wti.WorkflowTaskInstanceId,wtid.Wf_WorkflowInstanceDocID
from Wf_WorkflowTaskDocumentVersionMapping wtid WITH (NOLOCK)
join Wf_WorkflowTaskInstance wti WITH (NOLOCK) on wtid.WorkflowTaskInstanceId=wti.WorkflowTaskInstanceId
where wti.WrokflowInstanceId IN(@WorkFlowNo) and wtid.DocRegisterID is null
OPEN @AdsdDocVersionMapping
FETCH NEXT FROM @AdsdDocVersionMapping
INTO @WorkflowTaskInstanceId,@WorkflowTaskInstanceDocumentsId
WHILE @@FETCH_STATUS = 0
BEGIN
if not exists(select 1 from Wf_WorkflowTaskDocumentVersionMapping where DocRegisterID=@DocumentRegisterID and WorkflowTaskInstanceId=@WorkflowTaskInstanceId and DocRegisterID is not null)
begin
update Wf_WorkflowTaskDocumentVersionMapping set DocRegisterID=@DocumentRegisterID where Wf_WorkflowInstanceDocID=@WorkflowTaskInstanceDocumentsId
update Wf_WorkflowTaskDocumentVersionMapping set DocVersion=@DocVersionLocal,Revision=@RevisionLocal where Wf_WorkflowInstanceDocID=@WorkflowTaskInstanceDocumentsId
select @WorkflowTaskInstanceDocumentsId
end
--//////=
update a set a.DocVersion=b.DocVersion
from Wf_WorkflowTaskDocumentVersionMapping a
join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
where b.Source like '%auto superseded by workflow%' and (a.DocVersion is null)
and wti.WrokflowInstanceId=@WorkFlowNo
and wti.WorkflowTaskInstanceId=@WorkflowTaskInstanceId
update a set a.Revision=b.Revision
from Wf_WorkflowTaskDocumentVersionMapping a
join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
where b.Source like '%auto superseded by workflow%' and (a.Revision is null)
and wti.WrokflowInstanceId=@WorkFlowNo
and wti.WorkflowTaskInstanceId=@WorkflowTaskInstanceId
--//////
FETCH NEXT FROM @AdsdDocVersionMapping
INTO @WorkflowTaskInstanceId,@WorkflowTaskInstanceDocumentsId
END
CLOSE @AdsdDocVersionMapping
DEALLOCATE @AdsdDocVersionMapping
FETCH NEXT FROM @AdsdDocVersionMappingParent
INTO @DocumentRegisterID
,@WorkflowTaskInstanceId
END
CLOSE @AdsdDocVersionMappingParent
DEALLOCATE @AdsdDocVersionMappingParent
update a set a.DocVersion=b.DocVersion
from Wf_WorkflowTaskDocumentVersionMapping a
join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
where b.Source like '%auto superseded by workflow%' and (a.DocVersion is null)
and wti.WrokflowInstanceId=@WorkFlowNo
update a set a.Revision=b.Revision
from Wf_WorkflowTaskDocumentVersionMapping a
join DocumentRegisterLogs b on a.DocRegisterID=b.DocumentRegisterID
join Wf_WorkflowTaskInstance wti on wti.WorkflowTaskInstanceId=a.WorkflowTaskInstanceId
where b.Source like '%auto superseded by workflow%' and (a.Revision is null)
and wti.WrokflowInstanceId=@WorkFlowNo
and b.DocumentRegisterLogsID in(select top 1000 DocumentRegisterLogsID from DocumentRegisterLogs where DocumentRegisterID=b.DocumentRegisterID order by DocumentRegisterLogsID desc)
END
if(@Action='u')
BEGIN
DECLARE @DocumentNoInst varchar(120)
DECLARE @DocumentNoVer varchar(120)
DECLARE @DocumentIDVer int
DECLARE @DocumentVer int
DECLARE @DocInID int
SELECT @DocumentNoInst=dr.DocumentNo,@DocInID=WorkflowTaskInstanceDocumentsId FROM inserted ins JOIN DocumentRegister dr on ins.DocumentRegisterID=dr.DocumentRegisterID
SELECT @DocumentNoVer=dr.DocumentNo FROM Wf_WorkflowTaskDocumentVersionMapping insver JOIN DocumentRegister dr WITH (NOLOCK) on insver.DocRegisterID=dr.DocumentRegisterID where Wf_WorkflowInstanceDocID=@DocInID
if(@DocumentNoInst<>@DocumentNoVer)
begin
select top 1 @DocumentIDVer=DocRegisterID,@DocumentVer=insver.DocVersion from Wf_WorkflowTaskDocumentVersionMapping insver JOIN DocumentRegister dr on insver.DocRegisterID=dr.DocumentRegisterID
where WorkflowTaskInstanceId in(@FirstTaskInstanceID) and dr.DocumentNo=@DocumentNoInst
update Wf_WorkflowTaskDocumentVersionMapping set DocRegisterID=@DocumentIDVer,DocVersion=@DocumentVer where Wf_WorkflowInstanceDocID=@DocInID
end
END
-----------------------------------------***********************************-------------------------------------------
Declare @AllTasksCount int=(select count(1) from Wf_WorkflowTaskInstance WITH (NOLOCK) where WrokflowInstanceId=@WorkFlowNo)
declare @SkippedTasksCount int=(select count(1) from Wf_WorkflowTaskInstance WITH (NOLOCK) where WrokflowInstanceId=@WorkFlowNo and Status=4)
if(@AllTasksCount=@SkippedTasksCount)
begin
update Wf_WorkflowInstance set Status='Skipped' where WorkflowInstanceId=@WorkFlowNo
end
END