web-dev-qa-db-fra.com

définir le schéma par défaut pour une requête SQL

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]
57
Chev

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.

36
Sem Vanmeenen

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.

15
mpontillo

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*)

1
olafk

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.

1
Moogaloo

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

0
Culme