web-dev-qa-db-fra.com

Comment obtenir une liste de tous les schémas d'une base de données SQL Server

Je souhaite récupérer une liste de tous les schémas d'une base de données Sql Server donnée. En utilisant l'API de récupération de schéma ADO.NET, je reçois une liste de toutes les collections, mais il n'y a pas de collection pour 'Schémas' . Je pourrais parcourir les collections 'Tables', 'Procedures' (et d'autres si nécessaire) et obtenir une liste de noms de schéma uniques Y at-il un moyen plus facile/plus court d’obtenir le même résultat?

Exemple: pour la base de données standard 'AdventureWorks', j'aimerais également obtenir la liste suivante - dbo,HumanResources,Person,Production,Purchasing,Sales (j'ai omis les autres noms de schéma standard tels que db_accessadmin, db_datareader etc.)

Edit: Je peux obtenir la liste des schémas en interrogeant la vue système - INFORMATION_SCHEMA.SCHEMATA mais préférerais utiliser l'API de schéma en premier choix.

55
alwayslearning

Pour 2005 et les versions ultérieures, vous obtiendrez ce que vous recherchez.

SELECT name FROM sys.schemas
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

Pour 2000, cela donnera une liste des bases de données dans l'instance instance .

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA

C'est "l'incompatibilité arrière" notée dans la réponse de @ Adrift.

Dans SQL Server 2000 (et inférieur), il n'y a pas vraiment de "schémas" en tant que tels, bien que vous puissiez utiliser les rôles comme espaces de noms de la même manière. Dans ce cas, cela peut être l’équivalent le plus proche.

SELECT * FROM sysusers WHERE gid <> 0
64
harpo

Essayez cette requête ici:

SELECT * FROM sys.schemas

Cela vous donnera le nom et le schema_id pour tous les schémas définis dans la base de données dans laquelle vous exécutez ceci.

Je ne sais pas vraiment ce que vous entendez par interroger "l'API de schéma" - ces vues de catalogue sys. (dans le schéma sys) sont votre meilleur choix pour toute information système sur les bases de données et les objets de ces bases.

12
marc_s
SELECT s.name + '.' + ao.name
       , s.name
FROM sys.all_objects ao
INNER JOIN sys.schemas s ON s.schema_id = ao.schema_id
WHERE ao.type='u';
6
Ashok Tewatia

Vous pouvez également interroger la vue INFORMATION_SCHEMA.SCHEMATA:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

Je crois que l’interrogation des vues INFORMATION_SCHEMA est recommandée car elles vous protègent des modifications apportées aux tables système sous-jacentes. Dans l'aide de SQL Server 2008 R2:

Les vues de schéma d'information fournissent un interne, indépendant de la table système vue des métadonnées SQL Server . Les vues de schéma d’information activent les applications fonctionnent correctement bien que des changements importants aient été apportées aux tables système sous-jacentes . Les vues de schéma d'information incluses dans SQL Server conforme à l'ISO définition standard pour le INFORMATION_SCHEMA.

Ironiquement, ceci est immédiatement précédé de cette note:

Quelques changements ont été apportés au vues de schéma d'information qui cassent rétrocompatibilité. Ces changements sont décrits dans les rubriques relatives au fichier vues spécifiques.

5
Jeff Ogata

Si vous utilisez Sql Server Management Studio, vous pouvez obtenir une liste de tous les schémas, créer votre propre schéma ou supprimer un schéma existant en allant sur: 

Bases de données - [Votre base de données] - Sécurité - Schémas

0
Marcello

Vous pouvez également utiliser la requête suivante pour obtenir des schémas pour un utilisateur de base de données spécifique:

select s.schema_id, s.name as schema_name
from sys.schemas s
inner join sys.sysusers u on u.uid = s.principal_id
where u.name='DataBaseUserUserName'
order by s.name
0
Karamafrooz