У меня есть конвейер Azure, который отказывается запускать мои интеграционные тесты (ну, перед запуском тестов он должен создать необходимые базы данных из файлов .bak — и именно эта часть дает сбой)
Этот SQL-запрос вызывается как часть моей ClassInitialize
процедуры MSTest:
IF DB_ID('saleslogix_full') IS NOT NULL
BEGIN
ALTER DATABASE [saleslogix_full] SET SINGLE_USER WITH
ROLLBACK IMMEDIATE;
DROP DATABASE [saleslogix_full];
END
restore database saleslogix_full
from disk = 'C:\x\y\z\data-snapshots\saleslogix_full.bak' with Recovery,
move 'saleslogix_full' to 'C:\x\y\z\saleslogix_full.mdf',
move 'saleslogix_full_log' to 'C:\x\y\z\saleslogix_full_log.ldf'
Вышеуказанное вызывается путем подключения к базе данных 'master' сервера (localdb)\MSSQLLocal
. Опять же, "работает на моей машине" с Visual Studio 2019. Но не работает ни на одном из этих агентов Azure: windows-2019
иvs2017-win2016
Дополнительные сведения — фрагмент журнала агента Azure
A total of 6 test files matched the specified pattern.
X SeededSuccessfully_SalesforceIntegration
Error Message:
Class Initialization method MyCorp.Data.ReplicationWorker.Tests.Test1.ClassInit threw exception. System.Data.SqlClient.SqlException: System.Data.SqlClient.SqlException: Cannot create more than one clustered index on table 'dbo.sysschemaarticles'. Drop the existing clustered index 'PK_dbo.sysschemaarticles' before creating another.
Database 'saleslogix_full' was restored, however an error was encountered while replication was being restored/removed. The database has been left offline. See the topic MSSQL_ENG003165 in SQL Server Books Online.
RESTORE DATABASE is terminating abnormally.
Processed 1120 pages for database 'saleslogix_full', file 'saleslogix_full' on file 1.
Processed 2 pages for database 'saleslogix_full', file 'saleslogix_full_log' on file 1..
А вот жемчужина, спрятанная в приведенном выше сообщении журнала:
Cannot create more than one clustered index on table 'dbo.sysschemaarticles'. Drop the existing clustered index 'PK_dbo.sysschemaarticles' before creating another
Прежде чем я начну разбираться, как это сделать, может ли кто-нибудь указать мне направление?почему это работает на моем компьютере с Windows 10, но не работает на моем агенте конвейера Azure?Поначалу мне кажется, что это разница в редакциях SQL "localdb"
решение1
В итоге я поместил try{...}catch{..}
вокруг своего .NET-кода, который отвечал за бомбардировку SQL-выражения.
Улов относится к конкретной System.Data.SqlClient.SqlException
ошибке
В catch я выполняю следующий SQL-код:
"ALTER DATABASE saleslogix_full SET ONLINE"
И все мои интеграционные тесты, похоже, проходят успешно с базой данных.