Ana içeriğe atla

Dinamik SQL: Teknikler, Güvenlik ve Optimizasyon

Dinamik SQL’in esnek mantıkla çalışma zamanında sorgu yürütmesini nasıl sağladığını görün. Yürütme yöntemlerini, güvenlik ve performans ipuçlarını ve pratik kullanım örneklerini keşfedin.
Güncel 3 Eki 2026  · 9 dk. oku

Yapay Zeka ile Keşfedin

ChatGPTClaudePerplexity

Bu rehberde, dinamik SQL’in temel yönlerini; dinamik sorgular oluşturma ve yürütme için gerekli teknikleri, kullanım alanlarını, güvenlik hususlarını, performans optimizasyonu stratejilerini ve yaygın kullanım örneklerini açıklayacağım.

Dinamik SQL heyecan vericidir çünkü çalışma zamanında SQL ifadelerinin oluşturulmasına ve yürütülmesine olanak tanıyan güçlü bir tekniktir. Dinamik SQL, geliştiricilerin yürütme sırasında farklı girdilere, koşullara ve mantığa tepki verebilen daha esnek ve uyarlanabilir sorgular yazmasını sağlar.

SQL’e yeni başlıyorsanız, sağlam bir temel oluşturmak için Introduction to SQL veya Intermediate SQL kurslarımızla başlamayı düşünebilirsiniz. Ayrıca, indirilebilir SQL Basics Cheat Sheet belgesini de faydalı bir başvuru olarak görüyorum, çünkü en yaygın SQL işlevlerinin tümünü içerir.

Dinamik SQL Nedir?

Dinamik SQL, önceden sabitlenmek yerine çalışma zamanında oluşturulan ve yürütülen SQL ifadelerini ifade eder. Bu yöntem, program yürütülmesi sırasında tanımlanan değişken girişlere veya mantığa dayalı olarak SQL sorguları oluşturup çalıştırmanın bir yolunu sunar.

Dinamik SQL’de, SQL ifadelerini metin olarak oluşturur ve özel yürütme işlevleri veya yapıları kullanarak çalıştırırsınız. Doğrudan koda gömülen ve önceden tanımlanan statik SQL’in aksine, dinamik SQL; tablo adları, filtre koşulları veya sıralama mantığı gibi sorgu yapılarının çalışma zamanında belirlenmesine olanak tanıyarak daha fazla esneklik sunar. Bu da, sorgu gereksinimlerinin uygulama çalışana kadar bilinmediği senaryolar için onu çok yönlü bir araç haline getirir.

Neden Dinamik SQL Kullanılır?

Modern uygulamalar sıklıkla değişen iş ihtiyaçlarına ve kullanıcı güdümlü mantığa uyum sağlayabilen veritabanı sorgularına ihtiyaç duyar. Dinamik SQL, daha duyarlı ve özelleştirilebilir veritabanı etkileşimlerini mümkün kılmada önemlidir.

Dinamik SQL’in yaygın kullanım alanları arasında isteğe bağlı filtrelerle rapor üretmek, özelleştirilebilir parametrelere sahip arama arayüzleri kurmak, tekrarlayan veritabanı görevlerini otomatikleştirmek ve tablolar ile indeksler gibi nesneleri programatik olarak yönetmek yer alır. Bu yaklaşım, geliştiricilerin daha güçlü ve uyarlanabilir uygulamalar yazmasına imkan tanıyarak sabit kodlanmış mantığa duyulan ihtiyacı azaltır. Değişen gereksinimleri karşılayıp kullanıcı güdümlü davranışı destekleyerek, esnekliğin, otomasyonun ve veri odaklı karar vermenin öncelik olduğu ortamlarda dinamik SQL önemli bir rol oynar.

Dinamik SQL ve Statik SQL

Statik ve dinamik SQL arasındaki farkları anlamak, doğru yaklaşımı seçmek için önemlidir. Aşağıda, sorgularınızı yürütürken bu yöntemlerden birini seçmeden önce bilmeniz gereken temel ayrımlar yer alır.

Temel farklar

