[FONT="]
[FONT="]create trigger SilmeIslemi on Departmanlar [/FONT]
[FONT="]for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]insert into hareket(Tarih) values (getdate()) [/FONT]
[FONT="]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="]
[/FONT] [FONT="] [/FONT]
[FONT="]create trigger Silemezsiniz on Departmanlar [/FONT]
[FONT="]for delete [/FONT]
[FONT="]as[/FONT]
[FONT="]rollback [/FONT]
[FONT="]print 'Silme Islemini Gerceklestiremezsin' [/FONT]
[FONT="] [/FONT]
[FONT="]Bundan sonra yapacağımız silme işlemini kabul etmeyecek ve Silme Islemini Gerceklestiremezsin diye bir yazı çıkacaktır karşımıza. [/FONT]
[FONT="] [/FONT]
[FONT="]delete departmanlar where departmanID=1 [/FONT]
[FONT="] [/FONT]
[FONT="]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="] [/FONT]
[FONT="]drop trigger Silemezsiniz[/FONT]
[FONT="] [/FONT]
[FONT="]Varolan bir tetikleyicinin içeriğini değiştirmek istediğimizde Alter komutundan faydalanırız. [/FONT]
[FONT="]alter trigger Silemezsiniz on Departmanlar [/FONT]
[FONT="]for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]rollback [/FONT]
[FONT="]print 'Veritabanından herhangi bir veriyi silemezsiniz [/FONT]
[FONT="] [/FONT]
[FONT="]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="] [/FONT]
[FONT="]Create Trigger Yapamazsin [/FONT]
[FONT="]On database for Alter_Table , Delete_Table [/FONT]
[FONT="]As [/FONT]
[FONT="]Print Tabloları Düzeltme veya Silme Yetkiniz Yok [/FONT]
[FONT="]Rollack [/FONT]
[FONT="] [/FONT]
[FONT="]Kodumuzu derledikten sonra Sql Server 2005 Object Browserımıza baktığımızda Triggerımızın varolduğunu göreceksiniz.
[/FONT] [FONT="]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="] [/FONT]
[FONT="]Alter Table HumanResources.Employee [/FONT]
[FONT="]Add abcd int [/FONT]
[FONT="] [/FONT]
[FONT="]Bir tablo üzerinde daha önceden yazılmış ve çalışan bir triggerın olup olmadığını öğrenmek içinse system stored procedurelerinden sp_helptrigger ı kullanırız. Örneğin Northwind veritabanımızın Employees isimli tablosunda trigger olup olmadığını öğrenmek için : [/FONT]
[FONT="]Exec sp_helptrigger Employees [/FONT]
[FONT="] [/FONT]
[FONT="]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="] [/FONT]
[FONT="]create trigger silemezsin on employees for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]declare @silinen int [/FONT]
[FONT="]set @silinen= (select count(*) from deleted) [/FONT]
[FONT="]if @silinen>1 [/FONT]
[FONT="]begin [/FONT]
[FONT="]raiserror ('bir kayıttan fazla silemezsin',16,1) [/FONT]
[FONT="]rollback transaction [/FONT]
[FONT="]end [/FONT]
[FONT="]
[/FONT] [FONT="] [/FONT]
[FONT="] [/FONT]
[FONT="]--bunu kim silmiş [/FONT]
[FONT="]create table employees_log_info [/FONT]
[FONT="](username varchar(30),tarih datetime) [/FONT]
[FONT="] [/FONT]
[FONT="]alter table employees_log_info add employeeID int [/FONT]
[FONT="] [/FONT]
[FONT="]create trigger silen on employees for delete[/FONT]
[FONT="]as [/FONT]
[FONT="]insert into employees_log_info values (user,getdate()) [/FONT]
[FONT="]select * from employees [/FONT]
[FONT="]delete employees where employeeID=70 [/FONT]
[FONT="]select * from employees_log_info [/FONT]
[FONT="] [/FONT]
[FONT="]alter trigger silen on employees for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]declare @id int set @id=(select employeeID from deleted)[/FONT]
[FONT="] [/FONT]
[FONT="]insert into employees_log_info values (user,getdate(),@id)[/FONT]
Triggerları stored procedurelara 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. Triggerların dezavantajlarından birisi her nekadar hataları azaltma konusunda çok yardımcı olsada, sistemimizin performansını olumsuz yönde etkilemektedir. Triggerlar 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="]create trigger SilmeIslemi on Departmanlar [/FONT]
[FONT="]for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]insert into hareket(Tarih) values (getdate()) [/FONT]
[FONT="]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="]
[/FONT] [FONT="] [/FONT]
[FONT="]create trigger Silemezsiniz on Departmanlar [/FONT]
[FONT="]for delete [/FONT]
[FONT="]as[/FONT]
[FONT="]rollback [/FONT]
[FONT="]print 'Silme Islemini Gerceklestiremezsin' [/FONT]
[FONT="] [/FONT]
[FONT="]Bundan sonra yapacağımız silme işlemini kabul etmeyecek ve Silme Islemini Gerceklestiremezsin diye bir yazı çıkacaktır karşımıza. [/FONT]
[FONT="] [/FONT]
[FONT="]delete departmanlar where departmanID=1 [/FONT]
[FONT="] [/FONT]
[FONT="]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="] [/FONT]
[FONT="]drop trigger Silemezsiniz[/FONT]
[FONT="] [/FONT]
[FONT="]Varolan bir tetikleyicinin içeriğini değiştirmek istediğimizde Alter komutundan faydalanırız. [/FONT]
[FONT="]alter trigger Silemezsiniz on Departmanlar [/FONT]
[FONT="]for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]rollback [/FONT]
[FONT="]print 'Veritabanından herhangi bir veriyi silemezsiniz [/FONT]
[FONT="] [/FONT]
[FONT="]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="] [/FONT]
[FONT="]Create Trigger Yapamazsin [/FONT]
[FONT="]On database for Alter_Table , Delete_Table [/FONT]
[FONT="]As [/FONT]
[FONT="]Print Tabloları Düzeltme veya Silme Yetkiniz Yok [/FONT]
[FONT="]Rollack [/FONT]
[FONT="] [/FONT]
[FONT="]Kodumuzu derledikten sonra Sql Server 2005 Object Browserımıza baktığımızda Triggerımızın varolduğunu göreceksiniz.
[/FONT] [FONT="]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="] [/FONT]
[FONT="]Alter Table HumanResources.Employee [/FONT]
[FONT="]Add abcd int [/FONT]
[FONT="] [/FONT]
[FONT="]Bir tablo üzerinde daha önceden yazılmış ve çalışan bir triggerın olup olmadığını öğrenmek içinse system stored procedurelerinden sp_helptrigger ı kullanırız. Örneğin Northwind veritabanımızın Employees isimli tablosunda trigger olup olmadığını öğrenmek için : [/FONT]
[FONT="]Exec sp_helptrigger Employees [/FONT]
[FONT="] [/FONT]
[FONT="]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="] [/FONT]
[FONT="]create trigger silemezsin on employees for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]declare @silinen int [/FONT]
[FONT="]set @silinen= (select count(*) from deleted) [/FONT]
[FONT="]if @silinen>1 [/FONT]
[FONT="]begin [/FONT]
[FONT="]raiserror ('bir kayıttan fazla silemezsin',16,1) [/FONT]
[FONT="]rollback transaction [/FONT]
[FONT="]end [/FONT]
[FONT="]
[/FONT] [FONT="] [/FONT]
[FONT="] [/FONT]
[FONT="]--bunu kim silmiş [/FONT]
[FONT="]create table employees_log_info [/FONT]
[FONT="](username varchar(30),tarih datetime) [/FONT]
[FONT="] [/FONT]
[FONT="]alter table employees_log_info add employeeID int [/FONT]
[FONT="] [/FONT]
[FONT="]create trigger silen on employees for delete[/FONT]
[FONT="]as [/FONT]
[FONT="]insert into employees_log_info values (user,getdate()) [/FONT]
[FONT="]select * from employees [/FONT]
[FONT="]delete employees where employeeID=70 [/FONT]
[FONT="]select * from employees_log_info [/FONT]
[FONT="] [/FONT]
[FONT="]alter trigger silen on employees for delete [/FONT]
[FONT="]as [/FONT]
[FONT="]declare @id int set @id=(select employeeID from deleted)[/FONT]
[FONT="] [/FONT]
[FONT="]insert into employees_log_info values (user,getdate(),@id)[/FONT]