Existe-t-il un moyen de définir le schéma d'une requête de sorte que, dans le reste de la requête, je puisse faire référence aux tables simplement par leur nom sans les ajouter à un préfixe avec un nom de schéma?
Par exemple, j'aimerais faire quelque chose comme ceci:
Use [schemaName]
select * from [tableName]
par opposition à ceci:
select * from [schemaName].[tableName]
Un rapide Google m'a indiqué cette page . Il explique que, à partir de SQL Server 2005, vous pouvez définir le schéma par défaut d’un utilisateur à l’aide de l’instruction ALTER USER. Malheureusement, cela signifie que vous le modifiez de façon permanente. Par conséquent, si vous devez basculer entre les schémas, vous devez le définir chaque fois que vous exécutez une procédure stockée ou un lot d'instructions. Alternativement, vous pouvez utiliser la technique décrite ici .
Si vous utilisez SQL Server 2000 ou une version antérieure cette page explique que les utilisateurs et les schémas sont alors équivalents. Si vous ne préfixez pas votre nom de table avec un schéma\utilisateur, le serveur SQL examinera d'abord les tables appartenant à l'utilisateur actuel, puis celles appartenant au dbo pour résoudre le nom de la table. Il semble que pour toutes les autres tables, vous devez ajouter le schéma\utilisateur.
Je ne crois pas qu'il existe un moyen "par requête" de le faire. (Vous pouvez utiliser le mot clé use
pour spécifier base de données - pas le schéma - mais il s'agit techniquement d'une requête distincte, car vous devez exécuter la commande go
par la suite.)
N'oubliez pas que dans SQL Server, les noms de table qualifiés complets sont au format suivant:
[base de données]. [schéma]. [table]
Dans SQL Server Management Studio, vous pouvez configurer toutes les valeurs par défaut pour lesquelles vous vous interrogez.
Vous pouvez configurer la valeur par défaut database
par utilisateur (ou dans votre chaîne de connexion):
Sécurité> Connexions> (clic droit) utilisateur> Propriétés> Général
Vous pouvez configurer le paramètre par défaut schema
par utilisateur (mais je ne pense pas que vous puissiez le configurer dans votre chaîne de connexion, bien que si vous utilisez dbo
, il s'agisse toujours du paramètre par défaut):
Sécurité> Connexions> (clic droit) utilisateur> Propriétés> Mappage utilisateur> Schéma par défaut
En bref, si vous utilisez dbo
pour votre schéma, vous aurez probablement le moins de maux de tête.
Ce que je fais parfois lorsque j'ai besoin de beaucoup de noms de table, je les obtiendrai ainsi que leur schéma de la table système INFORMATION_SCHEMA: valeur
select TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)
SETUSER peut fonctionner avec un utilisateur, même orphelé, dans la base de données avec le schéma par défaut requis. Mais SETUSER est sur la liste héritée non supportée pour toujours. Une solution similaire consisterait donc à configurer un rôle d’application avec le schéma par défaut requis. Tant qu’aucun accès croisé à la base de données n’est nécessaire, cela devrait fonctionner sans problème.
Très vieille question, mais puisque Google m'a amené ici, je vais ajouter une solution que j'ai trouvée utile:
Étape 1. Créez un utilisateur pour chaque schéma que vous devez pouvoir utiliser. Par exemple. "user_myschema"
Étape 2. Utilisez EXECUTE AS pour exécuter les instructions SQL en tant qu’utilisateur du schéma requis.
Étape 3. Utilisez REVERT pour revenir à l’utilisateur initial.
Exemple: supposons que vous ayez une table "mytable" présente dans le schéma "otherschema", qui n'est pas votre schéma par défaut. Exécuter "SELECT * FROM mytable" ne fonctionnera pas.
Créez un utilisateur nommé "user_otherschema" et définissez le schéma par défaut de cet utilisateur sur "otherschema".
Vous pouvez maintenant exécuter ce script pour interagir avec la table:
EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT
Les instructions Revert réinitialisent l'utilisateur actuel, vous êtes donc à nouveau vous-même.
Lien vers la documentation EXECUTE AS: https://docs.Microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-2017