Statik SQL ifadeleri sabit kodlanmıştır ve çalışma zamanında değişmez. Bir veri analisti için bu, ifadelere öngörülebilir performans ve daha kolay bakım anlamına gelir. Dinamik SQL ise çalışma zamanında oluşturulup yürütülür; daha fazla esneklik sunsa da artan karmaşıklık ve potansiyel güvenlik riskleri getirir. Bu farkları aşağıdaki tabloda özetledim.

Özellik

Statik SQL

Dinamik SQL

Tanım

Koda gömülü, önceden tanımlanmış SQL ifadeleri.

SQL ifadeleri çalışma zamanında oluşturulur ve yürütülür.

Esneklik

Sınırlı; değişiklikler kod güncellemeleri ve yeniden dağıtım gerektirir.

Son derece esnek; çalışma zamanında değişen gereksinimlere ve kullanıcı girdilerine uyum sağlar.

Güvenlik

Daha güvenli; sorgular sabit kodlandığı ve derleme zamanında doğrulandığı için SQL enjeksiyonuna daha az yatkındır.

Daha yüksek risk; kullanıcı girişi uygun şekilde temizlenmezse SQL enjeksiyonuna karşı savunmasızdır.

Performans

Daha hızlı; önceden derlenmiş ve optimize edilmiştir, bu da daha düşük ek yük sağlar.

Daha yavaş; çalışma zamanında derlenir, bu da kaynak ek yüküne ve verimlilikte azalmaya yol açabilir.

Bakım

Hata ayıklaması ve bakımı daha kolaydır.

Okunması ve sorun gidermesi daha zor olabilir.

Ne zaman dinamik SQL tercih edilir

Sorgu yapısının çalışma zamanına kadar belirlenemediği veya yüksek esneklik gerektiren durumlarda dinamik SQL tercih edilir. Bunlara şunlar dahildir:

  • Dinamik raporlama: Sütunları, filtreleri veya sıralama düzenlerini çalışma zamanında seçmeniz gerektiğinde.

  • Değişken veritabanı nesneleri: Çok kiracılı uygulamalarda veya zaman bölümlü tablolara sahip veri ambarlarında olduğu gibi tablo veya sütun adlarının dinamik olarak belirlendiği durumlarda.

  • Karmaşık arama ve filtreleme: Gelişmiş arama özelliklerinin, birden çok kullanıcı tanımlı kritere göre sorguların birleştirilmesini gerektirdiği durumlarda.

  • DDL ifadelerinin yürütülmesi: Birçok platformda statik SQL ile gerçekleştirilemeyen CREATE, DROP, GRANT veya ALTER gibi işlemler için.

Bununla birlikte, dinamik senaryolarda statik SQL kullanmanın sınırlamaları şunları içerir:

  • Çalışma zamanında sorgu yapısındaki veya veritabanı nesnelerindeki değişiklikleri ele alamama.
  • Benzer birden çok sorguya ihtiyaç duyulduğunda artan kod tekrarları.
  • Kullanıcı güdümlü mantığa uyum sağlayamama, uygulama esnekliğini azaltır.

SQL Server, PostgreSQL ve Oracle’da Dinamik SQL

Dinamik SQL’i yürütmek, sorgu metinlerinin oluşturulmasını ve bunları güvenli ve verimli şekilde çalıştırmak için uygun veritabanı işlevlerinin kullanılmasını içerir. Bu bölümde, temel yöntemleri ve dinamik yürütme için en iyi uygulamaları özetliyorum.

EXEC komutunun kullanımı

Çoğu veritabanı platformu, dinamik SQL’i çalıştırmak için EXEC veya EXECUTE komutu sağlar.

Örneğin, aşağıdaki sorgu SQL Server’da dinamik SQL çalıştırır; ancak parametreleştirmeyi desteklemez, bu da SQL enjeksiyonu riskini artırır.

-- Declare a variable to hold the SQL statement
DECLARE @sql NVARCHAR(MAX)

-- Build dynamic SQL with a WHERE condition for Department = 'Sales'
SET @sql = 'SELECT * FROM Employees WHERE Department = ''Sales'''

-- Execute the dynamic SQL
EXEC(@sql)

