69 votes

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 uniquement par leur nom sans les faire précéder d'un nom de schéma ?

Par exemple, je voudrais faire quelque chose comme ceci :

Use [schemaName]
select * from [tableName]

par opposition à ceci :

select * from [schemaName].[tableName]

1 votes

Pointez sur le nom de votre base de données et sélectionnez nouvelle requête dans SQLMS. Utiliser DBNAME ; Select * from [Tablename] est correct.

37voto

Sem Vanmeenen Points 1491

Une rapide recherche sur Google m'a conduit à cette page . Il explique qu'à partir de sql server 2005, vous pouvez définir le schéma par défaut d'un utilisateur avec l'instruction ALTER USER. Malheureusement, cela signifie que vous le modifiez de façon permanente, donc si vous avez besoin de passer d'un schéma à l'autre, vous devrez le définir à chaque fois que vous exécutez une procédure stockée ou un lot d'instructions. Vous pouvez également utiliser la technique décrite ci-dessous aquí .

Si vous utilisez sql server 2000 ou une version plus ancienne cette page explique que les utilisateurs et les schémas sont alors équivalents. Si vous ne faites pas précéder le nom de votre table d'un schéma \user Pour résoudre le nom de la table, le serveur sql regarde d'abord les tables appartenant à l'utilisateur actuel, puis celles appartenant au dbo. Il semble que pour toutes les autres tables, vous devez ajouter le schéma avant le nom de la table. \user.

21voto

Mike Points 6080

Je ne pense pas qu'il existe un moyen de le faire "par requête". (Vous pouvez utiliser la fonction use pour spécifier le base de données - et non le schéma - mais il s'agit techniquement d'une requête distincte, car vous devez émettre la requête go commandement par la suite).

Rappelez-vous, dans le serveur SQL, les noms de table entièrement qualifiés sont au format :

[base de données].[schéma].[table]

Dans SQL Server Management Studio, vous pouvez configurer tous les paramètres par défaut que vous demandez.

  • Vous pouvez configurer l'option par défaut database sur une base par utilisateur (ou dans votre chaîne de connexion) :

    Sécurité > Logins > (clic droit) utilisateur > Propriétés > Général

  • Vous pouvez configurer l'option par défaut schema sur une base par utilisateur (mais je ne crois pas que vous puissiez le configurer dans votre chaîne de connexion, bien que si vous utilisez l'option dbo qui est toujours la valeur par défaut) :

    Sécurité > Logins > (clic droit) utilisateur > Propriétés > User Mapping > Default Schema

En bref, si vous utilisez dbo pour votre schéma, vous aurez probablement le moins de maux de tête possible.

9voto

Culme Points 656

Très vieille question, mais puisque google m'a conduit 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 d'origine.

Exemple : Disons que vous avez une table "mytable" présente dans le schéma "otherschema", qui n'est pas votre schéma par défaut. L'exécution de "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 comme étant "otherschema".

Maintenant vous pouvez exécuter ce script pour interagir avec la table :

EXECUTE AS USER = 'user_otherschema';
SELECT * FROM mytable
REVERT

Les déclarations de rétablissement réinitialisent l'utilisateur actuel, de sorte que vous êtes à nouveau vous-même.

Lien vers la documentation de EXECUTE AS : https://docs.microsoft.com/en-us/sql/t-sql/statements/execute-as-transact-sql?view=sql-server-2017

2voto

olafk Points 49

Ce que je fais parfois lorsque j'ai besoin d'un grand nombre de noms d'onglets, c'est de les récupérer avec leur schéma dans la table système INFORMATION_SCHEMA : valeur

select  TABLE_SCHEMA + '.' + TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME in
(*select your table names*)

1voto

Moogaloo Points 11

SETUSER pourrait fonctionner, en ayant un utilisateur, même un utilisateur orphelin dans la BD avec le schéma par défaut nécessaire. Mais SETUSER est sur la liste des applications héritées non supportées pour toujours. Une alternative similaire serait donc de configurer un rôle d'application avec le schéma par défaut nécessaire, tant qu'aucun accès croisé à la base de données n'est nécessaire, cela devrait fonctionner à merveille.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X