it-swarm.com.de

Wie erhalte ich eine Liste aller Schemas in einer SQL Server-Datenbank?

Ich möchte eine Liste aller Schemas in einer bestimmten SQL Server-Datenbank abrufen. Mit der ADO.NET-Schema-Retrieval-API bekomme ich eine Liste aller Sammlungen, aber es gibt keine Sammlung für 'Schemas' . Ich könnte die Sammlungen 'Tables', 'Procedures' (und andere, falls erforderlich) durchsuchen und eine Liste eindeutiger Schemanamen abrufen Gibt es einen einfacheren/kürzeren Weg, um das gleiche Ergebnis zu erzielen?

Beispiel: Für die Standarddatenbank 'AdventureWorks' möchte ich auch die folgende Liste erhalten - dbo,HumanResources,Person,Production,Purchasing,Sales (Ich habe die anderen Standardschemanamen wie db_accessadmin, db_datareader usw. weggelassen).

Bearbeiten: Ich kann die Liste der Schemas abrufen, indem ich die Systemansicht INFORMATION_SCHEMA.SCHEMATA abfrage, aber ich würde es vorziehen, die Schema-API als erste Wahl zu verwenden.

55
alwayslearning

Für 2005 und später geben beide das, wonach Sie suchen.

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

Für 2000 wird eine Liste der Datenbanken in der Instanz angezeigt.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA

Das ist die "Rückwärtsinkompatibilität" in der Antwort von @ Adrift.

In SQL Server 2000 (und darunter) gibt es eigentlich keine "Schemas", obwohl Sie Rollen als Namespaces auf ähnliche Weise verwenden können. In diesem Fall kann dies das nächste Äquivalent sein.

SELECT * FROM sysusers WHERE gid <> 0
64
harpo

Versuchen Sie diese Abfrage hier:

SELECT * FROM sys.schemas

Dies gibt Ihnen den Namen und die schema_id für alle definierten Schemas in der Datenbank, in der Sie dies ausführen.

Ich weiß nicht wirklich, was Sie meinen, wenn Sie die "Schema-API" abfragen - diese sys.-Katalogsichten (im sys-Schema) sind die beste Wahl für Systeminformationen zu Datenbanken und Objekten in diesen Datenbanken.

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

Sie können auch die Ansicht INFORMATION_SCHEMA.SCHEMATA abfragen:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

Ich bin der Meinung, dass das Abfragen der INFORMATION_SCHEMA-Ansichten empfohlen wird, da diese Sie vor Änderungen an den zugrunde liegenden Sys-Tabellen schützen. Aus der SQL Server 2008 R2-Hilfe:

Ansichten von Informationsschemas stellen ein .__ bereit. intern, systemtabellenunabhängig Ansicht der SQL Server-Metadaten . Ansichten des Informationsschemas ermöglichen Anwendungen, um korrekt zu funktionieren obwohl wesentliche Änderungen vorgenommen wurden zu den zugrunde liegenden Systemtabellen gemacht . Die Ansichten des Informationsschemas enthalten in SQL Server entsprechen der ISO Standarddefinition für die INFORMATION_SCHEMA.

Ironischerweise geht dieser Hinweis unmittelbar voraus:

An der .__ wurden einige Änderungen vorgenommen. Informationsschemaansichten, die Rückwärtskompatibilität. Diese Veränderungen werden in den Themen für die .__ beschrieben. bestimmte Ansichten.

5
Jeff Ogata

Wenn Sie Sql Server Management Studio verwenden, können Sie eine Liste aller Schemas erhalten, ein eigenes Schema erstellen oder ein vorhandenes Schema entfernen, indem Sie Folgendes aufrufen: 

Datenbanken - [Ihre Datenbank] - Sicherheit - Schemas

0
Marcello

Sie können auch die folgende Abfrage verwenden, um Schemas für einen bestimmten Datenbankbenutzer abzurufen:

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