Introduction to SQL Server ve Intermediate SQL Server kurslarımızı alarak SQL Server’da veri işlemenin inceliklerini öğrenmenizi öneririm.

PostgreSQL için, EXECUTE komutu bir PL/pgSQL kod bloğu içinde, örneğin bir fonksiyon veya DO bloğu içinde kullanılmalıdır. Örneğin:

-- Executes a static SQL string using dynamic SQL (PL/pgSQL context)
DO $
BEGIN
  EXECUTE 'SELECT * FROM employees';
END;
$;

Oracle’da, EXECUTE IMMEDIATE bir SELECT ifadesinden, INTO veya imleçlerle birlikte kullanılmadıkça, doğrudan sonuç kümesi döndüremez.

-- Executes a dynamic SQL statement (usually DML or DDL) at runtime
DECLARE
  v_count NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM employees' INTO v_count;
  DBMS_OUTPUT.PUT_LINE(v_count);
END;

sp_executesql ve muadillerinin kullanımı

SQL Server, dinamik SQL’i parametrelerle yürütmenize olanak tanıyan, güvenliği ve performansı artıran sp_executesql adlı saklı yordamı sunar:

-- Declare variables to hold SQL command and parameter value
DECLARE @sqlCommand NVARCHAR(1000)
DECLARE @city NVARCHAR(75)

-- Set parameter value
SET @city = 'London'

-- Build parameterized dynamic SQL query
SET @sqlCommand = 'SELECT * FROM Person.Address WHERE City = @city'

-- Execute the query safely using sp_executesql with parameter definition and binding
EXECUTE sp_executesql @sqlCommand, N'@city NVARCHAR(75)', @city = @city

Diğer veritabanları, SQL enjeksiyonu riskini azaltmak ve sorgu planı yeniden kullanımına izin vermek için benzer yapılar kullanır. Örneğin,

  • Oracle: EXECUTE IMMEDIATE

  • PostgreSQL: PL/pgSQL içinde EXECUTE

Parametreleştirilmiş sorguların güvenli kullanımı

Parametreli yürütme, sorgu mantığını kullanıcı girdisinden ayırarak SQL enjeksiyonunu önler. Örneğin, aşağıdaki sorgu parametreleme sağlamak için sp_executesql kullanır.

-- Declare a variable to hold the dynamic SQL query and initialize Employee ID
DECLARE @sql NVARCHAR(MAX), @empId INT = 1001;

-- Build parameterized SQL query using a named parameter (@ID)
SET @sql = 'SELECT * FROM Employees WHERE EmployeeID = @ID';

-- Execute the SQL query securely using sp_executesql with parameter declaration and binding
EXEC sp_executesql @sql, N'@ID INT', @ID = @empId;

Dinamik SQL İfadesi Nasıl Oluşturulur

Artık dinamik SQL sorgularını yürütmenin farklı yöntemlerini öğrendiğinize göre, dinamik SQL komutunun nasıl oluşturulup yürütüleceğine dair bir örnek üzerinden adım adım ilerleyelim. Aşağıdaki sorgular SQL Server’da yürütülmektedir.

Adım 1: Değişkenleri tanımlayın

Department sütununda 'Sales' değerine göre Employees tablosundaki satırları dinamik olarak filtrelemek için değişkenleri ayarlayın.

-- Prepare dynamic SQL variables to filter the Employees table
DECLARE @tableName NVARCHAR(100) = 'Employees';
DECLARE @filterColumn NVARCHAR(100) = 'Department';
DECLARE @filterValue NVARCHAR(100) = 'Sales';
DECLARE @sql NVARCHAR(MAX);

Adım 2: SQL ifadesini oluşturun

Belirli bir sütunun bir değerle eşleştiği kayıtları, belirtilen bir tablodan seçen parametreli bir dinamik SQL sorgusu oluşturun.

-- Construct a safe dynamic SQL query with table and column names 
-- Use QUOTENAME to prevent injection.
SET @sql = 
  'SELECT * FROM ' + QUOTENAME(@tableName) + 
  ' WHERE ' + QUOTENAME(@filterColumn) + ' = @val';

