Makale Özeti

Bu makalede ele alınan tema; trigger ’ların VB.NET ve C# ile geliştirilen veri tabanı uygulamalarındaki kullanımıdır. Konu bütünlüğü açısından öncelikle trigger konusu ADO .NET ‘ten bağımsız olarak incelenmiş, daha sonra iki farklı uygulama ile trigger’ların ADO .NET ‘teki kullanım şekli örneklenmiştir. Verilen örnekler VB.NET ve C# için ayrı ayrı kodlanmıştır. Ancak makalenin gereğince anlaşılması; okuyucunun ön koşul olarak, stored procedure yazacak düzeyde T-SQL bilmesini gerektirir.

Makale

ADO .NET ‘te Trigger Kullanımı

 

Giriş

 

Bu makalede ele alınan tema; trigger ’ların VB.NET ve C# ile geliştirilen veri tabanı uygulamalarındaki kullanımıdır. Konu bütünlüğü açısından öncelikle trigger konusu ADO .NET ‘ten bağımsız olarak incelenmiş, daha sonra iki farklı uygulama ile trigger’ların ADO .NET ‘teki kullanım şekli örneklenmiştir. Verilen örnekler VB.NET ve C# için ayrı ayrı kodlanmıştır. Ancak makalenin gereğince anlaşılması; okuyucunun ön koşul olarak, stored procedure yazacak düzeyde T-SQL bilmesini gerektirir.

 

İçerik :

 

·      Trigger’lar nedir ve neden kullanılırlar ?

·      Trigger’ların yaratılması.

·      ADO .NET’te trigger kullanımı.

 

Trigger ’lar Nedir ve Neden Kullanılırlar ?

 

Trigger ‘lar (tetikleyiciler); insert, delete veya update ifadeleri kullanılarak, tablolar üzerinde yapılan veri tabanı işlemlerinde, (SQL Server tarafında) otomatik olarak çalışan özel stored procedure ‘lardır. Trigger ‘lar sayesinde tablolar üzerinde yapılan çeşitli işlemlerin, veri bütünlüğü kurallarını ihlal etmemesi sağlanır.

 

Bu noktada veri bütünlüğü kavramını “veri tabanında depolanan verilerin, çeşitli veri tabanı işlemlerine (veri girme, güncelleme, silme gibi) tabi tutulduğu süreç içerisinde, mantıksal, yapısal ve ilişkisel tutarlığının korunması” biçiminde açıklayabiliriz.

 

Trigger ‘lar otomatik olarak çalıştıkları duruma göre iki farklı biçimde kategorize edilmişlerdir;

 

1.     After Trigger : After Trigger ‘lar kendisi için tanımlanmış olan işlem yapıldıktan sonra (örneğin bir kayıt ekleme işlemi) otomatik olarak çalışarak yapılan işlemin veri bütünlüğü kurallarını ihlal edip etmediğini kontrol eder. Eğer yapılan işlem veri bütünlüğünü bozacak biçimde çalışmışsa, tablo üzerinde yaptığı değişiklik iptal edilir. Ayrıca bir hata mesajı oluşturularak, hatanın kullanıcıya raporlanması sağlanabilir.    

 

2.     Instead Of Trigger : Instead Of Trigger ‘lar ise; kendisi için tanımlanmış olan işlem yapıldığı sırada (örneğin bir güncelleme işlemi) “onun yerine” otomatik olarak çalışarak yapılan işlemin veri bütünlüğü kurallarını ihlal edip etmediğini kontrol eder. Eğer yapılan işlem veri bütünlüğünü bozacak biçimde çalışıyorsa, tablo (ya da view) üzerinde yaptığı değişiklik iptal edilir. Ayrıca bir hata mesajı oluşturularak, hatanın kullanıcıya raporlanması sağlanabilir. Instead Of Trigger ‘lar, Microsoft SQL Server 2000 ile tanıtılmış olan yeni bir özelliktir. After trigger ‘lardan farklı olarak hem tablo, hem de view ‘lar üzerinde yaratılabilirler.

 

