2017-10-31 3 views
0

Gibt es eine Möglichkeit, wo die Datenbankverweise in einem SQL Server-Datenbankprojekt (Dacpac) zur Laufzeit abgeleitet werden können?Dynamische Datenbankreferenz in SSDT (Dacpac) -Projekt

Wir erstellen ein Produkt, das Dacpac für die Bereitstellung von Datenbankobjekten verwendet.

Unsere Produktimplementierungsteams verwenden Dacpac-Projekte auch, indem sie der Dacpac-Datei des Produkts Datenbankreferenz hinzufügen und dann dem Projekt eigene zusätzliche Objekte hinzufügen.

Das Problem, mit dem wir konfrontiert sind - jedes Mal, wenn die Implementierung auf eine neuere Produktversion verweisen muss, müssen die Dacpac-Stammreferenzen im Implementierungsdacpac manuell geändert werden, um auf den neuen Dateipfad des neuen Produkts zu verweisen dacpac (in der neueren Version). Wir haben mehrere Implementierungsteams und mehrere Datenbankprojekte in jeder Implementierung.

Gibt es eine Möglichkeit, wie die Datenbankverweise (* .dacpac) in einem Datenbankprojekt zur Laufzeit mit einer Variablen oder einem Parameter oder etwas dieser Art abgeleitet werden können?

+1

dacpacs auf den freigegebenen Speicherort setzen –

+0

nur um zu verdeutlichen - meinen Sie, wenn Sie das Projekt bereitstellen, immer das neueste dacpac bereitstellen oder das beim Erstellen des Implementierungsprojekts, das Sie gegen ein Dacpac erstellen möchten, das einige Bits hat fehlt (aus der alten Version)? –

+0

Dmitrijs Kommentar ist ziemlich genau das, was wir tun würden. Erstellen Sie die entsprechende Version von dacpac, legen Sie sie an einem freigegebenen Speicherort ab. Versionskontrolle, die notwendig ist und vielleicht notiert, welche Builds benötigt werden, damit alles richtig funktioniert.Idealerweise sollte der Verweis in einem allgemeinen Pfad wie ".. \ .. \ .. \ Schema \ DB1.dacpac" oder etwas ähnlichem liegen, so dass er für alle Projekte gleich ist. –

Antwort

0

Mein Verständnis für Ihre Frage lautet wie folgt:

