View Nedir?

Merhabalar makalem boyunca AdventureWorks database ini kullanarak view yapılarını anlatacağım .

Konumuza geçmeden önce sunu düşünelim bir view a neden ihtiyaç duyarız bize ne gibi bir faydası olur nelerden yararlanmamıza yardımcı olur .

Firmamızda MsSql veri tabanı üzerinde bulunan verilerimiz olsun ( mesela otomotiv firması ) Satış grubundaki personellerimiz sadece aracın marka - model - model uzantı - km - satış fiyatı ve ıskonto oranı seklinde bilgileri görmesini isteyelim .

Tablo yapısında düşünürsek alış fiyatı kar ve gerçek alıcının bilgilerinin o tablo üzerinde tutulduğunu varsayalım.

Satış elemanlarımızın o tablo üzerinde select sorgusu yetkisi olsa idi select * from Arac seklinde aracımızın yukarıda belirlediğimiz tüm verilerini görebilirdi.

İste bu gibi durumlarda bir view tanımlarız ve satış grubundaki personellerimize sadece bu kural için bu view üzerinde select sorgusu tanımlamasını veririz . Bu şekilde istediğimiz bicimde bilgiye ulaşmalarını sağlayabiliriz .

Diğer bir yandan parçalı bir tablo kullanıyoruz select sorgumuz çok kompleks ve çoğu yerde bunu çağırmak zorunda kalıyoruz . Bu sorgumuzu bir view a bağlar ve sadece view adından sorgumuzu çağırırız . En önemli olan nokta ise view kullanmadan kullanırsak herhangi küçük bir değişiklikte ( örneğin tabloya bir sütün daha ekleyip listeleyeceğiz ) tüm tanımladığımız yerlerden sorgumuzu düzeltmek zorunda kalırdık. View kullanarak oluşturulan sorgularda sadece o view üzerinden yapılan değişiklik tabiî ki tüm o view’ı kullanan sorgularımızı da etkileyecektir .

Uygulamamızda Türkçe İngilizce Japonca gibi farklı dillerde sorgularımızın adlarını değiştirip kullanmamız gerekir bu şekilde ve yukarıdaki şartlardan birini daha ekleyip düşündüğümüz zaman içinden çıkılmaz sorgular bizi beklemektedir. View tanımlayıp tüm bu dertlerden kurtulabiliriz .

Simdi en basit şekilde bir view oluşturalım . Örneğimizde AdventureWorks database i içerisinde Production.Product tablomuz dan yaralanalım .

Urunun ProductID - Name - ProductNumber - Color - ListPrice bilgilerini gösteren bir view oluşturalım .

Create view vw_urun_satis_grubu
(IdNumarası,Adı,UrunNumarası,Rengi,ListeFiyatı)
As
Select ProductId,Name,ProductNumber,Color,ListPrice from Production.Product

Seklinde bir view oluşturduk simdi oluşturduğumuz bu view ı inceleyelim . İlk olarak Create view vw_urun_satis_grubu seklinde bir view tanımlayacağımızı sisteme bildirmiş olduk artık sql server bizim bir view tanımlaması yapacağımızı bilir .
(IdNumarası,Adı,UrunNumarası,Rengi,ListeFiyatı) parantezleri arasına yazdıklarımız sütunların bizim belirlediğimiz isimleridir view çalıştığı zaman sütün isimleri bu şekilde karsımıza çıkacaktır ama burada dikkat etmemiz gereken en önemli nokta verilen sıraya uygun select cümleciklerinin yazılması dır . Eğer verilen seklin dışında select cümleciklerimiz yazılır ise tablo adları anlamsız olacaktır.

Yukarıda en basit hali ile bir view tanımlamadı yaptık . Şimdi bunu kullanalım.

Select * from vw_urun_satis_grubu

seklinde bir tanımlama da select ifademiz bizim view içerisinde belirttiğimiz sütunları getirecektir bu şekilde Production.Product tablomuz üzerinde herhangi bir erişim tanımlamasına gerek kalmadan direk olarak view üzerinden select sorgusu yapabilir seklinde bir tanımlama bizim işimizi çözülecek tir.

