web-dev-qa-db-fra.com

Comment créer un synonyme SQL ou un "alias" pour le nom de la base de données?

J'utilise ms SQL 2008 et j'essaie de créer un nom de base de données qui référence une autre base de données. Par exemple, "Dev", "Test", "Démo" sont des noms de bases de données auxquels je pourrais faire référence à partir de plusieurs fichiers de configuration, mais chaque nom pointe vers une autre base de données telle que "db20080101" ou "db20080114".

[Modifier] Certaines configurations concernent des applications qui contrôlent le code et d’autres non (par exemple, les configurations de fichier de source de données du service MS Reporting) [/ Edit]

Il semble que sqlserver ne supporte que les synonymes de View, Table, Sproc ou Function. Et Alias ​​'sont pour les noms de table et de colonne.

Y at-il un moyen de faire cela que j'ai manqué dans la documentation? Quelqu'un a des suggestions sur une solution de contournement?

27
Kevin McKinley

utiliser une notation en 3 parties et un alias jusqu'à la table, exemple

select * from tempdb.dbo.sysobjects a
join master.dbo.sysobjects b on a.id = b.id
4
SQLMenace

J'ai fait quelque chose de similaire à cela en utilisant un autre fichier de configuration.

Le nouveau fichier de configuration mappe votre nom générique sur toutes les informations nécessaires pour se connecter à cette base de données (nom de la base de données, nom d'utilisateur, mot de passe, etc.), puis votre fonction de connexion prend votre nom générique en argument.

db.config:

DEV_DB_NAME = db20080101
DEV_DB_USER = dev_user
DEV_DB_PASS = dev_pass
TEST_DB_NAME = db20070101
TEST_DB_USER = test_user
TEST_DB_PASS = test_pass

code de connexion:

db_connection get_connection(string prefix) {
    db_connection db_conn = new db_connection;
    string db_name = get_config_value(config_path, prefix + "_DB_NAME");
    string db_user = get_config_value(config_path, prefix + "_DB_USER");
    string db_pass = get_config_value(config_path, prefix + "_DB_PASS");

    db_conn.connect(db_name, db_user, db_pass);

    return db_conn;
}

Ensuite, vous appelez simplement get_connection () avec votre alias de base de données comme argument.

1
Ryan Ahearn

Il existe un moyen de simuler cela en utilisant un serveur lié. Cela suppose que vous avez deux serveurs SQL avec le même ensemble de bases de données, l'un pour le développement/test et l'autre en direct.

  1. Ouvrez SQL Server Management Studio sur votre serveur de développement/test  
  2. Cliquez avec le bouton droit sur Objets serveur> Serveurs liés. 
  3. Sélectionnez un nouveau serveur lié ...
  4. Sélectionnez la page générale
  5. Spécifiez alias nom dans le champ Serveur lié - ce sera normalement le nom de votre live serveur.
  6. Sélectionnez SQL Native Client en tant que fournisseur
  7. Entrez sql_server pour le nom du produit
  8. Dans la source de données, spécifiez le nom du development server.
  9. Ajoutez des options de sécurité et de serveur à votre goût
  10. Cliquez sur OK

Ce qui précède concerne SQL Server 2005, mais devrait être similaire pour 2008

Une fois que vous avez fait cela, vous pouvez écrire SQL comme ceci:

SELECT * FROM liveservername.databasename.dbo.tablename

Désormais, lorsque vos scripts sont exécutés sur le serveur de développement avec le serveur lié à lui-même, ils fonctionnent correctement en extrayant les données du serveur de développement. Lorsque les mêmes scripts sont exécutés sur le serveur actif, ils fonctionnent normalement.

1
user1039415

Je sais que cela n’aidera probablement pas dans toutes les situations, mais vous avez toujours la possibilité d’utiliser des vues. Vous pouvez insérer, supprimer, mettre à jour, sélectionner dans une vue, à condition qu'elle possède une clé d'identité appropriée (clé primaire). Si vous le dirigez vers une autre base de données, vous devez supprimer et recréer pour obtenir le schéma différent (si vous travaillez entre la production et le test tout en apportant des modifications au schéma en test et/ou en production.

Les synonymes sont utiles lorsque vous allez dans une autre base de données et que vous avez un nom en 3 ou 4 parties, mais lorsque vous voulez définir un nom défini, un serveur lié fonctionnera également, vous permettant ainsi d'utiliser un nom fixe si les noms de table sont les mêmes dans les deux bases de données et que vous pointez simplement entre prod et test.

0
Lauren Glenn