>SQL Server Trigger Kullanımı

>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.


create trigger SilmeIslemi on Departmanlar
for delete
as
insert into hareket(Tarih) values (getdate())

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.

create trigger Silemezsiniz on Departmanlar
for delete
as
rollback
print ‘Silme Islemini Gerceklestiremezsin’

Bundan sonra yapacağımız silme işlemini kabul etmeyecek ve “Silme Islemini Gerceklestiremezsin” diye bir yazı çıkacaktır karşımıza.

delete departmanlar where departmanID=1

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.

drop trigger Silemezsiniz

Varolan bir tetikleyicinin içeriğini değiştirmek istediğimizde Alter komutundan faydalanırız.

alter trigger Silemezsiniz on Departmanlar
for delete
as
rollback
print ‘Veritabanından herhangi bir veriyi silemezsiniz’

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.

Create Trigger Yapamazsin
On database for Alter_Table , Delete_Table
As
Print ‘Tabloları Düzeltme veya Silme Yetkiniz Yok’
Rollack

Kodumuzu derledikten sonra Sql Server 2005 Object Browser’ımıza baktığımızda Trigger’ımızın varolduğunu göreceksiniz.

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:


Alter Table HumanResources.Employee
Add abcd int

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 :

Exec sp_helptrigger Employees

Aşağıda SQL Server 2000 ‘de varolan Northwind isimli veritabanı üzerinde örnek olarak yapılan birkaç trigger örneği mevcuttur.


create trigger silemezsin on employees for delete
as
declare @silinen int
set @silinen= (select count(*) from deleted)
if @silinen>1
begin
raiserror (‘bir kayıttan fazla silemezsin’,16,1)
rollback transaction
end

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

Advertisements

One thought on “>SQL Server Trigger Kullanımı

  1. Pingback: >SQL Server Trigger Kullanımı | Serdar Altundal

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s