Bir şema değişikliğinden sonra bozuk saklı yordamları nasıl algılayabilirim?


11

Veritabanımda merkezi bir tablo değiştirdim ve sp_depends tam anlamıyla yüzlerce sonuç döndürür ve bu saklı yordamlar bazıları benim değişiklikten sonra derleme olmayabilir endişe ediyorum.

Tek bir saklı yordamı kontrol etmek kolaydır (sadece alter komut dosyasını yeniden çalıştırın ve işlemin başarılı olup olmadığını görüyorum), ancak 100+ prosedürde bunu yapmak biraz hantal.

Ben gibi bir komut dosyası kullanabilirsiniz biliyorum bu bir gelmiyor mu benim durumumda uygun görünen bu yüzden, benim veritabanının tüm nesneleri yeniden derlemek için, ancak gerçek operasyon saklı yordam hemen değil, yürütülen yerde yakın zaman alacaktır.

Ayrıca tüm saklı yordamları tamamen bırakabileceğimi ve kaynak denetim sistemimle veritabanımı yeniden düzenleyebileceğimi düşünüyordum, ancak bu seçenek, uygulanabilir olmasına rağmen çok zarif değil. Bunu yapmanın daha iyi bir yolu var mı?

SQLServer 2008 R2 kullanıyorum ve veritabanı betiklerim VS 2008 veritabanı projesinde saklanıyor.


Açıklığa kavuşturmak için, sadece test koduna bu yaklaşıma güvenmek gerektiğini savunmuyorum. Tıpkı c # 'da olduğu gibi, kodladığınız gibi diğer bağımlı dosyalarda sözdizimi hatasını anında algılarsınız (ve daha sonra genellikle birkaç büyüklük sırası daha yavaş olan birim testleri gibi test etmek için diğer stratejileri kullanırsınız), SQL bağımlılıklarını tespit etmenin mantıklı olacağını düşünüyorum normalde tamamlanması birkaç saat sürebilen tam bir işlevsel test çalıştırmak yerine saniyeler içinde hatalar.

Yanıtlar:


7

Ünitenizi, işlevsel, entegrasyon ve performans testlerinizi yapmaya ne dersiniz? Herhangi bir testiniz yoksa, veritabanı şemanızı kod olarak düşünmeye ve sürüm kontrolü ve test de dahil olmak üzere bu şekilde ele almaya başlamak için ciddi bir zamandır . Alex Kuznetsov'un bu konuya adanmış bir kitabı var: SQL Server ile Savunmalı Veritabanı Programlama .


Testler her zaman kodun% 100'ünü kapsamaz ve yaptıklarında genellikle çalışması birkaç saat sürer. C #, benim kod hala saniyeler içinde derleme olup olmadığını tespit edebilir (doğruluk ne olursa olsun). Bu, doğru test etmeden kodu (c # veya PLSQL olmasına bakılmaksızın) üretime itmem gerektiği anlamına gelmez, ancak kırık bağımlılıkları hızlı bir şekilde tespit etmenin bir yolu olması mantıksız görünmüyor , değil mi?
Brann

2
Maalesef şu anda SQL Server'ın en son teknolojiye sahip durumu, saklı yordamda vis-a-vis bağımlılık algılaması 'derinden kırık', bkz. SQL Bağımlılıklarını Anlama veya SQL Server 2008'de sistem bağımlılıklarını güncel tutma . Sorunu çözmeye çalışan üçüncü taraf araçlar
Remus Rusanu

2
Bu, birim / fonksiyonel testleri, kırılma değişikliklerini tespit etmenin tek güvenilir yolu haline getirir.
Remus Rusanu

1
Hızlı bir kontrol için Visual Studio Veritabanı Projeleri herhangi bir değişikliği doğrulamak oldukça iyi bir iş yapar.
Remus Rusanu

4

Bu geçici bir çözümdür, ancak veritabanı için CREATE PROCEDURE komut dosyalarını (sağ tıklama veritabanı -> görevler -> komut dosyaları oluştur) oluşturabilir, CREATE PROCEDURE öğesini ALTER PROCEDURE ile bulup değiştirebilirsiniz ve sonra ayrıştırabilirsiniz.

