Bir DB'de açık birincil anahtarı olmayan tüm tabloları nasıl bulabilirim?


10

Bir Google araması, kümelenmiş dizine eklenmemiş tabloların nasıl bulunacağı konusunda milyonlarca isabet gösterdi; PK normalde bir tablonun kümelenmiş dizini. Ancak, bir tablonun kolayca kümelenmiş bir dizin olarak doğal bir anahtarı ve bir kimlik sütunu gibi kümelenmemiş bir vekil dizin olabilir.

Bir birincil anahtar tanımlanmadan bir DB'deki tüm tabloları nasıl bulabilirim? Bu DB 245 tablolarım var: manuel inceleme fena halde verimsiz.

Yanıtlar:


13

Bu kedi derisi için birkaç yol ama bu SQL Server 2005 ve üstü iyi çalışıyor ve ben sorunu ele ağrısız bir yol bulmak -

OBJECTPROPERTY()Tablolar gibi - işlev nesneler hakkında çeşitli özellikleri listeleyebilirsiniz. Bu özelliklerden biri, tablonun birincil anahtarı olup olmadığıdır.

OBJECTPROPERTY(object_id, tablehasprimarykey) = 0, birincil anahtarı olmayan bir tablo olur.

Yani

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

Size ihtiyacınız olanı vermelisiniz. OBJECTPROPERTY () işlevini çevrimiçi kitaplarda kullanmanın diğer yollarını görebilirsiniz. Bu makalenin 2012 versiyonudur.


iyi object_id işe yarayacaktır I işlevini kullandığımızı düşündüm. ama sys.tableskendisi kimliği verir ve bu harika işlevi göstermek için teşekkürler.
Biju jose

Sorun değil. Sahip olmak iyi bir işlevdir. Birçok özellik. Bu durumda hakkınız vardır - sys.tables içindeki object_id öğesini zaten listeler. ve ID parametresi için OBJECTPROPERTY işlevine iletmek istediğimiz object_id. Orada kullandığım ayrılmış anahtar kelime iyi yakalamak için teşekkürler :)
Mike Walsh

, object_id işlevi hakkında tam olarak haklıydınız, orada bir şeyler karıştırdım. işaret ettiğiniz için teşekkürler objectproperty(). 2005'ten itibaren kullanılabilir, bol bol kontrol ettim, değil mi?
Biju jose

Evet. 2005 - 2014 ve sonrasında bu noktada :-)
Mike Walsh

Şema Adı eklemek için komut dosyasını düzenledim. (OBJECTPROPERTY gibi) OBJECT_SCHEMA_NAME () işlevinin MSSQL 2005 için yeni olduğunu unutmayın.
Greenstone Walker

5

Mike'ın çözümü belirli bir sorun için mükemmel.

Daha fazla esneklik istiyorsanız, buraya kolayca bir sorguya dönüştü edilebilir bir alternatiftir döndürdüğü böyle yığınları olan tüm tabloların bulunması veya hiçbir benzersiz kısıtlamaları tabloları bulma gibi diğer bilgiler, hiç .

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

(Alt) sisteminiz ~ 50 tabloyu aştığında, tüm meta veri tablolarına aşina olmak gerçekten önemlidir, çünkü dediğin gibi, her tabloyu manuel olarak gözden geçirmek pratik değildir (ve hataya yatkındır!).


+1 için "çünkü söylediğin gibi, her tabloyu manuel olarak gözden geçirmek pratik değildir (ve hataya yatkındır!)." Amin burada. Hataya çok eğilimli :)
Mike Walsh

4

İlkesi Yönetim SQL Server özelliği, bu bazı yapabilirsiniz.

Tablo faseti @HasIndex ve @HasClusteredIndex alanlarına (ayrıca tetikleyiciler gibi yararlı olabilecek diğer alanlara) sahiptir. Tüm tablolarda, tüm veritabanlarında, birkaç sunucuda (Central Management Server özelliğini kullanarak) koşulları kontrol etmek için bir ilke oluşturulabilir.

Ancak, birincil anahtar dizini veya kısıtlamasının varlığını denetleyemez. @HasPrimaryKey bir alan olduğunu yemin ederim ama MSSQL2012 orada değil. Yanlış hatırlıyorum ya da deliriyorum.

Not: İlke Yönetimi, SQL Server 2012 Enterprise, Business Intelligence ve Standard sürümlerinde bulunur. Express sürümünde mevcut değildir.


2
Bunu kontrol eden özel bir durum yazabileceğinizi düşünüyorum. Bunu yapmanın tamamen farklı bir yolu için +1.
Jon Seigel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.