Özetle trigger ‘lar, veri bütünlüğü ve iş kurallarının veri tabanı sunucusu üzerinde kontrol edilmesini ve dolayısı ile uygulama kodunun daha kısa ve anlaşılabilir olmasını sağlarlar.  

 

Trigger ‘ların Yaratılması

 

Trigger ‘ların yaratılması noktasında, iki farklı yöntemin varlığı söz konusudur. Birinci yöntem; “Create Trigger” komutu içeren bir dizi T-SQL kodunun, “Query Analyzer” içerisinde çalıştırılmasıdır.

 

 

Şekil 1

 

Pratikte daha fazla tercih edilen ikinci yöntem ise; Enterprise Manager isimli yönetim aracının kullanımıdır. Enterprise Manager ‘da bir tabloyu (veya view) temsil eden ikonun sağ tuş menüsündeki “All Tasks > Manage Triggers” seçiminin sonucunda açılan “Trigger Properties” başlıklı pencere aynı amaç için kullanılabilir.

  

 

Şekil 2

 

Bu yöntemlerden hangisinin tercih edileceği ise, tümüyle programcının insiyatifinde olup, birinin diğerine göre herhangi bir üstünlüğü bulunmamaktadır.

 

ADO .NET ’te Trigger Kullanımı

 

Yaratılan bir trigger ın uygulama tarafında kullanılabilmesi için, özel olarak herhangi bir işlem yapmaya gerek yoktur. Çünkü trigger lar, kendileri ile ilişkilendirilmiş bir veri tabanı işlemi yapılmak istendiği sırada otomatik olarak çalışan yapılardır. Bu nedenle makalenin ilerleyen kısmında teorik anlatım tarzı yerine, basit bir uygulama örneği üzerinde gerçekleştirilecek, pratiğe yönelik bir anlatım tercih edilmiştir.

 

Örnek 1 : Aşağıdaki uygulamada Cari_hesaplar isimli bir veri tabanı ve bu veri tabanına ait Musteriler isimli bir tablo kullanılmaktadır. Bu tablo üzerinde yaratılmış olan Musteri_Update isimli trigger ise, söz konusu tablo üzerinde yapılması muhtemel bir güncelleme işlemi sırasında otomatik olarak çalışmakta ve Adi alanına NULL değer girilmesini önlemektedir. 

 

 

Şekil 3 : Kullanılan tablonun yapısı

 

CREATE TRIGGER Musteri_Update

ON dbo.Musteriler

FOR UPDATE

AS

DECLARE @isim char(30)

SELECT @isim=(SELECT Adi FROM inserted)

IF UPDATE (Soyadi) AND @isim IS NULL

BEGIN

    ROLLBACK TRANSACTION  

    RAISERROR(Adi isimli alan NULL değer içeremez, 11, 1)

END

 

Uygulama tarafında ise, “Musteriler” isimli tablonun “Musteri_id” isimli alanındaki değeri; 1 olan kaydın “Soyadi” alanındaki bilgi güncellenmektedir. Ancak “Adi” alanına bilinçli olarak NULL değeri atanmıştır. 

 

[VB.NET]

Sub Main()

     Dim oCnn As New SqlConnection()

     oCnn.ConnectionString = "data source=localhost; _

     database=Cari_Hesaplar;integrated security=True"

     oCnn.Open()

    

     Dim sSQL As String

     sSQL = "Update Musteriler Set Adi=NULL, _

     Soyadi=Eroglu Where Musteri_id=1"

    

     Dim oCmd As SqlCommand

     oCmd = New SqlCommand(sSQL, oCnn)

 

     Try

        oCmd.ExecuteNonQuery()

     Catch e As Exception

        Console.WriteLine("Hata : " & e.Message)

     Finally

        oCnn.Close()

     End Try

End Sub

 

