﻿
{"id":181,"date":"2012-03-14T22:48:22","date_gmt":"2012-03-14T22:48:22","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=181"},"modified":"2012-04-27T16:47:56","modified_gmt":"2012-04-27T16:47:56","slug":"transact-sql-triggerstetikleyiciler","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/transact-sql-triggerstetikleyiciler\/","title":{"rendered":"Transact Sql-Triggers(Tetikleyiciler)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bu yaz\u0131mda sizlere trigger lardan bahsedece\u011fim.2 t\u00fcr Trigger vard\u0131r.Biri DML trigger biride DDL triggerd\u0131r.<br \/>\nHer ikisinide ayr\u0131nt\u0131l\u0131 olarak g\u00f6relim.<br \/>\n<!--more--> DML Triggerlar.Bir tabloda insert,delete ve update i\u015flemleri ger\u00e7ekle\u015fti\u011finde devreye giren yap\u0131lard\u0131r.Bu i\u015flemler sonucunda veya bu i\u015flemler s\u00fcrerken devreye girerler.<br \/>\nE\u011fer bir tabloda insert i\u015flemi yap\u0131l\u0131yorsa,arka planda i\u015flemler ilk \u00f6nce RAM de olu\u015fturulan inserted isimli bir tablo \u00fczerinde yap\u0131l\u0131r.E\u011fer i\u015flemde bir problem yoksa inserted tablosundaki veriler fiziksel tabloya insert edilir.\u0130\u015flem bitti\u011finde RAM de olu\u015fturulan bu inserted tablosu silinir.<br \/>\nE\u011fer bir tabloda delete i\u015flemi yap\u0131l\u0131yorsa,arka planda i\u015flemler ilk \u00f6nce RAM de olu\u015fturulan deleted isimli bir tablo \u00fczerinde yap\u0131l\u0131r.E\u011fer i\u015flemlerde bir problem yoksa deleted tablosundaki veriler fiziksel tablodan silinir.\u0130\u015flem bitti\u011finde RAM den bu tabloda silinir.<br \/>\nE\u011fer bir tabloda update i\u015flemi yap\u0131l\u0131yorsa, RAM de updated isimli bir tablo OLU\u015eTURULMAZ!!!\u00c7\u00fcnk\u00fc update i\u015fleminde veriler \u00f6nce delete yap\u0131l\u0131r sonra yeni veri insert yap\u0131l\u0131r.SQL serverdaki mant\u0131k budur.Yani update i\u015flemi yap\u0131l\u0131yorsa arka planda RAM de hem deleted hemde inserted tablolar\u0131 olu\u015fturulur ve i\u015flemler bunlar \u00fczerinden yap\u0131l\u0131r.<br \/>\nBu deleted ve inserted tablolar\u0131 , ilgili sorgu sonucu olu\u015ftuklar\u0131 i\u00e7in o sorgunun kulland\u0131\u011f\u0131 kolonlara da sahip olur.B\u00f6ylece deleted ve inserted tablolar\u0131nda select i\u015flemi yapmak m\u00fcmk\u00fcnd\u00fcr.<br \/>\nYap\u0131s\u0131 a\u015fa\u011f\u0131daki gibidir.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nCreate trigger \u2013trigger isim-\r\non -\u0130\u015flemYap\u0131lanTablo\u0130smi-\r\nafter ve ya for \u2013delete,update,insert-\r\nas\r\n-Kodlar-\r\n<\/pre>\n<hr \/>\n<p>Yukardaki yap\u0131da after yerine for tag\u0131n\u0131da kullanabiliriz.Arada pek fark yoktur.<br \/>\nSoru\u2019\u2019<br \/>\nTedarik\u00e7iler tablosunda bir veri silinir ise t\u00fcm \u00fcr\u00fcnlerin fiyat\u0131 10 arts\u0131n.(Otomatik olarak)<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger Artt\u0131r\r\non Tedarikciler\r\nafter delete\r\nas\r\nupdate Urunler set BirimFiyati=BirimFiyati+10\r\n<\/pre>\n<hr \/>\n<p>Yukarda trigger\u0131m\u0131z\u0131 olu\u015fturmu\u015f olduk.<br \/>\non Tedarikciler = Tedarik\u00e7iler tablosunda<br \/>\nafter delete = Delete i\u015flemi ger\u00e7ekle\u015firse as den sonraki kodlar\u0131 ger\u00e7ekle\u015ftir.<br \/>\nBundan sonra Tedarik\u00e7iler tablosundan herhangi bir veriyi silince t\u00fcm \u00fcr\u00fcnlerin fiyat\u0131 10 artt\u0131r\u0131lacak.(Update yapacak)<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndelete from Tedarikciler where TedarikciID=30\r\n<\/pre>\n<hr \/>\n<p>Yukardaki i\u015flemden sonra bize verdi\u011fi mesaj \u015fu olacakt\u0131r.<br \/>\n(77 row(s) affected)<br \/>\n(1 row(s) affected)<br \/>\n\u0130stersek trigger\u0131n \u00fczerine sa\u011f t\u0131klay\u0131p disable diyerek trigger \u0131 devre d\u0131\u015f\u0131 b\u0131rakabiliriz. Veya T-SQL komutlar\u0131 ile devre d\u0131\u015f\u0131 b\u0131rakabilirz.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndisable trigger Artt\u0131r on Tedarikciler\r\n<\/pre>\n<hr \/>\n<p>Yukardaki yap\u0131da Tedarikciler tablosundaki Artt\u0131r trigger\u0131 devre d\u0131s\u0131 b\u0131rak\u0131l\u0131r.<br \/>\nE\u011fer aktif yapmak istersek,<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nenable trigger Artt\u00fdr on Tedarikciler\r\n<\/pre>\n<hr \/>\n<p>Soru\u2019\u2019<br \/>\nTedarikciler tablosunda bir veri g\u00fcncellenirse Kategoriler tablosunda meyve kokteyli isminde bir kategori olu\u015fsun.<br \/>\n\u00d6nce trigger\u0131 yazal\u0131m,<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger KategoriOlustur\r\non Tedarikciler\r\nfor update\r\nas\r\ninsert Kategoriler(KategoriAdi) values('Meyve Kokteyli')\r\n<\/pre>\n<hr \/>\n<p>Trigger\u0131 yazd\u0131k \u015fimdi \u00e7al\u0131\u015f\u0131yor mu deneyelim.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nupdate Tedarikciler set SirketAdi='Deneme' where SirketAdi='Exotic Liquids'\r\n<\/pre>\n<hr \/>\n<p>Yukardaki kodu execute yaparsak e\u011fer bize \u015fu mesaj\u0131 verecektir.<br \/>\n(1 row(s) affected)<br \/>\n(1 row(s) affected)<br \/>\nKategoriler tablosunu da kontrol edersek e\u011fer Meyve Kokteyli isminde bir kategori olu\u015fturuldu\u011funu g\u00f6r\u00fcr\u00fcz.<br \/>\nSoru\u2019\u2019<br \/>\nPersoneller tablosunda bir kay\u0131t silindi\u011finde silinen kayd\u0131n Ad\u0131,Soyad\u0131,kim taraf\u0131ndan ve hangi tarihte silindi\u011fi ba\u015fka bir tabloya kay\u0131t edilsin.(Bir nevi log tablosu)<br \/>\n\u00d6ncelikle kay\u0131t edece\u011fi tabloyu olu\u015ftural\u0131m.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ngo\r\ncreate table log_tablosu\r\n(\r\nId int primary key identity(1,1),\r\nAciklama varchar(100)\r\n)\r\n<\/pre>\n<hr \/>\n<p>\u015eimdide trigger\u0131 olu\u015ftural\u0131m.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger Log_Trigger\r\non Personeller\r\nafter delete\r\nas\r\ndeclare @adi varchar(100),@soyadi varchar(100)\r\nselect @adi=Adi,@soyadi=SoyAdi from deleted\r\ninsert log_tablosu(Aciklama) values('Ad\u0131 :' + @adi + ',Soyad\u0131 :' + @soyadi + ' olan personel ' + SUSER_SNAME() + ' taraf\u0131ndan ' + CONVERT(nvarchar(MAX),GetDate()) + ' tarihinde silinmi\u015ftir.')\r\n<\/pre>\n<hr \/>\n<p>SUSER_SNAME() = O an SQL servarda oturum a\u00e7m\u0131\u015f ki\u015fiyi verir.<br \/>\nYukar\u0131daki kodda declare ile tan\u0131mlanm\u0131\u015f olan adi ve soyadi de\u011fi\u015fkenlerine deleted tablosundan gelen ad\u0131 ve soyad\u0131 verilerini at\u0131yoruz.log_tablosu na raporlama yap\u0131yoruz.<br \/>\n\u015eimdide kullanal\u0131m.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndelete from Personeller where PersonelID=38\r\n<\/pre>\n<hr \/>\n<p>Bu kodu execute ettikten sonra bize \u015fu mesaj\u0131 verecektir,<br \/>\n(1 row(s) affected)<br \/>\n(1 row(s) affected)<br \/>\nLog tablosunu kontrol edersek e\u011fer veri kayd\u0131n\u0131 g\u00f6receksiniz.<br \/>\nSoru\u2019\u2019<br \/>\nPersoneller tablosunda update ger\u00e7ekle\u015fti\u011fi anda devreye giren ve bir log tablosuna \u201cde\u011feri \u015fu olan kay\u0131t \u015fununla de\u011fi\u015ftirilerek \u015fu kullan\u0131c\u0131 taraf\u0131ndan \u015fu tarihte g\u00fcncellendi\u201d bilgisini yazan trigger\u0131 yaz\u0131n\u0131z.<br \/>\n\u00d6ncelikle update i\u015flemi oldu\u011fu i\u00e7in deleted ve inserted tablolar\u0131yla i\u015flem yapaca\u011f\u0131m\u0131z\u0131 belirteyim.\u0130lk de\u011feri deleted tablosundan alaca\u011f\u0131z ve ikinci yeni olan de\u011feride inserted tablosundan alaca\u011f\u0131z.<br \/>\n\u00d6ncelikle log tablosunu olu\u015ftural\u0131m,<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate table Log_Table\r\n(\r\nId int primary key identity(1,1),\r\nAciklama varchar(max)\r\n)\r\n<\/pre>\n<hr \/>\n<p>Trigger\u0131 yazal\u0131m<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger Log_TriggerUpdate\r\non Personeller\r\nfor update\r\nas\r\ndeclare @ilkdeger varchar(50),@yenideger varchar(50)\r\nselect @ilkdeger = Adi from deleted\r\nselect @yenideger = Adi from inserted\r\ninsert Log_Table values('De\u011feri ' + @ilkdeger + ' olan veri ' + @yenideger + ' ile ' + SUSER_SNAME() + ' kullan\u0131c\u0131s\u0131 taraf\u0131ndan ' + Cast(GETDATE() as varchar(100)) + ' tarihinde de\u011fi\u015ftirildi.')\r\n<\/pre>\n<hr \/>\n<p>Kullanal\u0131m,<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nupdate Personeller set Adi='Fatih' where Adi='Gen\u00e7ay'\r\n<\/pre>\n<hr \/>\n<p>Yukar\u0131daki kodu execute yapt\u0131ktan sonra Log_Table tablosuna bakarsak e\u011fer raporumuz kaydedilmi\u015f olarak g\u00f6r\u00fcr\u00fcz.<br \/>\nNOT:Update yaparken g\u00fcncellenen kayd\u0131n orjinali deleted tablosunda,g\u00fcncellendikten sonraki hali inserted tablosundan bulunmaktad\u0131r.\u00c7\u00fcnk\u00fc g\u00fcncelleme demek kayd\u0131 \u00f6nce silmek sonra eklemek demektir.<br \/>\nTrigger sadece insert,delete ya da update i\u015flemi i\u00e7in gibi bir zorunlulu\u011fu yoktur.Bunlar\u0131n hepsi i\u00e7inde tek bir trigger yazabiliriz.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger tg_Deneme\r\non Personeller\r\nfor insert,delete\r\nas\r\n-- komutlar\r\n<\/pre>\n<hr \/>\n<p><strong><span style=\"color: #ff0000;\">INSTEAD OF TRIGGERLAR<\/span><\/strong><br \/>\nDelete,update ve insert i\u015flemleri yerine \u015fu i\u015flemleri yap, gibisinden bir amaca hizmet ederler.<br \/>\n\u015eimdi a\u015fa\u011f\u0131daki \u00f6rnek trigger\u0131 inceleyiniz.Delete i\u015flemi yap\u0131ld\u0131\u011f\u0131n da \u00e7al\u0131\u015facak olan trigger,asl\u0131nda delete i\u015flemi yapmayacakt\u0131r.Onun yerine as komutundan sonraki i\u015flemi yapacakt\u0131r.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger DeleteYerine\r\non prs\r\ninstead of delete\r\nas\r\ndeclare @adi varchar(50),@soyadi varchar(50)\r\nselect @adi=Adi,@soyadi=SoyAdi from deleted\r\ninsert prs(Notlar) values('Ad\u0131 : ' + @adi + ' , Soyad\u0131 : ' + @soyadi + ' olan veriler ' + SUSER_SNAME() + ' kullan\u0131c\u0131s\u0131 taraf\u0131ndan ' + CAST(GETDATE() as varchar(50)) + ' tarihinde silinmek istenmi\u015ftir.')\r\n<\/pre>\n<hr \/>\n<p>Yukardaki trigger prs tablosuna delete i\u015flemi yap\u0131lmaya \u00e7al\u0131\u015f\u0131ld\u0131\u011f\u0131 an prs tablosuna bu olay\u0131 raporl\u0131yor.Ve delete i\u015flemi yapm\u0131yor.<br \/>\n\u00d6rnek\u2019\u2019<br \/>\nprs tablosundan Adi Andrew olan kayd\u0131n silinmesini engelleyen,di\u011ferlerine izin veren trigger.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger Kontrol\r\non prs\r\nfor delete\r\nas\r\ndeclare @ad varchar(50)\r\nselect @ad=Adi from deleted\r\nif @ad = 'Andrew'\r\nbegin\r\nprint 'Bu kay\u0131t silemezsiniz.'\r\nrollback\r\nend\r\n<\/pre>\n<hr \/>\n<p>Trigger\u0131m\u0131z bu \u015fekilde olacakt\u0131r.<br \/>\nBuradaki \u201crollback\u201d kavram\u0131n\u0131 a\u00e7\u0131klayal\u0131m.<br \/>\nK\u0131saca i\u015flemi geri al demektir.Normalde trigger i\u00e7ine yazd\u0131\u011f\u0131m\u0131z her komut default transaction i\u00e7inde \u00e7al\u0131\u015ft\u0131r\u0131l\u0131r(implicit transaction).Bundan dolay\u0131 her bir komut transaction i\u00e7indeymi\u015f gibi rollback ile geri al\u0131nabilir.<br \/>\nPeki ad\u0131m\u0131z \u201cAndrew\u201d de\u011filse.O halde else b\u00f6l\u00fcm\u00fc olmad\u0131\u011f\u0131 halde kodlar nas\u0131l i\u015fleyecektir.<br \/>\nE\u011fer i\u015flem rollback olmazsa commit olur.B\u00f6ylece yap\u0131lan i\u015flem ger\u00e7ekle\u015ftirilir.Commit default de\u011ferdir.Aksini belirtmedi\u011fimiz s\u00fcrece her sorgu commit olur.<br \/>\n\u015eimdi bu yazd\u0131\u011f\u0131m\u0131z trigger\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndelete from prs where Adi='Fatih'\r\n<\/pre>\n<hr \/>\n<p>Bu komutu \u00e7al\u0131\u015ft\u0131r\u0131rsak silme i\u015flemi ger\u00e7ekle\u015fecektir.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ndelete from prs where Adi='Andrew'\r\n<\/pre>\n<hr \/>\n<p>Bu komutta ise silme i\u015flemi ger\u00e7ekle\u015fmeyecektir.<br \/>\n<strong><span style=\"color: #ff0000;\">DDL Triggerlar<\/span><\/strong><br \/>\nCreate,alter ve drop i\u015flemleri sonucunda devreye girecek olan trigger d\u0131r.<\/p>\n<hr \/>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ncreate trigger DDL_Trigger\r\non database\r\nfor drop_table,alter_table,create_function,create_procedure,drop_procedure\r\nas\r\nprint 'Bu i\u015flem ger\u00e7ekle\u00fetirilemez.'\r\nRollback\r\n<\/pre>\n<hr \/>\n<p>on Database; \u015eu an aktif olarak \u00e7al\u0131\u015ft\u0131\u011f\u0131m databasede bu trigger\u0131 devreye al.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Bu yaz\u0131mda sizlere trigger lardan bahsedece\u011fim.2 t\u00fcr Trigger vard\u0131r.Biri DML trigger biride DDL triggerd\u0131r. Her ikisinide ayr\u0131nt\u0131l\u0131 olarak g\u00f6relim.<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[85,125],"class_list":["post-181","post","type-post","status-publish","format-standard","hentry","category-veritabani","tag-transact-sql","tag-triggers"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/181","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=181"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/181\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=181"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=181"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=181"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}