Simdi birde su şekilde örnek yapalım . Production.Produc tablomuzdaki ürünlerimizin sadece listPrice larının 40 dan büyük olanlarını ekrana bastıralım ve view içinde biraz datalarımızı eleme sekilerline gecelim .


select sorgusunun yanına where tanımı yapalım ve sadece select sorgumuzu değiştirelim.

select * from vw_urun_satis_grubu where ListeFiyatı>100

select sorgumuza where şartını ekledik ama burada dikkat etmemiz gereken çok küçük bir ayrıntı var . Eğer biz sorgumuzda ListPrice > 100 deseydik sql server hata verecekti . bunun nedeni view oluşum aşamasın da ListPrice sütununa ListeFiyatı olarak belirlememiz dir . Sql server sorguyu view üzerinden çalıştırdığı için base tablo üzerindeki sütun adına bakmaz eğer biz bir sütun tanımlaması yapmış isek.

View sorgularımız içerisinde bir çok hazır fonksiyon ve bizim yazdığımız store procedure leri kullanarak daha da ayrıntılı aramalar yapmamız sağlanır. Peki, Hangi tabloda hangi view tanımlı seklinde ki bir sorunun sonucuna nasıl ulaşırız.

Select * from INFORMATION_SCHEMA.VIEW_TABLE_USAGE


Yukarıdaki şekilde system view yapılarını kullanarak kendi database imiz içerisindeki view larımızın bir çok bilgisine erişebiliriz . Yukarıda database imiz de tanımlı olan view larımızın bir listesi verilmiştir . Bu listedeki en sıklıkla kullanacağımız iki sütun adı View Name ve Table Name kısmıdır burada hangi view hangi tablo üzerinde işlem görmüş bunu yakalarız.

Peki view oluşturduk ve daha sonra bu view için yazdığımız o kompleks sorgumuzu unuttuk ve bulamıyoruz uğraşmakta istemiyoruz view çalışıyor ama bu sorgu nerde bunu nasıl buluruz.

INFORMATION_SCHEMA.VIEWS : sistem view ını kullanarak view larımızın iç yapılarını görebiliriz.
View içindeki komutlarımız ada bu şekilde tekrar erişebiliriz.

Select * from INFORMATION_SCHEMA.VIEWS

Yukarıdaki tanımlamada da göründüğü gibi view larımız hakkında bilgi almak için sistem view larını kullanmak en kolay ve en hızlı çözümleri bize sunmuştur .

Sistem viewlarını biraz inceleyelim .

sys.databases : sql server üzerindeki tüm database lerimizin listesini ve özelliklerini verir .

sys.foreign_keys : Veritabanımız üzerindeki tanımladığımız foreign key lerimizin listesini özelliklerini verir .

sys.sql_logins : Bağlı olduğu database üzerinde login işlemi yapabilecek kullanıcıların listesini verir . Password kısımları hash li olarak gelir güvenlik nedeni ile …

sys.sysusers : Sql server içinde tanımlı olan sistem kullanıcılarının listesini verir . Password kısımları hash li olarak gelir guvenlik nedeni ile

sys.views : Bağlı olduğu tablonun view larının listesini verir .

INFORMATION_SCHEMA.CHECK_CONSTRAINTS : Bağlı olduğu tablonun check constraint lerinin listesini verir . bu listenin içinde CHECK_CLAUSE sütununda tanımladığımız kurallarımızı görebiliriz .

Daha fazlası için kendi database imiz veya herhangi bir database in views kısmından System.Views bölümünden sistem view larını görebilir deneyip sonuçlarını inceleyebiliriz .

Buraya kadar view oluşturduk kullandık peki su şekilde düşünelim öyle bir view yazmalıyız ki bizim yukarıda yaptığımız gibi insanlar bizim viewlarımızın kod kısmını görmesinler hangi tablolardan hangi veriler çektik nasıl isimlendirdik hiç bir bilgimiz gözükmesin . biz dahi göremeyelim . 

