Azure devops powershell дает другой результат, чем локальный powershell для одного и того же запроса - PullRequest
0 голосов
/ 08 октября 2018

У меня есть этот файл postDacPac в проекте, который запускается во время процесса развертывания.В нем есть хранимая процедура, которая может иногда выдавать ошибку.Я создал фиктивную хранимую процедуру, которая имеет похожую структуру ниже:

CREATE PROCEDURE #tmpSproc
AS
BEGIN
    BEGIN TRANSACTION
        print 'Enter sproc';
        IF @@TRANCOUNT > 0
        BEGIN
            print 'Rollback in sproc.'
            ROLLBACK TRANSACTION
        END;
        THROW 60000, 'Temp error.', 0

END
GO

В файле postDacPac я использую этот sproc следующим образом:

CREATE TABLE #tmpErrors (Error int)
GO
SET XACT_ABORT ON
GO
BEGIN TRANSACTION
GO

IF 1=1 /* It is called in an if condition so I kept the structure same. */
BEGIN
    EXEC #tmpSproc;
END
GO

IF @@ERROR <> 0 AND @@TRANCOUNT > 0
BEGIN
    PRINT N'Rollback after sproc.'
    ROLLBACK TRANSACTION;
END

IF @@TRANCOUNT = 0
BEGIN
    PRINT N'Creating error entry'
    INSERT  INTO #tmpErrors (Error)
    VALUES                  (1);
    BEGIN TRANSACTION;
END
ELSE
    PRINT N'sproc succeeded or skipped.'
GO

IF EXISTS (SELECT * FROM #tmpErrors)
BEGIN
    PRINT N'Rollback after deployment.'
    ROLLBACK TRANSACTION
END
GO
IF @@TRANCOUNT>0 BEGIN
PRINT N'success'
COMMIT TRANSACTION
END
ELSE PRINT N'fail'
GO
DROP TABLE #tmpErrors
GO
DROP PROCEDURE #tempSproc
GO

Я запускаю это на powershell с помощью этого сценария:

Invoke-Sqlcmd -ConnectionString "myConnectionString"  -Inputfile "C:\***\PostDacPac.sql" -QueryTimeout 6000 -Verbose -ErrorVariable errors 

На PowerShell это работает, как я ожидал.Даже если хранимая процедура выдает ошибку и выполняет откат, запрос продолжается до тех пор, пока не завершится сценарий завершения и печати. ​​

Однако, когда я пытаюсь выполнить это развертывание на конвейере Azure Devops (vsts), если происходит сбой sproc, развертывание также завершается неудачно.,Вот как Azure PowerShell вызывает этот файл:

Invoke-Sqlcmd -ServerInstance "***" -Database "***" -Username "***"  -Password ****  -Inputfile "D:\***\PostDacPac.sql" -QueryTimeout  6000 -ConnectionTimeout 120

Я попытался проверить все настройки конвейера в Azure Devops, но не смог найти разницу.Чего мне не хватает в этой области?

1 Ответ

0 голосов
/ 22 октября 2018

Оказалось, что после тайм-аута запроса скрипт как-то запускается снова.Видимо, это известная проблема.Есть также несколько вопросов, связанных с этой проблемой, например: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/d4167226-2da7-49ec-a5c2-60e964785c2c/powershell-invokesqlcmd-calls-stored-procedure-second-time-after-query-timeout-is-expired?forum=sqldatabaseengine

...