[C#]

static void Main(string[] args)

{

      SqlConnection oCnn = new SqlConnection();

      oCnn.ConnectionString = "data source=localhost;

      database=Cari_Hesaplar;integrated security=True";

oCnn.Open();

     

string sSQL = "Update Musteriler Set Adi=NULL,

Soyadi=Eroglu Where Musteri_id=1";

 

      SqlCommand oCmd;

      oCmd = new SqlCommand(sSQL, oCnn);

 

      try

      {

            oCmd.ExecuteNonQuery();

      }

      catch (Exception e)

      {

            Console.WriteLine("Hata : " + e.Message);

      }

      finally

      {

            oCnn.Close();

      }

}

               

Bu durumda “Musteri_Update” isimli trigger, tablodaki herhangi bir kaydın güncellenmesi sonrasında otomatik olarak çalışır ve “Adi” alanındaki değerin NULL olup olmadığını kontrol eder, eğer alan NULL değer içeriyorsa yapılan güncelleme işlemini iptal ederek, RAISERROR komutu ile bir hata oluşturur. Bu sayede uygulama tarafından yapılan hatalı değişim iptal edilir (tabloya yansıtılmaz) ve yakalanan hata Şekil 4 ‘te görüldüğü gibi kullanıcıya raporlanır.

 

 

Şekil 4 : Uygulamaya ait ekran çıktısı 

 

Örnek 2 : Trigger ‘ın çalışmasında, burada yapılan güncelleme işleminin, nasıl yapıldığının önemi yoktur. Örneğin güncelleme bir DataSet nesnesi ile temsil edilen verilerin, SqlDataAdapter sınıfına ait Update() metodunun çağrılması ile de yapılabilirdi.

 

[VB.NET]

Sub Main()

     Dim oCnn As New SqlConnection()

     oCnn.ConnectionString = "datasource=localhost; _
     database=Cari_Hesaplar;integrated security=True"

     oCnn.Open()

  

     Dim sSQL As String

     sSQL = "Select * From Musteriler"

   

     Dim oDs As New DataSet()

     Dim oAdp As SqlDataAdapter

     oAdp = New SqlDataAdapter(sSQL, oCnn)

     oAdp.Fill(oDs)

  

     oDs.Tables(0).Rows(0)(1) = Nothing

     oDs.Tables(0).Rows(0)(2) = "Eroglu"

     Dim oCb As New SqlCommandBuilder(oAdp)

     Dim updDs As New DataSet()

     updDs = oDs.GetChanges(DataRowState.Modified)

 

     Try

         oAdp.Update(updDs)

     Catch e As Exception

         Console.WriteLine("Hata : " & e.Message)

     Finally

         oCnn.Close()

     End Try

End Sub

 

[C#]

static void Main(string[] args)

{

      SqlConnection oCnn = new SqlConnection();

      oCnn.ConnectionString = "data source=localhost; _

database=Cari_Hesaplar;integrated security=True";

      oCnn.Open();

      string sSQL = "Select * From Musteriler";

                 

      DataSet oDs = new DataSet();

      SqlDataAdapter oAdp;

      oAdp = new SqlDataAdapter(sSQL, oCnn);

      oAdp.Fill(oDs);

      oDs.Tables[0].Rows[0][1] = null;

      oDs.Tables[0].Rows[0][2] = "Eroglu";

      SqlCommandBuilder oCb = new SqlCommandBuilder(oAdp);

      DataSet updDs = new DataSet();

      updDs = oDs.GetChanges(DataRowState.Modified);

 

      SqlCommand oCmd;

      oCmd = new SqlCommand(sSQL, oCnn);

      try

      {

            oAdp.Update(updDs);

      }

      catch (Exception e)

      {

            Console.WriteLine("Hata : " + e.Message);

      }

      finally

      {

            oCnn.Close();

      }

}

 


 

Aykut TAŞDELEN

 

aykuttasdelen@yahoo.com