2010-09-15 14 views
49

Desidero recuperare un elenco di tutti gli schemi in un determinato database Sql Server. Utilizzo dell'API di recupero dello schema ADO.NET Ottengo un elenco di tutte le raccolte ma non esiste alcuna raccolta per "Schemi". È possibile attraversare le collezioni 'Tables', 'Procedures' (e altre se necessario) e ottenere un elenco di nomi di schemi univoci, ma non esiste un modo più semplice/più breve per ottenere lo stesso risultato?Come ottenere un elenco di tutti gli schemi in un database Sql Server

Esempio: per la 'AdventureWorks' database standard Vorrei anche ottenere la seguente lista - dbo,HumanResources,Person,Production,Purchasing,Sales (ho omesso gli altri nomi SCHEM standard quali db_accessadmin, db_datareader ecc)

Edit: posso ottenere la lista degli schemi interrogando la vista di sistema - INFORMATION_SCHEMA.SCHEMATA ma preferirebbe utilizzare l'API dello schema come prima scelta.

risposta

54

Per il 2005 e successivi, entrambi offriranno quello che stai cercando.

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

Per il 2000, questo darà un elenco dei database nel istanza.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA 

Questa è la "incompatibilità a ritroso" indicata nella risposta di @ Adrift.

In SQL Server 2000 (e in basso), non esistono realmente "schemi" in quanto tali, sebbene sia possibile utilizzare i ruoli come spazi dei nomi in modo simile. In tal caso, questo potrebbe essere l'equivalente più vicino.

SELECT * FROM sysusers WHERE gid <> 0 
+0

Ho provato ad usarlo su un server sql 2000, ma non ho ottenuto tutti gli schemi restituiti. Qualcuno sa perché questo succede? – evilfish

+0

Non ho un'istanza di 2000 in giro per i test - e pensavo che * I * fosse un vero e proprio attaccante! Ricorda che il 2000 non ha "schemi" reali come le versioni successive, quindi quello che stai veramente elencando sono i ruoli. Prova semplicemente "SELECT * FROM sysusers" e vedi se vedi gli identificatori che stai cercando. – harpo

+0

Ho letto su di esso e il SELECT * FROM INFORMATION_SCHEMA.SCHEMATA non è in realtà una buona idea da utilizzare per quanto riguarda le fonti che ho letto detto. Un metodo molto migliore è eseguire la stored procedure della tabella master "sp_databases". Funziona sia per il 2000 che per il 2005 (testato entrambi) e nel mio caso ha restituito il risultato corretto ogni volta. – evilfish

8

Prova questa ricerca qui:

SELECT * FROM sys.schemas 

questo vi darà il nome e schema_id per tutti definisce gli schemi del database si esegue questo

io non so davvero cosa si intende per. interrogando la "schema API" - queste viste di catalogo sys. (nello schema sys) sono la soluzione migliore per qualsiasi informazione di sistema su database e oggetti in quei database.

+0

cool. Anche la tua richiesta sembra fare il trucco. Chissà cosa è più efficiente - interrogando sys.schema o INFORMATION_SCHEMA.SCHEMATA vista? Per "API schema" intendo le chiamate standard SqlConnection.GetSchema "piuttosto che l'emissione esplicita di una query. – alwayslearning

+2

Il "sys". le visualizzazioni del catalogo sono probabilmente un po 'più efficienti e veloci, ma sono specifiche per SQL Server. Le viste INFORMATION_SCHEMA sono uno standard ANSIO indipendente dal database per l'interrogazione dei metadati del database, ma poiché sono state progettate da un comitato di normalizzazione ... l'idea ... –

+0

potrebbe non essere correlata, ho provato [questo] (http://stackoverflow.com/a/175450/2218697) con più istruzioni select per 'PK, FK, D, C, V, UQ' ecc per confrontare il database di origine e destinazione, ma poi ho trovato [questo] (http: //stackoverflow.com/a/685073/2218697) funzionalità in VS, ma non esiste una 'sql query' per confrontare il database completo di origine e destinazione? – stom

4

È possibile anche interrogare la vista INFORMATION_SCHEMA.SCHEMATA:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 

Credo che l'interrogazione di visualizzazioni INFORMATION è raccomandato in quanto si proteggono da modifiche alle tabelle sottostanti sys. Dal R2 Guida in SQL Server 2008:

Informazioni vista dello schema forniscono una vista interna, sistema di tavoli indipendente dei metadati SQL Server. Le visualizzazioni dello schema di informazioni consentono alle applicazioni di funzionare correttamente anche se le modifiche significative sono state apportate alle tabelle di sistema sottostanti . Le viste dello schema di informazioni incluse in SQL Server sono conformi alla definizione standard ISO per lo INFORMATION_SCHEMA.

Ironia della sorte, questo è immediatamente preceduto da questa nota: sono stati fatti

Alcune modifiche alle viste dello schema di informazione che si rompono compatibilità all'indietro. Queste modifiche sono descritte negli argomenti per le viste specifiche .

+1

+1 per sottolineare l'ironia, mi ha fatto una bella risata. – codenheim

4
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' 
0

Se si utilizza SQL Server Management Studio, è possibile ottenere un elenco di tutti gli schemi, creare il proprio schema o rimuovere uno esistente si naviga a:

Databases - [del database ] - Sicurezza - Schemi

Problemi correlati