Ich arbeite an einem SSIS-Paket, das Entwicklungsdatenbanken aus Produktionssicherungen aktualisiert. Das Paket ist seit Jahren vorhanden, aber wir stellen Verfügbarkeitsgruppen auf der Entwicklungsinstanz bereit, sodass die Aufgaben geändert werden müssen, um sowohl mit den primären als auch mit den sekundären Replikaten zu arbeiten. Hintergrund: Alle Instanzen sind SQL Server 2014 SP2. Eine Produktionsinstanz (PD1), zwei Entwicklungsinstanzen (DV3 & DV7) und eine Dienstprogramminstanz (DV1), in denen das SSIS-Paket in SSISDB bereitgestellt wird und in der der SQL Agent-Job ausgeführt wird. Nachdem im SSIS-Paket die vollständigen Sicherungen abgerufen und eine Netzwerkfreigabe aus der Produktion bereitgestellt wurden, müssen die nächsten Aufgaben (in einem separaten SSIS-Paket) herausfinden, auf welchem Knoten sich das primäre Replikat befindet. Ich folge den hier aufgeführten Schrittenum diese Arbeit zu erledigen, und alles funktioniert großartig, wenn es fest codiert ist (was natürlich nicht funktioniert, wenn / wenn ein Failover auftritt). Die einzige Möglichkeit, darüber nachzudenken, besteht darin, zur Laufzeit zu bewerten, welche Instanz primär ist, und dann mit den Aufgaben fortzufahren (die übrigens alle "Execute SQL Task" -Objekte sind - für die eine eigene Verbindungsdefinition erforderlich ist ). Ich habe einige Beispiele für die Verwendung von Ausdrücken in ConnectionStrings und Variablen gesehen, kann jedoch nicht herausfinden, wie der von der folgenden Abfrage in SQL Server zurückgegebene Wert festgelegt wird, um die richtige Instanz zum Festlegen der Verbindungszeichenfolge im Paket zurückzugeben.
select cs.replica_server_name
from sys.dm_hadr_availability_replica_states rs
join sys.dm_hadr_availability_replica_cluster_states cs
on rs.replica_id = cs.replica_id
join sys.dm_hadr_name_id_map n
on rs.group_id = n.ag_id
where rs.role = 2
and n.ag_name = 'DVAG001'
Im Idealfall gibt es zwei dieser Verbindungsmanager, einen für den primären und einen für den sekundären, die ich dann in den Objekten "SQL-Task ausführen" verwenden kann. Dann würde alles perfekt funktionieren. Es gibt vielleicht auch andere Möglichkeiten, dies zu tun, aber ich bin nicht sehr erfahren in SSIS oder der Entwicklung außerhalb von TSQL.
UPDATE: Der obige Vorgang wird jeden Tag ausgeführt. Deshalb verwende ich ein SSIS-Paket und einen SQL-Agenten. Daher muss der gesamte Prozess automatisiert werden und alle erforderlichen Werte - insbesondere die Bestimmung der Replikationszustände (primär und sekundär) - im Paket enthalten sein, damit kein manueller Eingriff erforderlich ist.