特定のSql Serverデータベース内のすべてのスキーマのリストを取得したい。 ADO.NET
スキーマ取得APIを使用して、すべてのコレクションのリストを取得しますが、「スキーマ」のコレクションはありません。 'Tables'
、'Procedures'
コレクション(および必要に応じて他のコレクション)をトラバースし、一意のスキーマ名のリストを取得できましたが、同じ結果を得るためのより簡単な方法はありませんか?
例:標準の'AdventureWorks'
データベースの場合、次のリストも取得したいと思います-dbo,HumanResources,Person,Production,Purchasing,Sales
(db_accessadmin
、db_datareader
などの他の標準的なスキーム名は省略しました)
編集:システムビュー-INFORMATION_SCHEMA.SCHEMATA
を照会することでスキーマのリストを取得できますが、最初の選択肢としてスキーマAPIを使用することをお勧めします。
2005年以降、これらは両方ともあなたが探しているものを提供します。
SELECT name FROM sys.schemas
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
2000の場合、これはinstanceのdatabasesのリストを提供します。
SELECT * FROM INFORMATION_SCHEMA.SCHEMATA
これが、@ Adriftの回答で指摘されている「後方非互換性」です。
SQL Server 2000(およびそれ以前)には、「スキーマ」は実際にはありませんが、同様の方法でロールを名前空間として使用できます。その場合、これが最も近いものになる可能性があります。
SELECT * FROM sysusers WHERE gid <> 0
ここでこのクエリを試してください:
SELECT * FROM sys.schemas
これにより、これを実行するデータベース内のすべての定義スキーマの名前とschema_idが得られます。
「スキーマAPI」を照会することで何を意味するのか本当にわかりません-これらのsys.
カタログビュー(sys
スキーマ内)は、データベースおよびそれらのデータベース内のオブジェクトに関するシステム情報に対する最善の策です。
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';
INFORMATION_SCHEMA.SCHEMATAビューをクエリすることもできます。
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA
INFORMATION_SCHEMAビューのクエリは、基盤となるsysテーブルの変更から保護するため、お勧めだと思います。 SQL Server 2008 R2ヘルプから:
情報スキーマビューは、SQL Serverメタデータのシステムテーブルに依存しない内部ビューを提供します。情報スキーマビューを使用すると、基になるシステムテーブルに大幅な変更が加えられても、アプリケーションを正しく動作させることができます。 SQL Serverに含まれる情報スキーマビューは、INFORMATION_SCHEMAのISO標準定義に準拠しています。
皮肉なことに、これはこのノートのすぐ前にあります:
後方互換性を壊す情報スキーマビューにいくつかの変更が加えられました。これらの変更は、特定のビューのトピックで説明されています。
Sql Server Management Studioを使用している場合は、すべてのスキーマのリストを取得したり、独自のスキーマを作成したり、既存のスキーマを削除したりできます:
データベース-[あなたのデータベース]-セキュリティ-スキーマ
次のクエリを使用して、特定のデータベースユーザーのスキーマを取得することもできます。
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