İÇİNDEKİLER
- •Şema değişikliği planlıyor musunuz?
- •Yöntem 1: Tabloyu Kim Kullanıyor? (sys.dm_sql_referencing_entities)
- •Yöntem 2: Bağımlılık Kataloğu (sys.sql_expression_dependencies)
- •Kolon Düzeyinde: Hangi Nesne Hangi Kolonu Kullanıyor?
- •Yöntem 3: Metin Araması (sys.sql_modules)
- •Bağımlılık Bilgisi Neden Eksik Olabilir?
- •Değişiklik Öncesi Kontrol Listesi
- •Şema değişikliklerini sürprizsiz yapın
Bir tablodaki kolonu yeniden adlandırmadan, tipini değiştirmeden ya da tabloyu kaldırmadan önce sorulması gereken soru basittir: bu tabloyu hangi stored procedure’ler, view’lar, fonksiyonlar ve trigger’lar kullanıyor? Yanlış cevap, değişikliğin ancak canlıda bir rapor ya da gece job’ı hata verdiğinde fark edilmesi demektir.
SQL Server bu soruyu yanıtlamak için birden fazla yol sunar ve her birinin kör noktaları vardır. Bu rehberde bağımlılık bilgisini doğru okumayı, metin aramasıyla nasıl tamamlayacağınızı ve hangi durumlarda hiçbir yöntemin size tam cevap veremeyeceğini anlatıyoruz.
Şema değişikliği planlıyor musunuz?
Aryasoft, değişikliğin etkileyeceği tüm nesneleri bağımlılık analiziyle çıkarır, riskleri önceden belirler ve geçişi kesintisiz planlar.
Yöntem 1: Tabloyu Kim Kullanıyor? (sys.dm_sql_referencing_entities)
Bir tabloya başvuran tüm nesneleri bulmanın en doğrudan yolu sys.dm_sql_referencing_entities fonksiyonudur. Tablo adını şemasıyla birlikte verin:
SELECT re.referencing_schema_name,
re.referencing_entity_name,
o.type_desc
FROM sys.dm_sql_referencing_entities(N'dbo.Siparis', N'OBJECT') AS re
JOIN sys.objects AS o ON o.object_id = re.referencing_id
ORDER BY o.type_desc, re.referencing_entity_name;
Sonuçta stored procedure’ler, view’lar, fonksiyonlar ve trigger’lar listelenir. Bu fonksiyon yalnızca aynı veritabanındaki nesneleri döndürür.
Yöntem 2: Bağımlılık Kataloğu (sys.sql_expression_dependencies)
sys.sql_expression_dependencies, bir veritabanındaki tüm isimle yapılan bağımlılıkları tutar ve başka veritabanlarına yapılan başvuruları da içerir. Bir tabloyu kullanan nesneleri, başka bir veritabanından gelen başvurularla birlikte görmek için:
SELECT OBJECT_SCHEMA_NAME(d.referencing_id) AS referencing_schema,
OBJECT_NAME(d.referencing_id) AS referencing_object,
o.type_desc,
d.referenced_database_name,
d.referenced_schema_name,
d.referenced_entity_name,
d.is_ambiguous
FROM sys.sql_expression_dependencies AS d
JOIN sys.objects AS o ON o.object_id = d.referencing_id
WHERE d.referenced_entity_name = N'Siparis'
ORDER BY referencing_object;
Bu sorguyu, tabloyu başka veritabanlarından kullanan nesneleri yakalamak için diğer veritabanlarında da çalıştırın; referenced_database_name dolu satırlar çapraz veritabanı başvurularıdır. Tüm veritabanlarında dönmek için cursor rehberimizdeki döngü kalıplarını kullanabilirsiniz.
Kolon Düzeyinde: Hangi Nesne Hangi Kolonu Kullanıyor?
Bir kolonu değiştirmeden önce asıl soru, o kolonu kimin kullandığıdır. sys.dm_sql_referenced_entities, bir nesnenin başvurduğu tablo ve kolonları döndürür. Tabloyu kullanan nesneleri bulup her biri için kolon düzeyinde kontrol edebilirsiniz:
DECLARE @Table sysname = N'Siparis', @Column sysname = N'MusteriNo';
SELECT DISTINCT
OBJECT_SCHEMA_NAME(d.referencing_id) + N'.' + OBJECT_NAME(d.referencing_id) AS referencing_object,
re.referenced_minor_name AS column_name
FROM sys.sql_expression_dependencies AS d
CROSS APPLY sys.dm_sql_referenced_entities(
OBJECT_SCHEMA_NAME(d.referencing_id) + N'.' + OBJECT_NAME(d.referencing_id), N'OBJECT') AS re
WHERE d.referenced_entity_name = @Table
AND re.referenced_entity_name = @Table
AND re.referenced_minor_name = @Column;
Geçersiz hale gelmiş bir nesne (örneğin artık var olmayan bir kolona başvuran bir procedure) bu sorguda hata üretebilir. Böyle bir hata, değişiklikten önce düzeltilmesi gereken bozuk bir nesneyi zaten işaret eder.
Yöntem 3: Metin Araması (sys.sql_modules)
Bağımlılık katalogları dinamik SQL’i göremez. EXEC('SELECT ... FROM Siparis') ya da sp_executesql ile çalıştırılan sorgular metin içinde geçtiği için yalnızca kaynak koduna bakarak bulunabilir:
SELECT OBJECT_SCHEMA_NAME(m.object_id) AS schema_name,
OBJECT_NAME(m.object_id) AS object_name,
o.type_desc
FROM sys.sql_modules AS m
JOIN sys.objects AS o ON o.object_id = m.object_id
WHERE m.definition LIKE N'%Siparis%'
ORDER BY o.type_desc, object_name;
Metin araması geniş bir ağ atar: SiparisDetay gibi benzer adları ve yorum satırlarını da yakalar. Sonuçları bağımlılık sorgusuyla karşılaştırın; yalnızca metin aramasında çıkan nesneler genellikle dinamik SQL kullanan ya da yanlış pozitif olan nesnelerdir. Alt çizgi gibi LIKE joker karakterleri içeren adlarda karakteri köşeli parantezle kaçırın.
Uyarı
Hiçbir veritabanı yöntemi, uygulama kodundaki, ORM’lerdeki, SSIS paketlerindeki, Power BI ve raporlama kaynaklarındaki ya da linked server üzerinden gelen sorguları göremez. Kritik bir kolonu değiştirmeden önce bir süre Extended Events veya Query Store ile tabloya gerçekten hangi sorguların geldiğini izlemek, bu kör noktayı kapatmanın en güvenilir yoludur.
Bağımlılık Bilgisi Neden Eksik Olabilir?
- Ertelenmiş ad çözümleme: Bir procedure, başvurduğu tablo henüz yokken oluşturulabilir. Bu durumda bağımlılık kaydı eksik ya da belirsiz (
is_ambiguous) olabilir. - Şema belirtilmeyen başvurular:
dbo.yazılmadan yapılan başvurular, çağıranın varsayılan şemasına göre çözüldüğü için belirsiz kalabilir. - Dinamik SQL: Hiçbir zaman bağımlılık olarak kaydedilmez.
- Synonym’ler: Bağımlılık synonym’e kaydedilir; synonym’in gösterdiği tabloyu ayrıca kontrol edin.
İpucu
Eksik ya da eskimiş bağımlılık kayıtlarını yenilemek için ilgili nesnelerde sys.sp_refreshsqlmodule çalıştırabilirsiniz. Bu komut nesnenin meta verisini günceller ve geçersiz hale gelmiş nesneleri hata vererek ortaya çıkarır; bu yüzden önce test ortamında çalıştırın.
Not
sp_depends ve sys.sql_dependencies kullanımdan kaldırılmıştır ve yeni kodda kullanılmamalıdır. SSMS’teki View Dependencies ekranı da aynı katalog bilgisini gösterir; dinamik SQL’i o da göremez.
Değişiklik Öncesi Kontrol Listesi
- Tabloyu kullanan nesneler
sys.dm_sql_referencing_entitiesile listelendi. - Kolon değişikliğinde kolon düzeyinde bağımlılık kontrol edildi.
- Dinamik SQL için
sys.sql_modulesmetin araması yapıldı. - Diğer veritabanlarındaki çapraz başvurular kontrol edildi.
- Uygulama, ETL ve raporlama tarafındaki kullanım ilgili ekiplerle doğrulandı.
- Değişiklik önce test ortamında, etkilenen tüm nesneler derlenerek denendi.
İlgili Yazılar
SQL Server Danışmanlığı
Şema değişikliklerini sürprizsiz yapın
Aryasoft’un kıdemli DBA ekibi bağımlılık analizi, iş yükü izleme ve test planıyla değişikliğin etkisini önceden ortaya koyar; geçişi kesintisiz ve geri alınabilir şekilde planlar.