Adım 3: Bir parametreyle yürütün

Şimdi dinamik SQL sorgusunu, @val parametresi filtre değeri 'Sales' ile güvenli biçimde bağlanmış şekilde yürütün.

-- Execute the dynamic query with @val parameter securely passed as 'Sales'.
EXEC sp_executesql @sql, N'@val NVARCHAR(100)', @val = @filterValue;

Sorguların optimize edilmesi için SQL fonksiyonlarının yapısını ve sıralamasını anlamak adına kursumuzu öneririm: Writing Functions and Stored Procedures in SQL Server.

Güvenlik Hususları ve Azaltma Stratejileri

Dinamik SQL esneklik sağlasa da özellikle SQL enjeksiyonu ile ilgili artan riskler de getirir. Yaygın güvenlik açıklarını ve dinamik SQL kullanımını koruma altına almak için en iyi uygulamaları ele alalım.

SQL enjeksiyonu zafiyetleri

Metin temelli dinamik SQL, kötü amaçlı girdinin bir sorgunun amaçlanan mantığını değiştirdiği SQL enjeksiyonuna özellikle açıktır. Saldırganlar, kötü yapılandırılmış SQL’den yararlanarak verileri manipüle edebilir, hassas bilgileri çıkarabilir veya veritabanı bütünlüğüne zarar verebilir.

Örneğin, aşağıdaki sorgu, kullanıcı girdisini parametreleştirme olmadan doğrudan SQL metnine eklediği için SQL enjeksiyonuna karşı savunmasızdır.