Umarım burada daha iyi bir cevap alırsınız - Ben de ilgileniyorum! :)


Cevabınızı kabul edilmiş olarak işaretlemiyorum çünkü hala daha temiz bir çözüm (umarım yazılabilir bir çözüm) umuyorum, ama kesinlikle + 1'imi alıyorsunuz! Teşekkürler.
Brann


Oluşturulan komut dosyası yaklaşık 30 bin satırdan daha büyükse bu yaklaşım işe yaramaz. Bunu bilmekten nefret ediyorum ..
Eonasdan

3

Sql Server Veri Araçları'nı (SSDT) ​​kullanabilirsiniz. Microsoft Visual Studio, bir Sql Server projesi oluşturmanıza izin verir. Biri daha sonra veritabanını projeye alır ve sonra projeyi oluşturur. Herhangi bir bozuk saklı yordam veya nesne varsa, bir derleme hatası alırsınız.


SSDT projesinden kolayca yeni bir veritabanı oluşturma komut dosyası oluşturabileceğinizi ve şema değişiklikleri nedeniyle kırık hiçbir procs / tetikleyici / vb olmadığını gösteren oldukça kapsamlı bir doğrulama olacak bir test ortamında çalıştırabileceğinizi ekleyeceğim.
AaronLS

3

T-SQL saklı yordamları doğrulamak için güvenilir bir yol arıyorum bu SO sorusuna bakmak isteyebilirsiniz . Biri var mı? bu aslında aynı şeyi birkaç cevapla soruyor.

Alaa Awad yayınlanan komut dosyası üzerine inşa etmek için ... bu başvurulan ve başvuru nesnelerinin şemasını ve veritabanını göstermelidir. sys.sql_expression_dependenciesTakma adlar (bazen kullanırken görünen), UDTT parametreleri veya diğer dinamik özellikler aracılığıyla çok sayıda geçici tablo kullanıyorsanız, işlevlerini kullanmanız gerekebilir sys.dm_sql_referenced_entitiesveya sys.dm_sql_referencing_entitiesbunun yerine / de kullanabilirsiniz.

SELECT
    DB_NAME() + '.' + OBJECT_SCHEMA_NAME(sed.referencing_id) + '.' + OBJECT_NAME(sed.referencing_id) AS [referencingObject],
    isnull(sed.referenced_server_name + '.', '') + isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies sed
WHERE 
    sed.is_ambiguous = 0
    AND OBJECT_ID(isnull(sed.referenced_database_name + '.', DB_NAME() + '.') + isnull(sed.referenced_schema_name + '.', OBJECT_SCHEMA_NAME(sed.referencing_id) + '.') + sed.referenced_entity_name) IS NULL
ORDER BY
    [referencingObject], [missingReference]

1
Bunları where yantümcesine eklemelisiniz: / * Varolan bir UserType değil / VE sed.referenced_entity_name NOT IN (sys.types'TEN [ad] 'ı SEÇIN) / Takma ad değil * / AND sed.referenced_schema_name NULL DEĞİL
JasonBluefire

1

sql server 2008'e eklenen sys.sql_expression_dependencies kullanın

CREATE PROCEDURE [dbo].[spMaintenance_Find_Broken_Dependencies]

AS
SELECT
    OBJECT_NAME(referencing_id) AS [referencingObject],
    referenced_entity_name AS [missingReference]
FROM 
    sys.sql_expression_dependencies
WHERE 
    is_ambiguous = 0
    AND OBJECT_ID(referenced_entity_name) IS NULL
ORDER BY 
    OBJECT_NAME(referencing_id), referenced_entity_name

GO

Bu yararlı olabilir, ancak şemanın da dikkate alınması gerektiği kadar basit değildir. Ayrıca sys.sql_expession_dependencies açıkçası object_id () sınamasında başarısız gerçek bağımlı tablo yerine kullanılan diğer adı görüntülüyor sorunları alıyorum. Son olarak saklı yordamlara parametre olarak iletilen kullanıcı tanımlı tabloları getirir - ki bu gerçekten yararlı değildir.
Tabloo Quijico
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.