SORU
3 Aralık 2008, ÇARŞAMBA


Bir SQL stratejisinin tümcesi

Nasıl bir sorgu bu gibi bağımsız değişken bir dizi ile IN yan tümcesi, içeren stratejisinin mı?

select * from Tags 
where Name in ('ruby','rails','scruffy','rubyonrails')
order by Count desc

Bu sorgu, bağımsız değişkenleri her yerde 5 ila 1 arasında olabilir.

Bu (veya XML) için özel bir saklı yordam kullanmamayı tercih ederim, ama eğer biraz şık yolu SQL Server 2008, özgüyse olduğunu açığım.

CEVAP
3 Aralık 2008, ÇARŞAMBA


Parametrelerle ifade edebilirsinizherdeğeri, bir şey gibi:

string[] tags = new string[] { "ruby", "rails", "scruffy", "rubyonrails" };
string cmdText = "SELECT * FROM Tags WHERE Name IN ({0})";

string[] paramNames = tags.Select(
    (s, i) => "@tag"   i.ToString()
).ToArray();

string inClause = string.Join(",", paramNames);
using (SqlCommand cmd = new SqlCommand(string.Format(cmdText, inClause))) {
    for(int i = 0; i < paramNames.Length; i  ) {
       cmd.Parameters.AddWithValue(paramNames[i], tags[i]);
    }
}

Sana verecek:

cmd.CommandText = "SELECT * FROM Tags WHERE Name IN (@tag0,@tag1,@tag2,@tag3)"
cmd.Parameters["@tag0"] = "ruby"
cmd.Parameters["@tag1"] = "rails"
cmd.Parameters["@tag2"] = "scruffy"
cmd.Parameters["@tag3"] = "rubyonrails"

Hayır, Bu SQL injection açık değildir. CommandText içine sadece enjekte edilen metin kullanıcı girişi dayalı değildir. Bu tamamen kodlanmış dayalı "@tag" öneki ve bir dizi. dizin Dizinher zamanbir tamsayı, kullanıcı oluşturulur ve güvenlidir.

Girilen değerler, kullanıcının hala güvenlik açığı var hiç bu parametreleri içine doldurulmuş.

Düzenleme:

Enjeksiyon endişeleri bir kenara, bakım komut metin parametreleri (yukarıda) değişken sayıda engel karşılamak için inşa SQL server önbellek sorgular yararlanmak için yeteneği olduğunu unutmayın. Net sonuç neredeyse kesinlikle ilk etapta parametreleri sadece SQL içine yüklem dizeleri ekleme (farklı olarak) kullanarak değerini yitiriyor.

Önbelleğe alınan sorgu planlarını değerli değil, ama IMO bu sorgu neredeyse karmaşık değil ondan çok fayda görmek yeterli değil. Derleme maliyeti (hatta aşmak) yürütme maliyetleri yaklaşımı olsa da, hala milisaniye konuşuyorsun.

Eğer yeterli RAM varsa, SQL Server muhtemelen parametreleri ortak sayıları için bir plan önbelleği olacağını beklerdim. Sanırım sizin her zaman ekleyin beş parametre, belirtilmemiş etiketleri BOŞ sorgu planı olmalı aynı görünüyor, ama çok çirkin, bana ve pek emin degilim olurdu değerinde mikro-optimizasyon (olsa da, Yığın Taşması - çok iyi değer).

Ayrıca, SQL Server 7 ve sonraki parametreleri kullanarak performans açısından gerçekten gerekli değildir, ancak, bu yüzden 9**kritikgüvenlik açısından - özellikle bu gibi kullanıcı girilen veri ile.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BDGcustoms

    BDGcustoms

    24 NİSAN 2011
  • Damien Hayes

    Damien Hayes

    11 Mart 2008
  • Tech4Geeks

    Tech4Geeks

    8 Ocak 2012