2014-02-12 5 views
24

Wir haben eine sehr alte Software wurde vor ca. 10 Jahren erstellt und wir haben keinen Quellcode. Die Software verwendet die beiden Datenbanken DB01 und DB02 auf derselben SQL Server 2012-Instanz.Wie erstellt man einen Alias ​​der Datenbank in SQL Server

Es gibt SQL-Anweisungen wie db01..table1 join db02..table2, aber das Hauptproblem ist, dass unsere Prozesse db02 nicht als Namen der Datenbank verwenden können.

Die Frage ist: Wie können wir einen Alias ​​für die Datenbank erstellen?

ich versuchte CREATE SYNONYM

CREATE SYNONYM [db02] FOR [db02_new_name]; 

zu verwenden, aber es für Datenbanknamen nicht funktioniert.

Bitte schlagen Sie vor, wie es gelöst werden kann, ohne Binärdateien zur Korrektur von SQL-Anweisungen zu patchen.

+4

Ich glaube nicht, dass Sie können.Beide aktuellen Antworten scheinen den Punkt zu verfehlen und erlauben einen Alias ​​für eine Serverinstanz, und SYNONYM funktioniert nur für Objekte innerhalb einer Datenbank. Mir ist keine Möglichkeit bekannt, einen Datenbanknamen als Alias ​​zu verwenden. –

Antwort

10

Erstellen Sie eine Datenbank mit dem Namen, den Sie imitieren möchten. Überprüfe den DDL-Codegenerator, um eine Ansicht für jede Tabelle in der Datenbank zu erstellen, die über die Tabellen verfügt, auf die ich über den fest codierten Namen zugreifen muss. Grundsätzlich wird jede Ansicht eine Erklärung haben, die wie folgt aussieht ..

CREATE VIEW schemaname.tablename as SELECT * FROM targetdbname.schemaname.tablename 

Beispiel:

Die Zieldatenbanknamen, die hartcodiert ist heißt und die Quelle DB Sie gestattet ProductDatabaseDatabaseV1, Schema ist dbo und Tabellenname ist customer

  1. erstellen Sie die Datenbank namens SSMS oder Skript.
  2. CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer

Wenn Sie jede Tabelle in der „Quelle“ Datenbank aufzählen kann und dann wie oben die DDL erstellen. Wenn Sie möchten, kann ich diesen Beitrag mit einem Codebeispiel aktualisieren. (mit der sp_msforeachtable Prozedur, wenn möglich)

+0

Angenommen, Sie haben einen SSRS-Bericht, der einen SP aufruft, wobei einer der Parameter der Datenbankname ist (sagen Sie, dass Sie 10 verschiedene Kundendatenbanken haben) - ich glaube nicht, dass Sie damit dynamische SQL im SP vermeiden würden : sp_executesql @sql), wobei @sql den Datenbanknamen zur Laufzeit verkettet hat, oder? – tbone

+1

Dies wird auch nicht Funktionen behandeln. :( – tbone

-3

Die Frage ist: wie wir ein Alias ​​für Datenbank erstellen können?

Ich weiß, das ist eine alte Post, aber ...

Aus diesem Grund habe ich nur den 2 Teil Namenskonvention für SQL-Objekte verwenden. Es erlaubt mir 2 Teil-Synonyme, die auf unterschiedlich benannte Datenbanken zeigen, abhängig davon, in welcher Umgebung ich bin. Es gibt einige Orte, an denen es nicht so gut funktioniert, aber diese Orte sind meistens sehr selten.

Für Software, die Sie nicht den Quellcode haben und wenn diese Software die 3-teilige Namenskonvention verwendet, sind Sie wahrscheinlich nur Pech, wenn Sie nicht wissen, was die 3-teilige Namenskonvention für jedes Objekt und ist Erstellen Sie ein 3-teiliges Synonym für jedes Objekt.

+0

Nach den Downvotes zu urteilen, hat jemand ernsthaft den Punkt verpasst. Sogar das OP gab bekannt, dass sie die Synonym-Methode verwendet haben. –

7

Ich hatte ein ähnliches Problem.
Gelöst mit dieser workaround, mit Synonymen.

Kurzversion: Sie überfluten Ihre Datenbank mit einem Synonym für jedes Objekt, auf das Sie jemals verweisen müssen. Später erstellen Sie jedes Synonym neu mit dem anderen Datenbanknamen.

+1

Wow ... Leute sind sicher wählerisch hier. Max lieferte einen Link zu einer im Wesentlichen richtigen Antwort und es scheint, gewählt worden zu sein, weil es einen Link anstelle einer schriftlichen Antwort zur Verfügung stellte? –

+21

Und wenn der Blog stirbt und geht in ein paar Jahren weg? –

+2

@DavidRoussel in diesem Fall verwenden Sie Web-Archiv :-) https://web.archive.org/web/20150502091442/http://www.baud.cz/blog/database-alias- in-microsoft-sql-server –

0

Ich fand Charles 'Antwort (und die verlinkte Problemumgehung im Kommentar von maxcastaneda) sehr nützlich. Ich bin diesem Ansatz gefolgt und es funktioniert für mich. Ich habe es ein wenig rationalisiert und die folgende Abfrage erstellt, die alle erforderlichen Synonyme zum Erstellen bringt.

