2017-01-19 1 views
0

Ich bin auf der Suche nach einer Hochverfügbarkeitsarchitektur, wobei zwei Spiegel-Datenbanken existieren (DB1 & DB2), die eine andere Datenbank mit Sichten (DBV) dienen. DB1 hat das Overnight-ETL, während DBV auf DB2 schaut, bis das ETL auf DB1 abgeschlossen ist, zu welchem ​​Zeitpunkt seine Ansichten zu den zugrundeliegenden Tabellen auf DB1 wechseln. Sobald der ETL auf DB1 abgeschlossen ist, wird DB2 mit DB1-Daten vor dem ETL des nächsten Tages wiederhergestellt. Am nächsten Tag wechseln DB1 und DB2 die Rollen.Bessere Art der dynamischen Auswahl einer anderen Datenbank als sp_executesql

Ich bin auf der Suche nach einer besseren/sichereren Möglichkeit, zwischen den beiden Ansichten zu wechseln, als sp_executesql auszuführen, um eine dynamisch erstellte Zeichenfolge auszuführen. Ich werde auch nach gespeicherten Prozeduren aus einer Staging-Datenbank suchen, bei denen die Skripts dynamisch geändert werden müssen, damit die richtige Datenbank für die Ausführung der ETL verwendet werden kann. Im Wesentlichen möchte ich die USE-Anweisung dynamisch übergeben und dann den Rest des Skripts außerhalb einer dynamischen Anweisung ausführen.

Ich möchte sp_executesql aus Support-Gründen für andere Entwickler vermeiden und auch um eine mögliche umfangreiche Verkettung von Strings umgehen, wenn die gespeicherte Prozedur/Ansicht besonders lang wird.

Irgendwelche Ideen/unterschiedliche Ansätze zur Hochverfügbarkeit in diesem Zusammenhang wären zu begrüßen.

+0

Denken Sie über die Verwendung von SSIS nach? Dort können Sie alle Arten von dynamischen Anweisungen definieren und diese über "SQL-Task ausführen" ausführen (und debuggen/verfolgen/...). – Tyron78

+0

Es ist eine meiner ausfallsicheren Optionen, aber wenn ich das via Sprocs überhaupt umgehen kann, wäre es großartig. Ich dachte etwas in der Art einer If-Anweisung, die sich auf eine Nachschlagetabelle bezieht, was: setvar-Datenbank "db_name" sein könnte und führe das dann als meine USE-Anweisung aus. Ich bin mir nicht sicher, ob ich bekommen kann: setvar, um auf diese Weise auf meine Nachschlagetabelle zu verweisen. – TJB

+0

Warum verwenden Sie überhaupt "USE"? Sollte es möglich sein, alle Objekte mit einem voll qualifizierten Namen zu erstellen (CREATE DB1.MySchema.MyView ...) – Tyron78

Antwort

2

Eine Option könnte eine Kopie jeder Ansicht in DBV für beiden Zieldatenbanken erstellen sein - das heißt

some_schema.DB1_myview 
some_schema.DB2_myview 

und dann ein synonym verwenden, um die Ansichten unter ihren endgültigen Namen zu belichten.

CREATE SYNONYM some_schema.myview ON some_schema.DB1_myview 

Ihr Switch-Prozess müsste dann nur die Synonyme und nicht die Views selbst löschen und neu erstellen. Dies müsste immer noch mit einer dynamischen SQL-Anweisung gemacht werden, aber die Komplexität wäre viel geringer.

Ein Nachteil wäre, dass das Risiko besteht, dass die Definitionen der zugrunde liegenden Ansichten nicht mehr synchron sind.


bearbeiten

Auf Kosten von mehr Risiko von out of sync bekommen, wäre es möglich, insgesamt dynamische SQL zu vermeiden, durch die Schaffung von (zum Beispiel) ein Paar von gespeicherten Prozeduren, von denen jeder erzeugt die Synonyme für die eine oder die andere Datenbank. Ihr Vermittlungscode müsste dann nur herausfinden, welcher Vorgang angerufen werden soll.

+0

Vielen Dank für die Idee, obwohl nicht sicher, ich möchte diese Ebene der Duplizierung, wie Sie bemerken. – TJB

0

Haben Sie erwogen, die Datenbanken umzubenennen, während Sie die Dinge umschalten? I.e. die folgenden Drucke 1, gefolgt von 2, nichts in DBV hatten geändert werden:

create database DB1 
go 
use DB1 
go 
create table T (ID int not null); 
insert into T(ID) values (1); 
go 
create database DB2 
go 
use DB2 
go 
create table T (ID int not null); 
insert into T(ID) values (2); 
go 
create database DBV 
go 
use DBV 
go 
create view V 
as 
    select ID 
    from DB1..T 
go 
select * from V 
go 
alter database DB1 modify name = DBt 
go 
alter database DB2 modify name = DB1 
go 
alter database DBt modify name = DB2 
go 
select * from V 

Offensichtlich bessere Namen als 1 und 2 verwendet werden. Auf diese Weise wird immer DB1 für Live und DB2 für jede Staging-Arbeit verwendet.

+0

Haben das berücksichtigt und könnten das tun. Offensichtlich muss ich warten, bis der gesamte ETL-Prozess vor dem Wechsel mit dieser Option abgeschlossen ist. Vielleicht muss ich nur bei dynamicsql bleiben, wenn ich möchte, dass die Ansichten eingeschaltet werden, wenn ihre zugrunde liegenden Tabellen vollständig sind (anstatt auf den gesamten Stapel zu warten). – TJB

Verwandte Themen