Simdi bir view oluşturalım HumanResources.Employee tablosu icerisindeki verilerden bize evli ve erkek olanların tüm bilgilerini versin .

Create view evliveerkekler
as
Select * from HumanResources.Employee where Gender = 'M' and MaritalStatus = 'M'

View ımızı oluşturalım ve bu view ımzın içerisinde barındırdığı select sorgusunu ilk önce bulalım . bakalım sql server bu view tanımını nerde nasıl tutuyor .

Select * from Information_schema.views

Seklinde viewlarımızın içerisini görebiliriz hangi select sorgusunu nasıl çalıştırdığını bulabiliriz. Biz bunu engellemek istiyoruz . bulunamasın sql server buna izin vermesin .
Tanımladığımız view larımızın başkası tarafından içersindeki sorgumuzun görülmesini istemiyor isek ENCRYPTION söz dizimi alter view [view adı ] dan sonra with deyimi ile kullanılır .

Alter view evliveerkekler
with ENCRYPTION
as
Select * from HumanResources.Employee where Gender = 'M' and MaritalStatus = 'M'

Artık Select * from Information_schema.views yordamını çalıştırdığımız zaman bu view imizin detayı yani içerdiği kod blokları gözükmeyecektir . Null olarak kalacaktır.

Not : Burada şuna çok dikkat etmek gerekir . eğer biz sorgumuzu veya herhangi bir sebep ile view imizi yeniden düzenleyecek isek bile with ENCRYPTION seklinde yinede kullanmalıyız Eğer ki kullanmaz isek sql server şifrelendirmeyi pasif hale düşürür . Kodlarımız yukarıda bahsettiğimiz gibi Select * from Information_schema.views komutu ile iç yapıları görünülür olur.

Oluşturduğumuz veya üzerinde gerekli yetkilerimiz olduğu bir view silmek icin Drop cümleciği kullanılır.

Drop view [view adı] seklinde yazılması yeterlidir . komut çalıştığı zaman belirttiğimiz view eğer yetkimiz tanımlanmış ise silinir .

View tanımladık dan sonra view lar üzerinde insert delete veya update gibi işlemlerde yapabiliriz . Ama bu işlemleri yapmadan önce belli baslı kriterlere uygun olup olmadığını kontrol etmemiz gereklidir .

İnsert update veya delete yapıcagımız view cagırdıgı tabloda not null degerlerinden birini dahi cekmiyor ise bu islemleri view uzerinden gerceklestiremeyiz . Kısaca ilsem yapıcagımız view base tarafda cagırdıgı tablo icerisindeki contraint index lere takılmaması gerekir .

Makalemiz boyunca adventureworks database ini kullanarak örnekler verdik ve view ların yapılarını çalışma prensiplerini anlamaya çalıştık.

Son olarak şunu tekrar söylemek view ların amaçları için daha uygun olur. Yetkilendirme işlemlerinde bir tablo üzerinden select sorgusu ile tüm datanın elde edilmesini istemiyor isek yetki vermek istediğimiz kullanıcımızı oluşturur daha sonra kullanıcımıza sadece tanımladığımız view üzerinden yetki verilir. Kullanıcımız ister sql üzerinden ister baksa bir programlama dili üzerinden sql server a kendisine verdiğimiz kullanıcı adı ve şifre ile bağlanacağı için sadece bizim tanımladığımız view üzerindeki yine bizim tanımladığımız işlemleri yapması sağlanır bu şekilde veri güvenliğimiz ide biraz sağlamış oluruz.

Kısaca verilerimizi view tanımlamalarımız sayesinde istediğimiz kullanıcılara kontrollü açmaktır .


bu makale yazgelistir.com'dan alınmıştır ve makale ekleme testi için buraya yazılmıştır.



kategori : Sql Server - tarih : 22/11/2009 - yazan : Cengiz Atilla



