2017-02-17 4 views
0

Ich habe eine Anwendung, die ich verwende, um mit zwei verschiedenen Datenbanken zu verbinden, beide haben gespeicherte Prozeduren und Sachen neben den Daten. ZZ haben diese zwei verschiedenen Server aber ich möchte sie in einen bringen und die Datenbanken umbenennen. Aber ich habe kleines Problem, wo meine gespeicherten Prozeduren Verweise auf Datenbanken zum BeispielWie wird der Datenbankname in gespeicherten Stored Procedures referenziert?

select * from DatabaseA.Table1

ich die Datenbank von der Anwendung Config gesteuert werden soll, so muss ich nur noch die Verbindungszeichenfolge ändern .

<add key="DatabaseName" value="DatabaseA"/> 
    or 
<add key="DatabaseName" value="DatabaseB"/> 
+2

Nicht 100% sicher, dass ich verstehe, aber es scheint, als könnten hier Synonyme helfen (von DatabaseA zeigt auf Objekte in DatabaseB und umgekehrt). – dean

+0

Ja, das Ändern der Verbindung funktioniert, aber einige der gespeicherten Prozeduren schlagen fehl, da der Verweis in where-Klauseln – CodeBox

+1

Sie Ihre Question mit zwei Datenbankverwaltungssystemen markiert haben: SQL Server und MySQL. Benutzt du eigentlich beides? –

Antwort

-1

Was ich in der Vergangenheit getan haben, ist die folgende:

CREATE PROCEDURE test 
    @dbName varchar(150) 
AS 
BEGIN 
    DECLARE @SqlStatement VARCHAR(MAX) 
    SELECT @SqlStatement = 'SELECT * FROM ' + @dbName + '.SchemaName.TableName' 
    EXEC sp_executesql @SqlStatement; 
END 
GO 

Diese im Grunde können Sie in der dbName auf die gespeicherte Prozedur übergeben und es verwenden, aber Sie möchten. Sie könnten den Tabellennamen sogar noch weiterreichen, wenn Sie möchten, dass das auch dynamisch ist.

Einer der wichtigsten Vorbehalte dabei ist, dass Sie sicherstellen müssen, gegen SQL Injection zu schützen, und es gibt keine Validierung dieser Ansatz.

Sie diesen Artikel ein Lese geben kann, wenn Sie verwirrt über SQL Injections sind: http://www.sommarskog.se/dynamic_sql.html

jedoch zum Zwecke von dem, was Sie erreichen wollen, glaube ich nicht, dass Injektionen ein Problem sein würde, es ist nur etwas zu beachten.

UPDATE 1: Bedenkt man, dass Sie nicht wollen, in einer Variablen zu jedem Ihrer gespeicherten proc passieren ist die einzige andere Alternative, die ich mir vorstellen kann ist folgendes zu tun:

  • erstellen verschiedene gespeicherte Prozeduren (die auf die verschiedenen Datenbanken verweisen, die Sie möchten).
  • Dann steuern Sie die verschiedenen gespeicherten Proc Name von Config.
+2

https://www.xkcd.com/327/ – gvee

+0

Für die Zwecke, was das OP versucht, obwohl es zu tun scheint nicht, wie er Benutzereingaben für die gespeicherten Proc erwarten würde (zumindest für den DB-Namen) als solches sollte dies ausreichen – Sanity1123

+0

Damit würde ich mich verpflichten, alle SP zu ändern, um den zusätzlichen Parameter übergeben – CodeBox

0

Um auf Synonyme auf meinem Kommentar zu erarbeiten -

In DatabaseA erstellen synomyms auf Objekte in DatabaseB und umgekehrt zeigen, wie folgt aus:

USE DatabaseA 
GO 
CREATE SYNONYM dbo.otherdb_table1 FOR DatabaseB.dbo.table1 
GO 
CREATE SYNONYM dbo.otherdb_table2 FOR DatabaseB.dbo.table2 
GO 
... 

USE DatabaseB 
GO 
CREATE SYNONYM dbo.otherdb_table1 FOR DatabaseA.dbo.table1 
GO 
CREATE SYNONYM dbo.otherdb_table2 FOR DatabaseA.dbo.table2 
GO 
... 

Auf diese Weise können Sie immer verweisen die Tabelle in der Sekunden Datenbank wie

select col1, col2 from dbo.otherdb_table1 

Dies funktioniert Unabhängig davon, wo Sie die gespeicherte Prozedur erstellen, sei es DatenbankA oder DatenbankB, kann die gespeicherte Prozedur identisch sein.

+0

Danke für die Antwort, aber was, wenn gespeicherte Prozeduren, die verschiedene Datenbanken verbinden? – CodeBox

Verwandte Themen