Trigger

Dark-Man

Kıdemli Üye
5 Ocak 2013
4,430
9
I Don't Know
[FONT=&quot]
Trigger’ları stored procedure’lara benzetmek yanlış olmayacaktır. Otomatik olarak çalışan bir stored procedure düşünelim. Veritabanımızda bulunan bir tablo üzerinde yapılan değişikliklerin bilgisini tutan başka bir tablo olduğunu varsayalım. Bu tablo üzerinde insert, update , delete işlemleri olduğunda tetikleyici kullanarak yapılan işlemleri diğer tablo üzerine gösterebiliriz. Trigger’ların dezavantajlarından birisi her nekadar hataları azaltma konusunda çok yardımcı olsada, sistemimizin performansını olumsuz yönde etkilemektedir. Trigger’lar hafızada tutulan “inserted” ve “deleted” adlı tablolara sahiptirler. Bunlar hafızada tutulduğundan daha doğrusu fiziksel bir tablo olmadığından dolayı bu tablolar üzerinde yapılan herhangi bir sorgu sonucunu göremezsiniz. Örneğin siz bir tablo üzerine insert işlemi yaptığınızda ilk önce bu inserted tablosuna yazılır. Transaction da commit veya rollback sonucuna görede fiziksel tablomuza işlenir. Aynı şekilde tablomuzdan veri silmek istediğimizde, verilerimiz tablomuzdan silinirken “deleted” isimli tabloya da bir yandan silinen verilerimiz kaydedilir. Yapılan işlemde bir hata oluştuğunda sildiğimiz veriler deleted tablosundan okunarak tekrar fiziksel tablomuza kaydedilir. Şimdide Departmanlar isimli tablomuzdan herhangi bir veriyi silmemek için tasarlanmış bir trigger yazalım. Departmanlar tablomuzda DepartmanID ve DepartmanAd isimli iki kolonumuz bulunsun. Bir başka tablo olan Hareket tablomuzda ise tarih bilgisi tutan bir kolonumuz olsun. Eğer departman tablomuzdan bir silme işlemi gerçekleşirse, silme işleminin gerçekleştiği zamanı hareket isimli tablomuza kaydedelim. [/FONT]

[FONT=&quot]create trigger SilmeIslemi on Departmanlar [/FONT]
[FONT=&quot]for delete [/FONT]
[FONT=&quot]as [/FONT]
[FONT=&quot]insert into hareket(Tarih) values (getdate()) [/FONT]
[FONT=&quot]Yukarıda SilmeIslemi isimli bir trigger tanımladık. Bu trigger Departmanlar isimli tablomuzda herhangi bir silme işlemi gerçekleştiğinde silme işleminin zamanını hareket isimli tablomuza kaydedecek. [/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]create trigger Silemezsiniz on Departmanlar [/FONT]
[FONT=&quot]for delete [/FONT]
[FONT=&quot]as[/FONT]
[FONT=&quot]rollback [/FONT]
[FONT=&quot]print 'Silme Islemini Gerceklestiremezsin' [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Bundan sonra yapacağımız silme işlemini kabul etmeyecek ve “Silme Islemini Gerceklestiremezsin” diye bir yazı çıkacaktır karşımıza. [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]delete departmanlar where departmanID=1 [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Daha önceden kullandığımız tetikleyicimizi silmek için Drop komutunu kullanırız. Drop Trigger dedikten sonra trigger’ımızın adını belirtip , çalıştırdığımızda tetikleyicimiz silinecektir. [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]drop trigger Silemezsiniz[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Varolan bir tetikleyicinin içeriğini değiştirmek istediğimizde Alter komutundan faydalanırız. [/FONT]
[FONT=&quot]alter trigger Silemezsiniz on Departmanlar [/FONT]
[FONT=&quot]for delete [/FONT]
[FONT=&quot]as [/FONT]
[FONT=&quot]rollback [/FONT]
[FONT=&quot]print 'Veritabanından herhangi bir veriyi silemezsiniz’ [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]SQL server üzerinde insert,delete ve update tetikleyicilerinin yanına Sql Server 2005 ile birlikte DDL Trigger kavramıda eklendi. Sql Server ‘ın daha önceki sürümlerinde yukarıdaki örneklerde de olduğu gibi tablolardaki insert,update ve delete işlemlerine trigger uygulayabiliyorduk. DDL triggerlar sayesinde Create, alter ve drop komutları içinde trigger yazabiliyoruz. Aşağıdaki örneğimizde kullanıcının AdventureWork isimli veritabanında varolan bir tabloyu düzeltmesini veya silmesini engelleyen bir trigger yazalım. [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Create Trigger Yapamazsin [/FONT]
[FONT=&quot]On database for Alter_Table , Delete_Table [/FONT]
[FONT=&quot]As [/FONT]
[FONT=&quot]Print ‘Tabloları Düzeltme veya Silme Yetkiniz Yok’ [/FONT]
[FONT=&quot]Rollack [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Kodumuzu derledikten sonra Sql Server 2005 Object Browser’ımıza baktığımızda Trigger’ımızın varolduğunu göreceksiniz.

image001.jpg

[/FONT]
[FONT=&quot]AdventureWorks veritabanında HumanResources.Employee tablomuza aşağıdaki kod ile müdahele etmeye kalktığımızda, ‘Tabloları Düzeltme veya Silme Yetkiniz Yok’ mesajı ile karşılaşacağız: [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Alter Table HumanResources.Employee [/FONT]
[FONT=&quot]Add abcd int [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Bir tablo üzerinde daha önceden yazılmış ve çalışan bir trigger’ın olup olmadığını öğrenmek içinse system stored procedure’lerinden sp_helptrigger ‘ı kullanırız. Örneğin Northwind veritabanımızın Employees isimli tablosunda trigger olup olmadığını öğrenmek için : [/FONT]
[FONT=&quot]Exec sp_helptrigger Employees [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]Bu bölümde Trigger kavramını incelemeye çalıştık. Aşağıda SQL Server 2000 ‘de varolan Northwind isimli veritabanı üzerinde örnek olarak yapılan birkaç trigger örneği mevcuttur. [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]create trigger silemezsin on employees for delete [/FONT]
[FONT=&quot]as [/FONT]
[FONT=&quot]declare @silinen int [/FONT]
[FONT=&quot]set @silinen= (select count(*) from deleted) [/FONT]
[FONT=&quot]if @silinen>1 [/FONT]
[FONT=&quot]begin [/FONT]
[FONT=&quot]raiserror ('bir kayıttan fazla silemezsin',16,1) [/FONT]
[FONT=&quot]rollback transaction [/FONT]
[FONT=&quot]end [/FONT]

[FONT=&quot]
[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]--bunu kim silmiş [/FONT]
[FONT=&quot]create table employees_log_info [/FONT]
[FONT=&quot](username varchar(30),tarih datetime) [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]alter table employees_log_info add employeeID int [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]create trigger silen on employees for delete[/FONT]
[FONT=&quot]as [/FONT]
[FONT=&quot]insert into employees_log_info values (user,getdate()) [/FONT]
[FONT=&quot]select * from employees [/FONT]
[FONT=&quot]delete employees where employeeID=70 [/FONT]
[FONT=&quot]select * from employees_log_info [/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]alter trigger silen on employees for delete [/FONT]
[FONT=&quot]as [/FONT]
[FONT=&quot]declare @id int set @id=(select employeeID from deleted)[/FONT]
[FONT=&quot] [/FONT]
[FONT=&quot]insert into employees_log_info values (user,getdate(),@id)[/FONT]
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.