ASP.NET ve ASP

Bu dersimizde ASP.NET'e giriş amacıyla ASP ve ASP.NET'i karşılaştırıp ikisi arasındaki farklara göz atıp; ASP.NET ile gelen yenilikleri kavramsal olarak inceleyeceğiz.

ASP.NET ASP'nin devamı değildir ve yepyeni bir mantıkla sunucu taraflı web uygulamaları yapabileceğimiz, .NET'in sağladığı hemen hemen tüm güzel özelliklere erişimi olan bir platformdur.

i.) Programlama Dilleri Desteği: ASP.NET ile Jscript (Microsoft'un JavaScript'i), C#, VB.NET ve herhangi .NET uyumlu bir dille programlarımızı yazabiliriz. Artık VBscript diline ASP.NET'te ihtiyacımız yok. Diğer taraftan .NET'in gözde çocuğu C# benim kişisel tercihimdir. Çünkü C# tam anlamıyla Nesne yönelimli olarak doğan ve modern çağın programlama yaklaşımı olan Nesne yönelimli Programlamayı destekleyen güçlü ve verimli bir dildir.

ii.) ASP.NET Controls: Bir kısmı klasik HTMLform kontrollerinin ASP.NET platformu için yeniden yapılandırılmış halidir. Bunlar tam olarak üzerlerinde programcı mantığıyla çalışabilmemiz için nesne yönemli özellikler kazandırılmıştır. (İlerleyen derslerde bu konuyu derinlemesine işleyeceğiz.) Ayrıca Calender, AdRotator, ve Validation kontrolleri sayesinde aynı işi başaran ASP.NET kodumuz ASP koduna nazaran çok daha kısa ve etkili olacaktır.

iii.) Event Driven Programlama Modeli: Windows işletim sistemi Event Driven bir ortamdır. Eskiden programlardaki satırlar sıra ile çalıştırılırdı. Bunun yanında siz Windows'ta birşeyler yapmazsanız o hiçbir şey yapmadan durur,ancak siz fare ile bir yere tıklarsanız, veya bir metin kutusuna bir şeyler yazarsanız o sizin olayınıza karşı bir kod parçasını çalıştırır. ASP.NET bu şekilde kullanıcının yaptığı olaylara karşı cevap olarak çalışan bir sistem olarak programlanır. Yani ASP.NET sizin tam olarak ne yaptığınızı izler ve olaylarınıza uygun tepkiyi verir.

iv.) Kullanıcı Hakları seviyelendirilmesi ve yönetilmesi: ASP yazmış olanlar bilir bazen kullanıcılarımızı haklarına göre seviyelerine ayırırdık. Mesela bir öğernci takip programında danışman hoca sadece danışmanlığını yaptığı öğrencilerin kayıtlarına ulaşırken, bölüm başkanı tüm bölümdeki öğrencilerin kayıtlarına ulaşabilir. Böyle durumlarda kullanıcının girdiği veya girmeye çalıştığı sayfaların hepsinde kontrol(ler) yaparak kullanıcı gruplarını yönetirdik. Ama artık ASP.NET ile bu işi daha az kodla otomatik olarak yapabiliriz.

v.) Yüksek Oranda Ölçeklendirebilme: Amazon.com gibi yüksek ölçekli bir proje için birden fazla sunucuya ihtiyaç olacağı kesindir. Peki bu sunucuların arasında koordineyi başarı ile nasıl sağlayacağız. Projemizin Veri tabanı bir sunucuda, uygulama başka bir sunucuda veya kitap satışı yapan kısmı bir sunucuda ve CD satışı yapılan sunucuyu başka bir yerden çalıştırabiliriz. Bu gibi drumlarda ASP.NET dağınık web uygulama modelini çok daha iyi bir şekilde destekler. (Detayları ileride :-) )

