web-dev-qa-db-ja.com

Sql Serverデータベース内のすべてのスキーマのリストを取得する方法

特定のSql Serverデータベース内のすべてのスキーマのリストを取得したい。 ADO.NETスキーマ取得APIを使用して、すべてのコレクションのリストを取得しますが、「スキーマ」のコレクションはありません。 'Tables''Procedures'コレクション(および必要に応じて他のコレクション)をトラバースし、一意のスキーマ名のリストを取得できましたが、同じ結果を得るためのより簡単な方法はありませんか?

例:標準の'AdventureWorks'データベースの場合、次のリストも取得したいと思います-dbo,HumanResources,Person,Production,Purchasing,Salesdb_accessadmindb_datareaderなどの他の標準的なスキーム名は省略しました)

編集:システムビュー-INFORMATION_SCHEMA.SCHEMATAを照会することでスキーマのリストを取得できますが、最初の選択肢としてスキーマAPIを使用することをお勧めします。

58
alwayslearning

2005年以降、これらは両方ともあなたが探しているものを提供します。

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

2000の場合、これはinstancedatabasesのリストを提供します。

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA

これが、@ Adriftの回答で指摘されている「後方非互換性」です。

SQL Server 2000(およびそれ以前)には、「スキーマ」は実際にはありませんが、同様の方法でロールを名前空間として使用できます。その場合、これが最も近いものになる可能性があります。

SELECT * FROM sysusers WHERE gid <> 0
68
harpo

ここでこのクエリを試してください:

SELECT * FROM sys.schemas

これにより、これを実行するデータベース内のすべての定義スキーマの名前とschema_idが得られます。

「スキーマAPI」を照会することで何を意味するのか本当にわかりません-これらのsys.カタログビュー(sysスキーマ内)は、データベースおよびそれらのデータベース内のオブジェクトに関するシステム情報に対する最善の策です。

13
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

INFORMATION_SCHEMA.SCHEMATAビューをクエリすることもできます。

SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA

INFORMATION_SCHEMAビューのクエリは、基盤となるsysテーブルの変更から保護するため、お勧めだと思います。 SQL Server 2008 R2ヘルプから:

情報スキーマビューは、SQL Serverメタデータのシステムテーブルに依存しない内部ビューを提供します。情報スキーマビューを使用すると、基になるシステムテーブルに大幅な変更が加えられても、アプリケーションを正しく動作させることができます。 SQL Serverに含まれる情報スキーマビューは、INFORMATION_SCHEMAのISO標準定義に準拠しています。

皮肉なことに、これはこのノートのすぐ前にあります:

後方互換性を壊す情報スキーマビューにいくつかの変更が加えられました。これらの変更は、特定のビューのトピックで説明されています。

5
Jeff Ogata

Sql Server Management Studioを使用している場合は、すべてのスキーマのリストを取得したり、独自のスキーマを作成したり、既存のスキーマを削除したりできます:

データベース-[あなたのデータベース]-セキュリティ-スキーマ

0
Marcello

次のクエリを使用して、特定のデータベースユーザーのスキーマを取得することもできます。

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