localdb RESTORE SQL funktioniert auf meiner Win 10-Box, aber nicht auf meinem Azure-Pipeline-Agenten

localdb RESTORE SQL funktioniert auf meiner Win 10-Box, aber nicht auf meinem Azure-Pipeline-Agenten

Ich habe eine Azure-Pipeline, die sich weigert, meine Integrationstests auszuführen (also, bevor die Tests ausgeführt werden, muss sie die erforderlichen Datenbanken aus .bak-Dateien erstellen – und das ist der Teil, der fehlschlägt).

Dieses SQL wird als Teil meiner MSTest- ClassInitializeRoutine aufgerufen:

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'

Das Obige wird aufgerufen, indem eine Verbindung zur „Master“-Datenbank des (localdb)\MSSQLLocalServers hergestellt wird. Auch hier funktioniert „auf meinem Computer“ mit Visual Studio 2019. Funktioniert aber auf keinem dieser Azure-Agenten: windows-2019undvs2017-win2016


Weitere Details: Azure Agent-Protokollausschnitt

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..

Das Juwel in der obigen Protokollnachricht ist nun: Cannot create more than one clustered index on table 'dbo.sysschemaarticles'. Drop the existing clustered index 'PK_dbo.sysschemaarticles' before creating another

Bevor ich mich damit befasse, wie das geht, kann mir jemand einen Hinweis geben, wiewarum funktioniert das auf meiner Windows 10-Box, aber nicht auf meinem Azure-Pipeline-Agent?Mein erstes Gefühl sagt mir, dass es ein Unterschied in den "localdb" SQL-Editionen ist

Antwort1

Am Ende habe ich einen try{...}catch{..}Umweg um meinen .NET-Code gemacht, der für die bombardierende SQL-Anweisung verantwortlich war.

Der Catch ist spezifisch für einen System.Data.SqlClient.SqlExceptionFehler

Innerhalb des Catches führe ich dieses SQL aus:

"ALTER DATABASE saleslogix_full SET ONLINE"

Und alle meine Integrationstests scheinen mit der Datenbank erfolgreich zu sein

verwandte Informationen