vi.) Derlenmiş kod: ASP çoğumuzun bildiği üzere yorumlanıyordu(interpret). Web sunucusu kendine gelen istekleri kullanıcıya yollamadan önce bir dll kullanarak yorumlayıp yolluyordu. Ama artık ASP.NET kodlarımız ilk çalıştığında derlenecek ve sonraki her istek için bu derlenmiş dosya kullanıcıya yollanacak. Yani tam olarak programlama yapıyoruz diyebileceğiz. :-) Eğer derlenmiş sayfanın kodunda bir değişiklik yaparsak .NET Framework bunu farkedip yeniden derleyip gönderecek sayfamızı. Tabii ki derlenmiş kod çok daha hızlı çalışacak.

vii.) Zahmetsiz ayarlama ve upgrade: ASP.NET'te ayarlar metin dosyalarında tutulduğu için sitemizin ayarları değişince, yeni düzenlenen dosyamızı sunucuya upload etmemiz yetecek. Ayrıca artık yeni dll'lerimizi çalıştırmak için onları register edip sunucuyu baştan çalıştırmamız gerekmiyor. .NET'in doğasından dll'lerimizi registry'e kayııt etmeden direkt olarak çalıştırabiliriz.

viii.) Uyumluluk: ASP.NET klasik ASP ile tam olarak uyumlu değildir. Çünkü ASP.NET ASP'nin bir üst versiyonu olmaktan çok öte özellikler içerir. Fakat istersek aynı sunucuda asp ve aspx (ASP.NET dosyalarımızın uzantısı) dosyalarmız kardeş kardeş çalışabilirler.

* bu makale csharpnedir.com'dan alınmıştır ve makale ekle testi için kullanılmıştır.



kategori : Asp.Net - tarih : 21/11/2009 - yazan : Ahmet Faruk Nacaroğlu



C# 2.0 - Generic Class Tanımlanması

C# 2,0 ile birlikte gelen güzel özelliklerden biri de Generic Class(Sınıf) tipler tanımlanabilmesidir. Kısaca bahsedersek Generic tanımlanan Class’ların bir örneğini oluşturmak istediğimizde, bu Class’ın işlevlerini hangi tip Class üzerinde gerçekleştireceğini belirtiriz. Ve bu işlevleri yerine getirecek olan Method’ların kabul edeceği tipler, Class’ın örneğini yaratırken belirlenmiş olur. Bu özellikten önce, bu şekildeki her tip için ayrı bir Class yazmak zorunda olurduk. Bu nedenle Generic Class tipleri daha az kod yazarak daha çok iş yapabilmemizi sağlayan güzel bir özelliktir.

.NET içinde hazır gelen bir çok Generic Class vardır. Örneğin List<T> bunlardan en çok kullanılanıdır. Burada "< >" işaretleri arasında yazılan T, List Class’ının içinde T tipinde değerler tutacağını belirtir. List<T> gibi collection tipleri dışında IComparer veya IComparable gibi Interface’lerin IComparer<T> ve IComparable<T> gibi Generic olanlarıda vardır.

Kullanımına bir kaç örnek vericek olursak;

1- )
List<Rectangle> listRect = new List<Rectangle>();
Rectangle rect = new Rectangle(10,10,100,25);
listRect.Add(rect); // parametre olarak sadece Rectangle tipinde değeler alır.
2- )

public class ButtonComparer : IComparer<Button>
{
    #region IComparer<Button> Members

    public int Compare(Button x,Button y)
    {
        return x.Text.CompareTo(y.Text);
    }

    #endregion
}
Mevcut Generic Class’lar dışında bizde kendi Generic Class’larımızı yazarabilirizHatta Generic olarak belirteceğimiz Class tipinin belirli koşulları sağlamasını sağlayabiliriz. Örnek üzerinde gidecek olursak, şöyle bir Class yazalım.

public class MyGeneric<Tip>
{
    private Tip genericValue;

    public MyGeneric() { }

    public MyGeneric(Tip genericValue)
    {
        this.genericValue = genericValue;
    }

    public Tip GenericValue
    {
        get { return genericValue; }
        set { genericValue = value; }
    }

