使用SQL Server 2008 R2 SP3,已应用最新的安全包。
下面的代码是SQL Compare部署脚本的简化/修改部分。我更改了一些名称,但是此代码在SSMS中运行时将其锁定。
要注意的关键事项:
症状是脚本刚刚停止。它没有被阻止。它只是停止。
在试图调用sys.sp_check_constbytable_rowset的脚本SPID上阻止了第二个SPID。
唯一的恢复是杀死脚本SPID,然后杀死第二个SPID。杀死第一个,仅使其处于“已杀死/回滚”状态,直到杀死第二个。仅杀死第二个SPID会导致生成一个新的SPID(也会阻塞并调用同一例程)。
我尝试更改所有SET设置。消除封闭的事务也可以解决此问题,但这不是可用的解决方案。
有什么想法吗?
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL Read committed
GO
BEGIN TRANSACTION
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Altering [dbo].[ProcABC]'
GO
CREATE PROCEDURE [dbo].[ProcABC]
AS
BEGIN
SET NOCOUNT ON
END
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Altering [dbo].[FunctionABC]'
GO
CREATE FUNCTION [dbo].[FunctionABC] ()
RETURNS @ReturnTable TABLE
(
ID int,
Name varchar(50)
)
AS
BEGIN
INSERT INTO @ReturnTable (ID, Name)
SELECT ID, Name
FROM LoopedBackLinkedServer.SomeDB.dbo.SomeTable
RETURN
END
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
COMMIT TRANSACTION
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
DECLARE @Success AS BIT
SET @Success = 1
SET NOEXEC OFF
IF (@Success = 1) PRINT 'The database update succeeded'
ELSE BEGIN
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
PRINT 'The database update failed'
END
GO