SQL LIFE

MS Sql DML Trigger

Merhaba;

sql server trigger kullanımı, sql server trigger işlemleri, dml trigger kullanımı


Bu yazıda konumuz sql dml trigger. Ms sql server'da  DML ( Data Manipulation Language ) yani Update,Insert,Delete işlemleri ve Create,Alter veya Drop gibi DDL ( Data Definition Language )  işlemlerinden biri gerçekleştiğinde tetiklenip çalışacak olan SQL Server objelerine Trigger denir.
Öncelikle bahsetmek gerekir ki trigger kullanırken performans sorunlarına yol açacak şekilde kullanmamaya dikkat etmeliyiz. Sonuçta bu işlem otomatik olarak çalışacak veya rutin yapılan işlemlerin bir parçası olacak bu yüzden direk performansa etki edecektir.
Peki hangi senaryolarda kullanabiliriz,örneğin bir tabloda silinen veya güncellenen kaydın kimin tarafından hangi tarihte yapıldığını loglamak için kullanabiliriz.
 
Peki başka hangi durumlara dikkat edelim ?
Eğer ki trigger’ı tetikleyen müdahale edebileceğimiz bir kod ise trigger kullanmak yerine bu işlemi T-SQL kodu ile yapmalıyız. Mesela Personel tablosuna kayıt ekliyorsak personel tablosu ile ilişkili başka bir tabloya da kayıt eklememiz gerekiyorsa bunu trigger ile yapmak fantezi olacaktır,doğru yöntem her iki işlemi de stored procedure içinde yapmak bize yönetilebilirlik açısından fayda sağlayacaktır.
 
Log’lanmayan işlemlerin yapılması trigger’ları tetiklemez. Örneğin Truncate table,WRITETEXT gibi komutlarla trigger’ların tetiklenmesi sağlanamaz.
Trigger’lar içinde çok uzun zaman alacak sorgular çalıştırmamalıyız. Bahsettiğim gibi trigger’ların tamamlanma süresi yaptığımız DML işlemlerinin süresini de etkileyecektir.
Şimdi birkaç örnek ile pekiştirelim.


 
create trigger dbo.[trig_employee_log]
on   employees
after insert,delete
as
begin
set nocount on
--insert işlemlerinin loglanması

insert  [sqllife].[dbo].[sql_life_log] 
(
operation
,employee_id
,last_name
,first_name
,optime
)
select distinct 'INSERT',i.employee_id,i.last_name,i.first_name,GETDATE() from inserted i

--delete işlemlerinin loglanması
insert  [sqllife].[dbo].[sql_life_log] 
(
operation
,employee_id
,last_name
,first_name
,optime
)
select 'DELETE',d.employee_id,d.last_name,d.first_name,GETDATE() from deleted d
end
go



DECLARE @UNIQUEX1 UNIQUEIDENTIFIER
set @UNIQUEX1=NEWID()
DECLARE @UNIQUEX2 UNIQUEIDENTIFIER
set @UNIQUEX2=NEWID()
DECLARE @UNIQUEX3 UNIQUEIDENTIFIER
set @UNIQUEX3=NEWID()

insert into sqllife.dbo.employees

values
 
(@UNIQUEX1,'hüseyin','çelik','kahrmanmaraş','9.500'),
(@UNIQUEX2,'demir','cem','istanbu','4.500'),
(@UNIQUEX3,'ortega','ariel','bitlis şehit. abd. çavuş mah. 1231 sk.','4.500');

 

delete from employees where last_name = 'ortega' or last_name = 'demir'


sql dml trigger

 

İnstead of DML Trigger’larının Oluşturulması
DML komutunun çalıştırılması yerine sadece trigger tetiklenir. Şimdi bir insert işlemi için bir instead of trigger’ı oluşurduk ve tablo üzerinde insert işlemi yapmak istediğimizde insert işlemi yerine trigger tetiklenir ve trigger’da yazdığımız kriterlere göre insert işlemi çalışır veya çalışmaz.
 


create trigger  dbo.Trig_Control_Date
on roles
instead of insert
as
set nocount on
declare @modifiedDate datetime

select @modifiedDate = inserted_date   from inserted

if(@modifiedDate < getdate())
begin
print 'Eski tarihli bir kayıt eklenemez.'
rollback
end
else
begin
insert into  sqllife..Roles 
  (role_id,role_name,inserted_date)
select role_id,role_name,inserted_date from inserted
end
go



insert into   sqllife..Roles 
values 
(newid(),'Network',DATEADD(DAY,-1,getdate()))

Serkan Ezgim Çelik sql abap ms sql
sqllife.net
Faydalı Link:
https://docs.microsoft.com/en-us/sql/relational-databases/triggers/dml-triggers?view=sql-server-2017

keywords: dml trigger, sql .
#
Ezgim Çelik
They didn't know it was impossible, so they did it - Mark Twain