    public void writeGenericType()
    {
        Console.WriteLine(genericValue.GetType().ToString());
    }

    public void writeGenericValue()
    {
        Console.WriteLine(genericValue.ToString());
    }
}
Burada Tip olarak geçen bizim Generic tipimiz oluyor. Yani biz MyGeneric Class’ının bir örneğini yaratırken, tıpkı List<T> Class’ında oludğu gibi bu Class’ın generic tipini belirtiyoruz. Mesela biz MyGeneric<Button> temp; şeklinde bir tanımlama yaparsak, Class tanımı içinde ki Tip, Button olur. Örnekten devam edersek;

MyGeneric<DateTime> temp = new MyGeneric<DateTime>(DateTime.Now);
temp.writeGenericType();
temp.writeGenericValue();

veya

MyGeneric<DateTime> temp = new MyGeneric<DateTime>();
temp.GenericValue = DateTime.Now;
temp.writeGenericType();
temp.writeGenericValue();
Burada writeGenericType() methodunu çalıştırdığımızda ekrana System.DateTime yazacaktır. Çünkü tanımımızda generic tip olarak DateTime verdik. Ayrıca writeGenericValue() method’uda o anki tarih ve saati yazacaktır.

Koşullu Generic tipler

Kendi Generic Class’larımızı yazarken, bir önceki örnekte Tip ile belirttiğimiz generic tipin, belirli bir class’tan türemesi veya mutlaka parametresiz bir constructor’ı olması koşullarını belirtebiliriz. Böylece daha güçlü Generic Class tipleri yazma imkanımız olur. Bu özellik önceki versiyonlarda bulunmayan where keyword’ü ve mevcut new keyword’ünün başka bir kullanımını ile uygulanır. Bunu biraz önceki örnek kod üzerinde uygulayalım;


public class MyClass
{
    private string text;

    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}

public class MyGeneric<Tip> where Tip : MyClass
{
    // Bazı kodlar
}
Buarada Tip ile belirtilen Generic Class tipinin MyClass’tan türeyen bir class olma koşulunu belirmiş olduk. Haliyle class’ımızın bu son hali ile, biraz önce DateTime verdiğimiz örnek hata atacaktır. Çünkü DateTime class’ı MyClass class’ından türememiştir. Burada bir class’tan türeme koşulu ile birlikte bir veya birden fazla Interface’i de implemente etme koşulu belirtebiliriz.

public class MyClass
{
    private string text;

    public string Text
    {
        get { return text; }
        set { text = value; }
    }
}

public interface MyInterface { }

public class MyGeneric<Tip> where Tip : MyClass,MyInterface
{
    // Bazı kodlar
}

//veya

public class MyGeneric<Tip> where Tip : MyClass,MyInterface,IClonable<Tip>
{
    // Bazı kodlar
}
Bu koşulların dışında biraz önce belirttiğim, Tip class’ının parametresiz constructor’ı olma koşulu ise şöyle kullanılıyor;

public class MyGeneric<Tip> where Tip : new()
{
    // Bazı kodlar
}

// veya önceki örnekle birleştirirsek;

public class MyGeneric<Tip> where Tip : MyClass,MyInterface,new()
{
    // Bazı kodlar
}
Son duruma göre Tip ile belirteceğimiz class tipi, MyClass class’ından türemeli, MyInterface interface’ini implemente etmeli ve mutlaka parametresiz bir constructor’ ı olmalı.

Konuyu ilk fark ettiğimde, parametresiz constructor olması koşulu gibi özellikle belli bir constructor’u olan generic tip koşulu tanımlamaya çalıştım ama olmadı :-). Oda olsa iyi olurmuş ama bu kadarı bile yeterince kolaylık sağlıyor.



* bu makale csharpnedir.com'dan alınmıştır ve makale ekleme test için konmuştur.


kategori : C# - tarih : 20/11/2009 - yazan : Sercan Ayyıldız



<< 1 >>