Comment créer un alias de base de données dans SQL Server

Nous avons un très vieux logiciel a été créé il y a environ 10 ans et nous n'avons pas de code source.

Le logiciel utilise deux bases de données, DB01 et DB02 sur la même instance SQL Server 2012.

Il existe des instructions SQL telles que db01..table1 join db02..table2, mais le problème principal est que nos processus ne nous permettent pas d'utiliser db02 comme nom de base de données.

La question Est: Comment Pouvons-nous créer un alias de for database?

J'ai essayé d'utiliser CREATE SYNONYM

CREATE SYNONYM [db02] FOR [db02_new_name];

Mais cela ne fonctionne pas pour la base de données nom.

Veuillez suggérer comment il peut être résolu sans patcher un fichier binaire pour corriger les instructions SQL.

25
demandé sur marc_s 2014-02-12 12:08:40

7 réponses

Créez une base de données avec le nom que vous voulez usurper l'identité. Re-jigg le générateur de code DDL pour créer une vue pour chaque table de la base de données qui a les tables auxquelles j'ai besoin d'accéder via le nom codé en dur. Fondamentalement, chaque vue aura une déclaration qui ressemble à ceci..

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

Exemple:

Le nom de la base de données cible codée en dur est appelé ProdDBV1 et la base de données Source que vous avez est nommée ProductDatabaseDatabaseV1, le schéma est dbo et le nom de la table est customer

  1. créer la base de données appelée ProdDBV1 en utilisant SSMS ou script.
  2. CREATE VIEW dbo.customer as SELECT * FROM ProductDatabaseDatabaseV1.dbo.customer

Si vous pouvez énumérer chaque table dans votre base de données "source", puis créer le DDL comme ci-dessus. Si vous le souhaitez, je peux mettre à jour cette publication avec un exemple de code. (en utilisant la procédure sp_msforeachtable si possible)

11
répondu Charles 2017-01-04 16:50:29

J'ai eu un problème similaire.
Résolu avec cette solution de contournement , en utilisant des synonymes.

Version courte: vous inondez votre base de données avec un synonyme de chaque objet que vous devrez référencer. Plus tard, vous recréez chaque synonyme avec l'autre nom de base de données.

9
répondu maxcastaneda 2017-09-20 15:24:32

Voici un proc stocké pour le faire. Ajoutez - le simplement à votre base de données et appelez-le avec la base de données cible. Il créera des synonymes pour toutes les tables de la base de données cible et créera les schémas s'ils n'existent pas. J'ai laissé une section commentée au cas où quelqu'un connaîtrait un moyen de faire fonctionner les schémas de création sans curseur.

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

Utilisez-le comme suit:

EXEC CreateSynonymsForTargetDatabase 'targetDbName'
3
répondu Adam Hardy 2016-03-03 03:07:49

J'ai trouvé la réponse de Charles (et la solution de contournement liée dans le commentaire de maxcastaneda) très utile. J'ai suivi cette approche et cela fonctionne pour moi. Je l'ai un peu simplifié et créé la requête suivante qui affiche tous les synonymes requis pour créer.

Comme condition préalable à cet extrait, la base de données d'origine et la base de données synonyme/alias doivent être sur le même serveur sinon, au cas où vous utiliseriez un serveur lié, vous devez la modifier un peu. Il devrait être assez facile de mettre cela dans un petit sp pour mettre à jour les synonymes automatiquement.

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

N'oubliez pas d'entrer vos noms de base de données au <...> spot.

Copiez simplement le contenu de la colonne SynonymUpdateScript et exécutez - la dans la base de données synonyme - ou créez une procédure stockée pour cette tâche.

Sachez qu'il y a un problème si vous avez des vues en place qui font référence à des tables ou à d'autres objets db sans la convention de nommage 2 parties. Ces synonymes ne fonctionneront pas. Vous devriez résoudre ce problème dans les objets / vues d'origine.

0
répondu Magier 2017-06-28 20:36:47
  1. Accédez à la Base de données que vous souhaitez créer un Alias

  2. Créer une table de dossiers Alias avec la conception préférée,

  3. Accédez à la table des identifiants uniques et vérifiez la dernière séquence de code de la table créée.

    Par exemple, si le dernier code est 10, mettez-le à jour sur 11.

  4. Ouvrez la table armoires et aller à droite en bas et créer le nom de l'armoire Alias que vous voulez.

0
répondu Suzie 2017-09-01 01:42:04

Vous pouvez créer un alias à partir de 'SQL Server Configuration Manager' sous L'outil Configuartion dans le dossier SQL Server.

Source détaillée: http://www.mssqltips.com/sqlservertip/1620/how-to-setup-and-use-a-sql-server-alias/

Http://technet.microsoft.com/en-us/library/ms190445.aspx

-2
répondu BAdmin 2014-02-12 08:25:19

La question Est: Comment Pouvons-nous créer un alias de for database?

Je sais que c'est un vieux post, mais...

C'est pourquoi je n'utilise que la convention de nommage en 2 parties pour les objets SQL. Cela me permet d'avoir des synonymes en 2 parties qui pointent vers des bases de données nommées différemment en fonction de l'environnement dans lequel je suis. Il y a des endroits où cela ne fonctionne pas si bien, mais, pour la plupart, ces endroits sont très rares.

En ce qui concerne les logiciels dont vous n'avez pas le code source et si ce logiciel utilise la convention de nommage en 3 parties, vous n'avez probablement pas de chance à moins de savoir quelle est la convention de nommage en 3 parties pour chaque objet et de créer un synonyme en 3 parties pour chaque objet.

-2
répondu Jeff Moden 2014-04-30 00:40:54