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?
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
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.
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.
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.
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.