明示的な主キーがないDB内のすべてのテーブルを見つけるにはどうすればよいですか?


10

Googleの検索により、クラスター化インデックスなしでテーブルを検索する方法に関する数百万のヒットが発生しました。PKは通常、テーブルのクラスター化インデックスです。ただし、テーブルには、クラスター化インデックスとしての自然キー、およびID列のような非クラスター化代理インデックスを簡単に含めることができます。

主キーが定義されていないDB内のすべてのテーブルを見つけるにはどうすればよいですか?このDBには245のテーブルがあります。手動での検査は非常に非効率的です。

回答:


13

この猫のスキンを作成する方法はいくつかありますが、これはSQL Server 2005以降では問題なく機能します。問題を処理するための簡単な方法です。

このOBJECTPROPERTY()関数は、テーブルなど、オブジェクトに関するさまざまなプロパティをリストできます。それらのプロパティの1つは、テーブルに主キーがあるかどうかです。

OBJECTPROPERTY(object_id, tablehasprimarykey) = 0は、主キーのないテーブルになります。

そう

SELECT OBJECT_SCHEMA_NAME( object_id ) as SchemaName, name AS TableName
FROM sys.tables
WHERE OBJECTPROPERTY(object_id,'tablehasprimaryKey') = 0 
ORDER BY SchemaName, TableName ;

あなたが必要とするものを与えるべきです。OBJECTPROPERTY()関数を使用する他のすべての方法については、オンラインブックで確認できます。これは2012年版の記事です。


よくobject_idは機能しsys.tablesますが、関数を使用していると思いましたが、それ自体がIDを提供し、この素晴らしい関数を示してくれてありがとうございます。
Biju jose 2013年

問題ない。持っていると良い機能です。多くのプロパティ。この場合、あなたはそれを正しく持っています-sys.tablesはすでにその中にobject_idをリストしています。これは、OBJECTPROPERTY関数にIDパラメーターとして渡すobject_idです。私がそこで使用した予約済みキーワードの良いキャッチをありがとう:)
Mike Walsh '18

、あなたはobject_id関数について正確でした、私はそこに物事を混合しました。それを指摘してくれてありがとう。まあ、objectproperty()2005年から利用可能です、私はbolをチェックしました、そうですか?
Biju jose 2013年

はい。2005年から2014年にかけて、現時点で:-)
マイクウォルシュ

スクリプトを編集してスキーマ名を追加しました。(OBJECTPROPERTYのような)OBJECT_SCHEMA_NAME()関数は、MSSQL 2005年に新たにしたことを注意
グリーンストーンウォーカー

5

マイクのソリューションは、特定の問題に最適です。

あなたはより多くの柔軟性をしたい場合は、ここでは簡単にクエリ変身することができ、代替だ戻って、このようなヒープあるすべてのテーブルを見つけること、または一意の制約がないテーブル見つけるなど、他の情報、すべてのを

SELECT
    OBJECT_SCHEMA_NAME(t.object_id) AS SchemaName,
    t.name AS TableName
    FROM sys.tables t
    WHERE
        NOT EXISTS
        (
            SELECT *
                FROM sys.indexes i
                WHERE
                    (i.object_id = t.object_id) AND
                    (i.is_primary_key = 1)
        );

(サブ)システムが50個を超えるテーブルを作成したら、すべてのメタデータテーブルに慣れることが非常に重要です。


+1「あなたが言ったように、各テーブルを手動で調べるのは非現実的です(そしてエラーが発生しやすいからです!」。アーメン。エラーが発生しやすい:)
マイクウォルシュ

4

SQL Server のポリシー管理機能は、これの一部を実行できます。

Tableファセットには、@ HasIndexフィールドと@HasClusteredIndexフィールド(およびトリガーなど、役立つ可能性のある他のフィールド)があります。(中央管理サーバー機能を使用して)複数のサーバーのすべてのデータベースのすべてのテーブルの条件をチェックするポリシーを作成できます。

ただし、主キーインデックスまたは制約の存在を確認することはできません。@HasPrimaryKeyというフィールドがあると誓ったでしょうが、MSSQL2012にはありません。私は覚えていないか、怒っています。

注:ポリシー管理は、SQL Server 2012 Enterprise、Business Intelligence、およびStandardの各エディションに含まれています。Express版ではご利用いただけません。


2
これをチェックするカスタム条件を記述できると思います。これを行うまったく別の方法の+1。
Jon Seigel
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.