Sie haben ein SSDT-Datenbank-Projekt (Beispiel Bilder unten), die eine Datenbankreferenz (ähnlich # 1 unten) mit gespeicherten Prozeduren und anderen db Objekten hat, das Zugriff auf die Referenzdatenbank (ähnlich wie Datei 2 und Code 3). Sie haben die Lösung, die zu einem DACPac führt, "gebaut" und möchten nun diesen DACPac verwenden und andere Datenbanken zur Bereitstellungszeit referenzieren. Hoffentlich habe ich deine Frage richtig verstanden.

Wenn dies der Fall ist, können Sie die Funktion "Profile veröffentlichen" verwenden, um dies zu erreichen (ähnlich wie unten in # 4).

enter image description here

Der Code für diese kann von meinem SSDT talk github project in meinen Notizen zu sehen. Wenn Sie speziell auf die demo04 Lösungsdatei schauen, werden Sie sehen, dass ich eine DEV_MJE.deploy.ps1 PowerShell-Datei und eine DEV_MJE2.deploy.ps1 Datei habe. Diese Skripts führen MSBuild aus, um den DACPac zu erstellen, und verwenden dann SqlPackage, um DEV_MJE.publish.xml oder DEV_MJE2.publish.xml zu veröffentlichen. Hinweis: Wenn Sie dieses Beispiel auf Ihrem Computer ausführen, müssen Sie Ihrem Pfad MSBuild.exe und SqlPackage.exe hinzufügen sowie die TargetConnectionString in den XML-Dateien in eine vorhandene Entwicklungsdatenbank ändern.

Als Beispiel dafür, wie das funktioniert ... Wenn ich das DEV_MJE.publish.xml Profil veröffentlichen verwenden, ist die resultierende GetDataFromAnotherTable.sql Datei enthält:

SELECT [SomeData] FROM [AnotherDb_MJE].[dbo].[AnotherTable] 

Während wenn ich DEV_MJE2.publish.xml die resultierende GetDataFromAnotherTable.sql Datei enthält:

SELECT [SomeData] FROM [AnotherDb_MJE2].[dbo].[AnotherTable] 

Beachten Sie die Datenbankreferenz in der zweiten hat AnotherDb_MJE geändert .

Für eine gute Beschreibung der Verbindung von Publish-Profilen zu DACPacs und SSDT-Datenbankprojekten siehe web page. Es enthält auch Informationen zu alternativen Möglichkeiten zur Bereitstellung über SqlPackage.exe hinaus.

Etwas anderes

Hinweis zu beachten, dass die Steuerung mit Hilfe von Dateipfaden auf Version ein DACPac nicht wirklich die beste Praxis ist. Betrachten Sie das DACPac-Artefakt als einer .Net-DLL ähnlich. Es ist das Nebenprodukt eines Builds.

Daher ist es besser, NuGet und Tools wie Octopus Deploy zum Speichern, Verfolgen und Bereitstellen von DACPacs zu verwenden. Eine gute Beschreibung, wie das funktioniert, finden Sie unter stackoverflow answer.

Hoffnung, dass dies hilft,

Michael

0

Danke für den Followup Kommentar, ich glaube, was Sie versuchen zu tun ist, wenn Sie schreiben und bereitstellen Code unterschiedliche dacpacs je nach Projekt nutzen können ?

Für jedes Implementierungsteam kann eine andere Version des freigegebenen Dacpac bereitgestellt werden, sodass Sie die Dateien nicht einfach an einem freigegebenen Speicherort ablegen und den dacpac "Product_Latest.dacpac" aufrufen können. So erhält jeder immer die neueste Version.

".sqlproj" -Dateien sind standardmäßige Msbuild-Skripts und Referenzen können mithilfe von Msbuild-Eigenschaften verwaltet werden, sodass Sie die Referenz zur Laufzeit technisch ändern können. Wenn Sie Ihre .sqlproj Datei bearbeiten und eine Eigenschaft im ersten <PropertyGroup> Tag hinzufügen, ich verwendet:

<ProdDacpacVersion Condition="'$(ProdDacpacVersion)' == ''">v1</ProdDacpacVersion>

v1 der eindeutige Name für die Version Ordner ist - man muss nur etwas brauchen, wollen die dacpac Sie zu identifizieren.

Ich legte die Eigenschaft direkt nach TargetDatabaseSet und IncludeCompositeObjects.

Wenn Sie dann den Verweis auf die dacpac finden und statt

<ArtifactReference Include="..\..\..\..\..\Desktop\prod\v1\Database2.dacpac"> <HintPath>..\..\..\..\..\Desktop\prod\v1\Database2.dacpac</HintPath> <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors> </ArtifactReference>

Verwenden Sie die Eigenschaft von oben:

<ArtifactReference Include="..\..\..\..\..\Desktop\prod\$(ProdDacpacVersion)\Database2.dacpac"> <HintPath>..\..\..\..\..\Desktop\prod\$(ProdDacpacVersion)\Database2.dacpac</HintPath> <SuppressMissingDependenciesErrors>False</SuppressMissingDependenciesErrors> </ArtifactReference>

Dann wird die Referenz die Eigenschaft wird das bekommen Weg des Dacpac. Es gibt ein paar Möglichkeiten, wie Sie die Eigenschaft festlegen können, Sie könnten die .sqlproj-Datei bearbeiten, wenn Sie eine neue Version der Eigenschaft aus einer Datei oder einer Umgebungsvariablen lesen wollen (ich belasse den msbuild-Spaß für Sie!) .

Ich würde, als Standard wurde jedes Mal die Referenz geändert entweder das Projekt neu zu laden oder Visual Studio neu starten - es wird nicht lange dauern, und es wird viel Fluchen :)

speichern Wenn Sie die dacpac der Bereitstellung, Die Bereitstellung sucht zuerst im selben Ordner nach Referenzen. Stellen Sie daher sicher, dass Sie die richtige Datei bei der Bereitstellung in den Ordner bin kopieren.

Verwandte Themen