Подтвердить что ты не робот

Как получить список всех схем в базе данных Sql Server

Я хочу получить список всех схем в данной базе данных Sql Server. Используя API-интерфейс поиска схемы ADO.NET, я получаю список всех коллекций, но нет коллекции для "Схемы". Я мог бы перемещать коллекции 'Tables', 'Procedures' (и другие, если требуется) и получать список уникальных имен схем, но не существует ли более простой/более короткий способ достижения того же результата?

Пример: для стандартной базы данных 'AdventureWorks' я тоже хотел бы получить следующий список - dbo,HumanResources,Person,Production,Purchasing,Sales (я пропустил другие стандартные имена схем, например db_accessadmin, db_datareader и т.д.)

Изменить: я могу получить список схем, запросив системный вид - INFORMATION_SCHEMA.SCHEMATA, но предпочел бы использовать API схемы в качестве первого выбора.

4b9b3361

Ответ 1

В течение 2005 года и позже они обе дают то, что вы ищете.

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

В 2000 году это даст список баз данных в экземпляре.

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA

Что "обратная несовместимость" отмечена в ответе @Adrift.

В SQL Server 2000 (и ниже) на самом деле нет "схем", хотя вы можете использовать роли как пространства имен аналогичным образом. В этом случае это может быть ближайший эквивалент.

SELECT * FROM sysusers WHERE gid <> 0

Ответ 2

Попробуйте этот запрос здесь:

SELECT * FROM sys.schemas

Это даст вам имя и schema_id для всех, определяющих схемы в базе данных, в которой вы выполняете это.

Я действительно не знаю, что вы подразумеваете под запросом "API схемы" - эти представления каталога sys. (в схеме sys) являются наилучшим выбором для любой системной информации о базах данных и объектах в этих базах данных.

Ответ 3

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';

Ответ 4

Вы также можете запросить представление INFORMATION_SCHEMA.SCHEMATA:

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

Я считаю, что рекомендуется запрашивать представления INFORMATION_SCHEMA, поскольку они защищают вас от изменений в базовых таблицах sys. В справке SQL Server 2008 R2:

Представления информационных схем предоставляют внутренняя, системная таблица-независимая представление метаданных SQL Server. Разрешения представления информационных схем приложения работают правильно хотя существенные изменения были сделанные в лежащие в основе системные таблицы. Представлены схемы информационных схем в SQL Server соответствуют ISO стандартное определение для INFORMATION_SCHEMA.

По иронии судьбы, этому немедленно предшествует эта заметка:

Некоторые изменения были внесены в представления информационных схем, которые прерываются Обратная совместимость. Эти изменения описаны в разделах конкретные виды.

Ответ 5

Если вы используете Sql Server Management Studio, вы можете получить список всех схем, создать свою собственную схему или удалить существующую, просмотрев:

Базы данных - [Ваша база данных] - Безопасность - Схемы

Ответ 6

Вы также можете использовать следующий запрос для получения схем для конкретного пользователя базы данных:

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