DECLARE @sql NVARCHAR(MAX) = 'SELECT * FROM Users WHERE Username = ''' + @input + '''';
EXEC(@sql);
-- If @input = 'admin' OR '1'='1', this returns all users.

Derinlemesine savunma yaklaşımları

Aşağıdakiler, dinamik SQL sorgularınız için güvenlik önlemlerinin yerinde olmasını sağlama yöntemleridir:

  • Parametreleştirme: Parametreli sorgular kullanmak en etkili savunmadır. Kullanıcı girdisinin, çalıştırılabilir kod değil, sadece veri olarak ele alınmasını sağlar.

  • Nesne temizliği: Tablo veya sütun adlarının dinamik olması gerektiğinde, bunları bilinen izinli listelere göre doğrulayın ve enjeksiyonu önlemek için QUOTENAME() gibi işlevler kullanın.

  • Asgari ayrıcalık ilkesi: Dinamik SQL için kullanılan hesapların yalnızca gerekli en az erişime sahip olmasını sağlamak üzere veritabanı kullanıcı izinlerini kısıtlayın. Bu, bir güvenlik açığından yararlanılması halinde olası zararı sınırlar ve yetkisiz veri ifşası veya değişikliği riskini azaltır.

  • Girdi doğrulama: SQL ifadelerinde kullanmadan önce kullanıcı girdilerini her zaman beklenen biçim ve değerlere göre doğrulayın ve sınırlandırın. Uymayan girdileri reddedin veya temizleyin; böylece saldırı yüzeyi daha da küçülür.

Performans Optimizasyonu Teknikleri

Dinamik SQL, çalışma zamanında derleme ve plan üretimi nedeniyle performans ek yüküne yol açabilir. Dinamik SQL sorgularınızın performansını artırmak için aşağıdaki sorgu optimizasyonu tekniklerini öneririm.

Plan önbellekleme ve yeniden kullanma

Dinamik SQL yürütüldüğünde, veritabanı motoru, tekrarlanan sorgular için yürütme planını önbelleğe alarak performansı iyileştirebilir. Ancak plan yeniden kullanımı, her seferinde benzersiz SQL metinleri oluşturmak yerine sorgular parametreleştirildiğinde en etkilidir.

Parametrelerle sp_executesql gibi yapıları kullanmak, veritabanının benzer sorguları tanımasını ve yürütme planlarını yeniden kullanmasını sağlar; bu da derleme ek yükünü azaltır ve verimliliği artırır. SQL Server, karmaşık senaryolarda optimizasyonu ve yürütme planlarını iyileştirmek için dinamik SQL’e plan kılavuzlarının (plan guides) eklenmesine izin verir.

Toplu (batch) optimizasyonu

Birden çok işlemi tek bir yürütme paketinde birleştirmek, uygulama ile veritabanı arasındaki gidiş-dönüş sayısını azaltarak işlemsel ek yükü düşürür ve verimi artırır.

Bakım ve Hata Ayıklama Stratejileri

Çalışma zamanı doğası nedeniyle, dinamik SQL’in bakımı ve hata ayıklaması statik SQL’e göre daha karmaşık olabilir. Görünürlüğü, izlenebilirliği ve güvenilirliği artırmak için günlükleme ve hata yakalama konusunda pratik stratejiler aşağıdadır.

Yürütme günlükleme

Dinamik SQL’in yürütülmesinin kaydedilmesi hem denetim hem de sorun giderme için önemlidir. Özellikle çalışma zamanında oluşturulan SQL ifadelerinin birebir kaydedilmesi; performans darboğazlarını, beklenmedik mantığı ve güvenlik sorunlarını belirlemeye yardımcı olur. Uygun günlükleme stratejileri için şu uygulamaları izleyin:

  • Denetim izleri: Denetim tabloları veya tetikleyiciler gibi günlükleme mekanizmalarının uygulanması, dinamik SQL yürütmelerini ve veri değişikliklerini kaydetmeye yardımcı olur. 
  • Sorun giderme: Yürütülen SQL ifadelerini, giriş parametrelerini, yürütme sürelerini ve kullanıcı bilgilerini depolayarak ekipler hataların kaynağını, performans darboğazlarını veya yetkisiz erişimi daha kolay tespit edebilir.
  • Performans izleme: Yürütme günlükleri, yavaş çalışan sorguları, sık yürütülen kalıpları veya kaynak yoğun işlemleri tespit etmek üzere analiz edilebilir; bu da proaktif performans ayarını destekler.

Hata yakalama

Dinamik SQL yürütmesi, hataları yakalamak ve bunlara zarifçe yanıt vermek için sağlam bir hata yakalama mantığıyla sarmalanmalıdır. Örneğin, aşağıdaki sorgu yararlı tanılama bilgilerini bir tabloya kaydeder.

BEGIN TRY
    -- Attempt to execute the parameterized dynamic SQL
    EXEC sp_executesql @sql, @paramDef, @paramVal;
END TRY
BEGIN CATCH
    -- On error, log the message, line, and procedure name with timestamp into ErrorLog table
    INSERT INTO ErrorLog (ErrorMessage, ErrorLine, ErrorProcedure, LoggedAt)
    VALUES (ERROR_MESSAGE(), ERROR_LINE(), ERROR_PROCEDURE(), GETDATE());
END CATCH;

Ayrıca hata yakalama için şu uygulamaları düşünün:

  • Her zaman tam hata bağlamını yakalayın: mesaj, satır numarası, yordam ve zaman damgası.
  • Hataları, onları tetikleyen tam SQL ile ilişkilendirmek için günlükleri kullanın.
  • Canlı sistemlerde, kaydedilen hatalara dayalı uyarı mekanizmalarını değerlendirin.

Sonuç

Dinamik SQL’den tam anlamıyla yararlanmak için geliştiricilerin güçlü güvenlik uygulamaları benimsemesi gerekir. Performans da plan yeniden kullanımı, toplulaştırma ve yürütme günlüklemesiyle dikkatle yönetilmelidir. Ayrıca, statik SQL’in güvenliği ve hızı ile dinamik SQL’in uyarlanabilirliğini dengeleyen bir yaklaşımı düşünün.

İleriye baktığımızda, daha akıllı yürütme planları ve gelişmiş SQL çalışma zamanı özellikleri gibi veritabanı motorlarındaki iyileştirmeler, dinamik SQL’i daha verimli, güvenli ve ölçekli olarak yönetimi kolay hale getirmeyi vaat ediyor. Bir sonraki adım olarak, Associate Data Analyst in SQL kariyer yolumuzu alın ve SQL’in eş buluşçusunun yer aldığı şu bölüm gibi harika bölümler içeren DataFramed podcast’ine abone olun: Don Chamberlin ile SQL’in 50 Yılı.


Allan Ouko's photo
Author
Allan Ouko
LinkedIn
Veri analitiği, iş zekâsı ve veri bilimi alanlarında pratik deneyime sahip Veri Bilimi Teknik Yazarı. SQL, Python, Power BI, Databricks ve veri mühendisliği üzerine, gerçek dünya analitik çalışmalarına dayanan, uygulamaya dönük ve sektöre odaklı içerikler yazıyorum. Yazılarım teknik derinlikle iş etkisi arasındaki köprüyü kurarak profesyonellerin veriyi güvenle karara dönüştürmelerine yardımcı olur.

Dinamik SQL SSS

Dinamik SQL statik SQL’den nasıl ayrılır?

Statik SQL, derleme zamanında sabit bir yapıyla belirlenir; dinamik SQL ise sorguları anlık olarak oluşturur, daha fazla esneklik sunar ancak dikkatli kullanım gerektirir.

Ne zaman dinamik SQL kullanmalıyım?

Sorgu yapısının çalışma zamanı koşullarına bağlı olduğu; değişken tablo adları, kullanıcı güdümlü filtreler veya statik SQL’in desteklemediği DDL ifadelerinin yürütülmesi gibi durumlarda dinamik SQL kullanın.

Hangi veritabanları dinamik SQL’i destekler?

Çoğu büyük veritabanı destekler: SQL Server (EXEC, sp_executesql), PostgreSQL (EXECUTE), Oracle (EXECUTE IMMEDIATE) ve MySQL (PREPARE).

Dinamik SQL’de SQL enjeksiyonunu nasıl önleyebilirim?

Girdileri doğrulamak için SQL Server’da sp_executesql gibi parametreli yürütme kullanın ve kullanıcı verisiyle doğrudan metin birleştirmekten kaçının.

Dinamik SQL performansı etkileyebilir mi?

Evet, dinamik SQL çalışma zamanında derleme nedeniyle ek yük getirebilir; ancak parametreleme ve plan önbellekleme performansı önemli ölçüde iyileştirebilir.

Konular
SQL

DataCamp ile SQL öğrenin

Kurs

PostgreSQL Özet İstatistikler ve Pencere Fonksiyonları

4 sa
131.2K
Analitik ve veri mühendisliği için pencere fonksiyonlarıyla sorgular oluşturmayı öğrenin; SQL’in gizli silahı!
Ayrıntıları GörüntüleRight Arrow
Kursa Başla
Devamını GörRight Arrow
İlgili

blog

Hızlı Sevkiyat İçin Pratik Vibe Kodlama Teknoloji Yığını

Ön uç, arka uç, veritabanları, kimlik doğrulama, depolama, e-posta, test, dağıtım ve izleme için en iyi araçları keşfedin.
Abid Ali Awan's photo

Abid Ali Awan

14 dk.

blog

2026’da En Popüler 40 Yazılım Mühendisi Mülakat Sorusu

Algoritmalar, sistem tasarımı ve davranışsal senaryoları kapsayan bu temel sorularla teknik mülakat sürecine hakim olun. Uzman cevapları, kod örnekleri ve kanıtlanmış hazırlık stratejileri edinin.
Dario Radečić's photo

Dario Radečić

15 dk.

Eğitim

.gitignore Nasıl Kullanılır: Örneklerle Pratik Bir Giriş

Git deponuzu temiz tutmak için .gitignore’u nasıl kullanacağınızı öğrenin. Bu eğitim; temelleri, yaygın kullanım durumlarını ve başlamanıza yardımcı olacak pratik örnekleri kapsar!
Kurtis Pykes 's photo

Kurtis Pykes

8 dk.

Eğitim

Python'da Listeyi String'e Nasıl Dönüştürürsünüz

Bu hızlı eğitimde, Python'da bir listeyi string'e nasıl dönüştüreceğinizi öğrenin.
Adel Nehme's photo

Adel Nehme

Devamını GörDevamını Gör