Als Voraussetzung für dieses Snippet müssen sich sowohl die Original-DB als auch das Synonym/Alias ​​db auf demselben Server befinden, andernfalls wird der Verbindungsserver verwendet, oder Sie müssen ihn etwas ändern. Es sollte ziemlich einfach sein, dies in eine kleine SP zu setzen, um die Synonyme automatisch zu aktualisieren.

USE <SYNONYMDB> 
SELECT 
'[' + TABLE_NAME + ']', 
'[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']', 
'IF EXISTS (SELECT * FROM sys.synonyms WHERE name = ''' + TABLE_NAME + ''') DROP SYNONYM ['+ TABLE_NAME + ']; CREATE SYNONYM [' + TABLE_NAME + '] FOR <ORIGINALDB>.' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']' AS SynonymUpdateScript FROM <ORIGINALDB>.INFORMATION_SCHEMA.TABLES 

Vergessen Sie nicht, Sie Db Namen an den < ...> spots einzugeben.

Kopieren Sie einfach den Inhalt der SynonymUpdateScript Spalte und führen Sie sie im Synonym-DB aus - oder erstellen Sie eine gespeicherte Prozedur für diese Aufgabe.

Beachten Sie, dass ein Problem vorliegt, wenn Sie Ansichten haben, die auf Tabellen oder andere db-Objekte ohne die 2-teilige Namenskonvention verweisen. Diese Synonyme werden nicht funktionieren. Sie sollten dies in den ursprünglichen Objekten/Ansichten beheben.

3

Hier ist eine gespeicherte Proc, um es zu tun. Fügen Sie es einfach Ihrer Datenbank hinzu und rufen Sie es mit der Zieldatenbank auf. Es erstellt Synonyme für alle Tabellen in der Zieldatenbank und erstellt die Schemas, wenn sie nicht vorhanden sind. Ich habe einen auskommentierten Abschnitt für den Fall gelassen, dass jemand einen Weg kennt, wie die Create-Schemas ohne Cursor funktionieren.

CREATE PROCEDURE CreateSynonymsForTargetDatabase (
    @databaseName sysname 
) 
AS BEGIN 
DECLARE @TSQL nvarchar(max) = N'' 
DECLARE @rn char(2), 
    @SchemaName sysname; 

    SET @rn = char(13) + char(10) 

    CREATE TABLE #DBSynonym(  
     [Schema] sysname NOT NULL, 
     [Table] sysname NOT NULL 
    ) 

    SET @TSQL = N' 
     INSERT INTO #DBSynonym ([Schema], [Table]) 
     SELECT Schemas.name, Tables.name 
     FROM [' + @databaseName + '].sys.tables 
     INNER JOIN [' + @databaseName + '].sys.schemas on tables.schema_id = schemas.schema_id  
    ' 

    EXEC (@TSQL) 
    SET @TSQL = N'' 

    DECLARE MissingSchemasCursor CURSOR 
    READ_ONLY 
    FOR 
     SELECT newSchemas.[Schema] 
     FROM #DBSynonym newSchemas 
     LEFT JOIN sys.schemas on newSchemas.[Schema] = schemas.name 
     WHERE schemas.schema_id is null 
     GROUP BY newSchemas.[Schema] 

    OPEN MissingSchemasCursor 
    FETCH NEXT FROM MissingSchemasCursor INTO @SchemaName 
    WHILE (@@fetch_status <> -1) 
    BEGIN 
     IF (@@fetch_status <> -2) 
     BEGIN 
      SET @TSQL = N'CREATE SCHEMA ' + QUOTENAME(@SchemaName) + N';' 

      EXEC sp_executesql @TSQL 
     END 
     FETCH NEXT FROM MissingSchemasCursor INTO @SchemaName 
    END 
    CLOSE MissingSchemasCursor 
    DEALLOCATE MissingSchemasCursor 

    /* 
    SELECT @TSQL = @TSQL + 
     N' 
     GO 
     CREATE SCHEMA ' + QUOTENAME([Schema]) + N';' 
    FROM #DBSynonym newSchemas 
    LEFT JOIN sys.schemas on newSchemas.[Schema] = schemas.name 
    WHERE schemas.schema_id is null 
    GROUP BY newSchemas.[Schema] 

    PRINT 'CREATE SCHEMAS : ' + ISNULL(@TSQL,'') 
    EXEC sp_executesql @TSQL 
    */ 
    SET @TSQL = N'' 

    SELECT @TSQL = @TSQL + 
     N' 
     CREATE SYNONYM ' + QUOTENAME([Schema]) + N'.' + QUOTENAME([Table]) + N' 
     FOR ' + QUOTENAME(@databaseName) + N'.' + QUOTENAME([Schema]) + N'.' + QUOTENAME([Table]) + N';' 
    FROM #DBSynonym 


    EXEC sp_executesql @TSQL 
    SET @TSQL = N'' 

END 
GO 

Verwenden Sie es wie folgt:

EXEC CreateSynonymsForTargetDatabase 'targetDbName' 
0
  1. Zum Datenbank-Alias,

  2. erstellen Sie möchten mit dem bevorzugten Entwurf, der ein Alias-Ordner Tabelle erstellen,

  3. Wechseln Sie in die Tabelle der eindeutigen IDs und prüfen Sie die letzte Codefolge für die erstellte Tabelle.

    Zum Beispiel, wenn der letzte Code 10 ist, aktualisieren Sie es dann bis 11.

  4. Offene Schränke Tisch und zuunterst gehen und den Namen des Kabinetts Alias ​​erstellen Sie wollen.