SQL Server Tetikleyicileri

Merhabalar bu yazımda elimden geldiğince bahsedeceğim konu Trigger’lar 🙂 Genel olarak trigger yada Türkçe kullanacak olursak tetikleyiciler belirlediğimiz bir olay, bir durum meydana geldiği zaman yine bizim tarafımızdan belirlenen işlemleri yerine getiren, uygulayan bir kılavuzdur.

SQL Server’larda trigger’ı ele alacak olursak; tablolar üzerinde bir işlem gerçekleştiğinde ne yapacağımızı belirlediğimiz alanda kullanılır. Şimdi trigger türlerine bakalım.

DML (Data Manipulation Language) Trigger : INSERT, UPDATE, DELETE işlemleri sonrası devreye giren trigger’lardır.

DDL (Data Definition Language) Trigger : CREATE, ALTER, DROP işlemleri kullanıldığında devreye girer.

Logon Trigger : Login işlemleri sırasında devreye girer. Güvenlik ve kontrol amaçlı kullanılır.

Şimdi sırasıyla 3 bölümü açalım. İlk olarak DML triggerlar ile başlayabiliriz.

DML Triggerlar 2 çeşit olarak sınıflandırılmaktadır. Bunlar After Trigger ve Instead Of Triggerlardır.

After Triggerlar tablomuzda insert, update, delete işlemleri sonrasında kullanılmak içindir.

Instead of Triggerları ise insert, update, delete işlemlerini atlar ve direk tetikleyicide belirlediğimiz ifadeleri işlemeye koyar.

Yapı aşağıdaki şekilde olmalıdır.

CREATE TRIGGER trigger_name
ON table_name
{FOR |AFTER | INSTEAD OF}
{[INSERT],[UPDATE],[DELETE]}
AS
{sql_statements}

trigger_name : tetikleyiciye vereceğimiz ad.

table_name : tetikleyicinin çalışacağı tablo adı

for , after : for yalnızca INSERT işleminde devreye girer. after ise INSERT ve DELETE işleminde çalışır.

sql_statements: trigger sonrası işleyecek t-sql kodlarımız

Şimdi örnek yapalım ;

CREATE TRIGGER USER_CONTROL
ON USER
FOR INSERT
AS
DECLARE @USER_ID INT
SELECT @USER_ID=USER_ID FROM INSERTED
IF EXISTS(SELECT * FROM USER WHERE USER_ID=@USER_ID)
	BEGIN
		PRINT 'User with the same id already exists.'
		ROLLBACK
	END

Bu örnekte yeni kaydolan kullanıcı eğer tabloda var ise begin kısmında belirlediğimiz trigger sonucu devreye girecektir.

DDL Trigger için yapı aşağdaki şekilde olmalıdır.

CREATE TRIGGER trigger_name
ON { DATABASE |  ALL SERVER }
[WITH ddl_trigger_option]
FOR {event_type | event_group }
AS {sql_statement}

trigger name: belirleyeciğimiz tetikleyici adımız.

DATABASE | ALL SERVER : tetikleyicimizin çalışacağı database, server, tablo yada view adı.

eventtype | eventgroup : tetikleyicimizin hangi durumlarda çalışacağını belirlediğimiz bölümdür. (INSERT, UPDATE, DELETE)

sql_statement : ve olay gerçekleştiği zaman işleme alınacak sql kodlarımız.

İlk örneğimizi yapalım,aşağıda oluşturacamız trigger alter ve drop işlemleri veritabanı üzerinde çalıştığında @message içerisinde belirlediğimiz alanı ekrana yazdıracak.

CREATE TRIGGER user_add_trigger
ON DATABASE
FOR	
    ALTER_TABLE, 
    DROP_TABLE
AS
BEGIN
    DECLARE @Message VARCHAR(MAX)
	SET @Message='The tables in the test database have been modified.'
	PRINT @Message
END

Logon Trigger Örneğimize Başlayalım. Yapı Aşağıdaki Gibi ;

CREATE OR ALTER TRIGGER trigger_name
ON ALL SERVER 
FOR LOGON
AS
BEGIN
   sql_statement
END

Daha önceki trigger yapılarıyla aynı bir yapıya sahip. login olayına yanıt olarak begin ve end kısımları arasındaki t-sql kodlarımız çalışacaktır.

İlk örneğimizle daha kolay anlayacağız… ;

CREATE TRIGGER logon_trigger_test
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @Error varchar(100)
SET @Error='Ufuk can only connected during certain hours.'
 
IF (( ORIGINAL_LOGIN() = 'ufuk')
AND
((DATEPART(HOUR, GETDATE()) BETWEEN 17 AND 24)
OR
(DATEPART(HOUR, GETDATE()) BETWEEN 0 AND 8)
))
BEGIN
PRINT @Error
ROLLBACK
END

Yukarıdaki örneğimde ufuk kullanıcısını sabah 9.00 ila akşam 17.00 a kadar olan zaman aralığında login izni ile ilgili bir trigger oluşturduk. ve @Error ile ona bir uyarı gönderdik.

Yazdığım yazılar umarım işinize yarıyordur. Sağlıkla kalın…

sqlservertutorial

docs.microsoft

mssqltips

© 2020 ufukcam • Crafted with ❤️ by W3Layouts and Gatsby