Database table connected to several objects under a magnifying glass, representing finding stored procedures that use a table

SQL Server’da Bir Tabloyu Kullanan Stored Procedure’leri Bulmak: Doğru Çalışan Bağımlılık Sorguları

SQL Server’da bir tabloyu ya da kolonu kullanan tüm stored procedure, view, fonksiyon ve trigger’ları dinamik SQL ve çapraz veritabanı başvurularıyla birlikte bulmanın yolları ve kör noktaları.

Temmuz 18, 2023

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.

SQL Server Danışmanlığı

Ş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.

Destek Alın

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

  1. Tabloyu kullanan nesneler sys.dm_sql_referencing_entities ile listelendi.
  2. Kolon değişikliğinde kolon düzeyinde bağımlılık kontrol edildi.
  3. Dinamik SQL için sys.sql_modules metin araması yapıldı.
  4. Diğer veritabanlarındaki çapraz başvurular kontrol edildi.
  5. Uygulama, ETL ve raporlama tarafındaki kullanım ilgili ekiplerle doğrulandı.
  6. Değişiklik önce test ortamında, etkilenen tüm nesneler derlenerek denendi.
SELECT * FROM sys.dm_sql_referencing_entities(‘dbo.TabloAdi’, ‘OBJECT’) sorgusu tabloya başvuran procedure, view, fonksiyon ve trigger’ları döndürür. Dinamik SQL’i yakalamak için sys.sql_modules üzerinde metin araması da yapın.
Kullanımdan kaldırılmıştır. Yerine sys.dm_sql_referencing_entities, sys.dm_sql_referenced_entities ve sys.sql_expression_dependencies kullanılmalıdır.
Hayır. EXEC veya sp_executesql ile çalıştırılan sorgular bağımlılık olarak kaydedilmez; bunları yalnızca sys.sql_modules üzerinde metin aramasıyla bulabilirsiniz.
sys.dm_sql_referenced_entities, bir nesnenin başvurduğu kolonları referenced_minor_name alanında döndürür. Tabloyu kullanan nesneler için bu fonksiyonu çağırıp kolon adına göre filtreleyebilirsiniz.

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.

4.7/5