SORU
26 ŞUBAT 2009, PERŞEMBE


Bir DB tüm tablolarda aramak için bir dize satır ve sütunların

Büyük bir veritabanı içinde kayboldum ve ben bu veri nereden geldiğini bulmak mümkün değilim. Eğer SQL Server 2005 ile mümkün tabloları, satırları ve sütunları veritabanı her bir dize için arama olup olmadığını merak ediyorum?

Herkes eğer mümkünse ve nasıl bir fikir var mı?

CEVAP
26 ŞUBAT 2009, PERŞEMBE


Bu kod, 2005, ama birkaç uyarılar SQL yapmalıdır:

  1. Tüm nesneler okunur aktiviteler ait olduğunu varsayar. Bunu ayarlamak gerekir Eğer durum böyle değilse.

  2. ACAYİP yavaş. Tablolar sadece bir avuç var ve tamamlamak için birkaç dakika sürdü, bu küçük bir veritabanı üzerinde test ettim. Eğer veritabanınız sonra senin anlayamayacağın kadar büyük ise, bu muhtemelen kullanılamaz zaten.

  3. Kendim yazdım bunu yazdım. Herhangi bir hata işleme koymak istemedim ve özellikle imleçler sık sık kullanmak değil, çünkü başka ıslaklık olabilir. Örneğin, ayırmayı kaldırma/yeniden/her zaman kapatmak yerine sütun imleci yenilemek için bir yol olduğunu düşünüyorum.

Veritabanı anlayamazsın ya da nereden geldiğini bilmiyorsanız, o zaman muhtemelen bilen birini bulmak. Eğer bu verileri nerede bulabilirsiniz varsa bile, bir yerde kopyalanmış olabilir veya anlamadığın veritabanı diğer yönleri olabilir. Eğer şirketinizde kimsenin veritabanı anlarsa o zaman çok büyük bir dertte.

DECLARE
    @search_string  VARCHAR(100),
    @table_name     SYSNAME,
    @table_id       INT,
    @column_name    SYSNAME,
    @sql_string     VARCHAR(2000)

SET @search_string = 'Test'

DECLARE tables_cur CURSOR FOR SELECT name, object_id FROM sys.objects WHERE type = 'U'

OPEN tables_cur

FETCH NEXT FROM tables_cur INTO @table_name, @table_id

WHILE (@@FETCH_STATUS = 0)
BEGIN
    DECLARE columns_cur CURSOR FOR SELECT name FROM sys.columns WHERE object_id = @table_id AND system_type_id IN (167, 175, 231, 239)

    OPEN columns_cur

    FETCH NEXT FROM columns_cur INTO @column_name
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @sql_string = 'IF EXISTS (SELECT * FROM '   @table_name   ' WHERE ['   @column_name   '] LIKE ''%'   @search_string   '%'') PRINT '''   @table_name   ', '   @column_name   ''''

        EXECUTE(@sql_string)

        FETCH NEXT FROM columns_cur INTO @column_name
    END

    CLOSE columns_cur

    DEALLOCATE columns_cur

    FETCH NEXT FROM tables_cur INTO @table_name, @table_id
END

CLOSE tables_cur

DEALLOCATE tables_cur

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • Snazzy Labs

    Snazzy Labs

    9 Aralık 2008