Bagaimana cara menemukan semua tabel dalam DB yang tidak memiliki kunci primer eksplisit?

10

Pencarian Google memuntahkan jutaan hit tentang cara menemukan tabel tanpa diindeks cluster, PK biasanya menjadi indeks cluster tabel. Namun, tabel dapat dengan mudah memiliki kunci alami sebagai indeks berkerumun, dan indeks pengganti non-berkerumun, seperti kolom identitas.

Bagaimana cara menemukan semua tabel dalam DB tanpa kunci primer yang ditentukan? Saya memiliki 245 tabel dalam DB ini: inspeksi manual sangat tidak efisien.

ProfK
sumber

Jawaban:

13

Beberapa cara untuk menguliti kucing ini tetapi ini berfungsi dengan baik di SQL Server 2005 dan yang lebih tinggi, dan saya merasa ini cara yang bebas rasa sakit untuk menangani masalah ini -

The OBJECTPROPERTY()Fungsi bisa daftar berbagai properti tentang obyek - seperti tabel. Salah satu properti itu adalah apakah suatu tabel memiliki kunci primer atau tidak.

OBJECTPROPERTY(object_id, tablehasprimarykey) = 0 akan menjadi tabel tanpa kunci utama.

Begitu

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

Harus memberi Anda apa yang Anda butuhkan. Anda dapat melihat semua tentang cara lain untuk menggunakan fungsi OBJECTPROPERTY () dalam buku online. Ini adalah versi artikel 2012.

Mike Walsh
sumber
baik object_id akan bekerja saya pikir kami menggunakan function.but sys.tablessendiri memberikan id dan terima kasih untuk menunjukkan fungsi yang luar biasa ini.
Biju jose
Tidak masalah. Ini adalah fungsi yang baik untuk dimiliki. Banyak properti. Dalam hal ini Anda sudah benar - sys.tables sudah mencantumkan object_id di dalamnya. dan itu adalah object_id yang ingin kita sampaikan untuk parameter ID ke fungsi OBJECTPROPERTY. Terima kasih atas tangkapan bagus pada kata kunci yang saya gunakan di sana :)
Mike Walsh
, Anda benar tentang fungsi object_id, saya hanya mencampur semuanya di sana. Terima kasih sudah menunjukkannya. Yah, objectproperty()sudah tersedia sejak 2005 dan seterusnya, saya baru saja memeriksa bol, kan?
Biju jose
Iya. Di sana pada 2005 - 2014 dan seterusnya pada titik ini :-)
Mike Walsh
Saya mengedit skrip untuk menambahkan Nama Skema. Perhatikan bahwa (seperti OBJECTPROPERTY) fungsi OBJECT_SCHEMA_NAME () adalah baru untuk MSSQL 2005.
Greenstone Walker
5

Solusi Mike sangat baik untuk masalah spesifik.

Jika Anda menginginkan lebih banyak fleksibilitas, inilah alternatif yang dapat dengan mudah diubah menjadi kueri yang mengembalikan informasi lain, seperti menemukan semua tabel yang berisi tumpukan, atau menemukan tabel yang tidak memiliki kendala sama sekali .

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

Setelah sistem (sub) Anda melewati ~ 50 tabel, sangat penting untuk membiasakan diri dengan semua tabel metadata, karena seperti yang Anda katakan, memeriksa setiap tabel secara manual tidak praktis (dan rentan terhadap kesalahan!).

Jon Seigel
sumber
Memberi +1 untuk "karena seperti yang Anda katakan, memeriksa setiap tabel secara manual tidak praktis (dan cenderung kesalahan!)." Amin di sana. Sangat rentan terhadap kesalahan :)
Mike Walsh
4

Fitur Manajemen Kebijakan SQL Server dapat melakukan ini.

Sisi tabel memiliki bidang @HasIndex dan @HasClusteredIndex (serta yang lain yang mungkin berguna, seperti pemicu). Kebijakan dapat dibuat untuk memeriksa kondisi di semua tabel, di semua database, di sejumlah server (menggunakan fitur Central Management Server).

Namun, itu tidak bisa memeriksa keberadaan indeks kunci utama atau batasan. Saya bersumpah bahwa ada bidang @HasPrimaryKey tapi tidak ada di MSSQL2012. Entah saya salah mengingat atau menjadi gila.

Catatan: Manajemen Kebijakan disertakan dengan edisi SQL Server 2012 Enterprise, Business Intelligence dan Standar. Ini tidak tersedia dalam edisi Express.

Greenstone Walker
sumber
2
Saya pikir Anda dapat menulis kondisi khusus yang memeriksa ini. Memberi +1 untuk cara yang sangat berbeda untuk melakukan ini.
Jon Seigel