Son günlerde daha önce sadece selamlaşmada kaldığım triggerlarla ilişki boyutunda tanışıp sohbet etme safhasına geçtim.. Vallahi intiba iyi..
Trigger ın türkçesi tetikleyici ve gayet de anlaşılır bir çeviri olmuş.. Tablonuza bir işlem yaparken istediğiniz başka bir işlemi tetikletmeye yarayan sql özelliği.. Cümle içinde kullanacak olursak; atıyorum,,"ben A tabloma update çekerken B tabloma da bir insert çek." in sqlcesidir trigger...
Sıfırdan nasıl yapılırı anlatmak gibi bir meziyetim yok maalesef.. Beceremem sanırım.. O yüzden ben yine bencil davranıp sadece kendime yarayayım; lazım olabilir düşüncesiyle yaptığım işleri yapıştırayım direkt.. Belki bu blog işi sarar da günün birinde diğer bloglarda olduğu gibi "tutorial" lar hazırlarım. Keza kendim çok faydalanıyorum o bloglardan. Allah onları yazanlardan, paylaşanlardan razı olsun :)
Asset tablomun triggerları;
USE [Harmony_v3]GO/****** Object: Trigger [dbo].[assetPRM0UpdateTrigger] Script Date: 14.6.2013 09:15:06 ******/SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Monolâra-- Create date: 11.6.2013-- Description: Bir Asset in PRM0 ı güncelleniyorsa; INFO tablosundaki kayıtlardan PRM4ü, güncellenen assetin GUIDsine eşit olanların PRM0 ını da güncellemeye yarar.-- =============================================ALTER TRIGGER [dbo].[assetPRM0UpdateTrigger]ON [dbo].[VDB_ASSETS]AFTER UPDATEASBEGINDECLARE @assetGUID uniqueidentifierDECLARE @newPRM0 nvarchar(max)DECLARE @oldPRM0 nvarchar(max)select @assetGUID = GUID, @oldPRM0 = PRM0 FROM DELETEDselect @assetGUID = GUID, @newPRM0 = PRM0 FROM INSERTED--Eğer ASSET tablosunda PRM0 alanı güncelleniyorsa başlaIF @newPRM0 != @oldPRM0BEGIN--Eğer INFO tablosunda PRM4 ü, güncellenen asset in GUID siyle eşit olan kayıt varsa başlaIF EXISTS(select * from VDB_ASSET_INFORMATIONS where PRM4 = @assetGUID)BEGIN; DISABLE TRIGGER dbo.info_UpdateTrigger ON VDB_ASSET_INFORMATIONS;UPDATE VDB_ASSET_INFORMATIONS SET PRM0 = @newPRM0 WHERE PRM4 = @assetGUID AND PRM1 != 0; ENABLE TRIGGER dbo.info_UpdateTrigger ON VDB_ASSET_INFORMATIONS;ENDENDENDUSE [Harmony_v3]GO/****** Object: Trigger [dbo].[asset_UpdateTrigger] Script Date: 14.6.2013 09:20:32 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Monolâra-- Create date: 12.06.2013-- Description: Update edilen kaydın update edilmeden önceki halini yedeklemeye yarar.--=============================================ALTER TRIGGER [dbo].[asset_UpdateTrigger]ON [dbo].[VDB_ASSETS]AFTER UPDATEASBEGINDECLARE @assetGUID uniqueidentifierDECLARE@oldPRM0 nvarchar(max),@oldPRM1 smallint,@oldPRM2 nvarchar(max),@oldPRM3 nvarchar(max),@oldPRM4 uniqueidentifier,@oldPRM5 nvarchar(max),@oldSUBNODE smallint,@oldSEQUENCE_NO smallint,@oldGUID_SECURITY uniqueidentifier,@oldTIMESTAMP datetime,@oldGUID_USER uniqueidentifier,@oldGUID_PAGE uniqueidentifierSELECT@oldPRM0 = PRM0,@oldPRM1 = PRM1,@oldPRM2 = PRM2,@oldPRM3 = PRM3,@oldPRM4 = PRM4,@oldPRM5 = PRM5,@oldSUBNODE = SUBNODE,@oldSEQUENCE_NO = SEQUENCE_NO,@oldGUID_SECURITY = GUID_SECURITY,@oldTIMESTAMP = TIMESTAMP,@oldGUID_USER = GUID_USER,@oldGUID_PAGE = GUID_PAGEFROM DELETEDselect@assetGUID = GUIDFROM INSERTEDINSERT INTO VDB_ASSETS(GUID, GUID_PARENT, PRM0, PRM1, PRM2, PRM3, PRM4, PRM5, SUBNODE, SEQUENCE_NO, GUID_SECURITY, TIMESTAMP, GUID_USER, GUID_PAGE)VALUES (NEWID(), @assetGUID, @oldPRM0, 0, @oldPRM2, @oldPRM3, @oldPRM4, @oldPRM5, @oldSUBNODE, @oldSEQUENCE_NO, @oldGUID_SECURITY, @oldTIMESTAMP, @oldGUID_USER, @oldGUID_PAGE)ENDUSE [Harmony_v3]GO/****** Object: Trigger [dbo].[assetDeleteTrigger] Script Date: 14.6.2013 09:29:09 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Monolâra-- Create date: 11.06.2013-- Description: Silinen assetin ilintili olduğu diğer kayıtların da silinmesine yarar.-- =============================================ALTER TRIGGER [dbo].[assetDeleteTrigger]ON [dbo].[VDB_ASSETS]AFTER DELETEASBEGINDECLARE @assetGUID uniqueidentifierselect @assetGUID = GUID FROM DELETED-- Eğer silinen kayıtla ilgili INFO tablosunda kayıt varsa onları da silIF EXISTS(select * from VDB_ASSET_INFORMATIONS where PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUID )BEGINDELETE FROM VDB_ASSET_INFORMATIONS where PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUIDEND-- Eğer silinen kayıtla ilgili RELATION tablosunda kayıt varsa onları da silIF EXISTS(select * from VDB_ASSET_RELATIONS where GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUID)BEGINDELETE FROM VDB_ASSET_RELATIONS where GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUIDENDENDUSE [Harmony_v3]GO/****** Object: Trigger [dbo].[subnodeManageTrigger] Script Date: 17.6.2013 09:47:01 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Monolâra-- Create date: 14.06.2013-- Description: Eğer assetin altında eleman varsa SUBNODE = 1, yoksa SUBNODE = 0 yapmaya yarar.-- =============================================ALTER TRIGGER [dbo].[subnodeManageTrigger]ON [dbo].[VDB_ASSETS]AFTER UPDATE, INSERT, DELETEASBEGINDECLARE @assetGUID uniqueidentifierDECLARE @GUID_PARENT uniqueidentifierDECLARE @newPRM1 smallintselect @assetGUID = GUID, @GUID_PARENT = GUID_PARENT FROM DELETEDselect @assetGUID = GUID, @GUID_PARENT = GUID_PARENT, @newPRM1 = PRM1 FROM INSERTED--SUBNODE kontrolü..--Eğer kaydın altında başka kayıt kalmadıysa subnode unu 0 yap.IF NOT EXISTS(SELECT * FROM VDB_ASSETS WHERE GUID_PARENT = @GUID_PARENT AND PRM1 = 1 )BEGIN; DISABLE TRIGGER dbo.asset_UpdateTrigger ON VDB_ASSETS;UPDATE VDB_ASSETS SET SUBNODE=0WHERE GUID = @GUID_PARENT; ENABLE TRIGGER dbo.asset_UpdateTrigger ON VDB_ASSETS;END--Eğer kayıt kaldıysa ve subnode u 1 yap.ELSE IF EXISTS(SELECT * FROM VDB_ASSETS WHERE GUID = @GUID_PARENT AND SUBNODE=0 AND PRM1 = 1 )BEGIN; DISABLE TRIGGER dbo.asset_UpdateTrigger ON VDB_ASSETS;UPDATE VDB_ASSETS SET SUBNODE=1WHERE GUID = @GUID_PARENT AND PRM1 = 1; ENABLE TRIGGER dbo.asset_UpdateTrigger ON VDB_ASSETS;ENDEND
USE [Harmony_v3]
GO
/****** Object: Trigger [dbo].[assetVirtualDeleteManageTrigger] Script Date: 17.6.2013 10:53:12 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Monolâra
-- Create date: 14.06.2013
-- Description: Sanal olarak silinen ya da aktifleştirilen asset kaydının ilintili olduğu diğer kayıtları da sanal olarak silinip aktifleştirilmesine yarar..
-- =============================================
ALTER TRIGGER [dbo].[assetVirtualDeleteManageTrigger]
ON [dbo].[VDB_ASSETS]
AFTER UPDATE
AS
BEGIN
DECLARE @assetGUID uniqueidentifier
DECLARE @oldPRM1 smallint
DECLARE @newPRM1 smallint
select @assetGUID = GUID, @oldPRM1 = PRM1 FROM DELETED
select @assetGUID = GUID, @newPRM1 = PRM1 FROM INSERTED
IF @newPRM1 = -1
BEGIN
-- Eğer sanal silinen kayıtla ilgili INFO tablosunda kayıt varsa onları da sanal olarak sil
IF EXISTS(select * from VDB_ASSET_INFORMATIONS where PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUID )
BEGIN
; DISABLE TRIGGER dbo.info_UpdateTrigger ON VDB_ASSET_INFORMATIONS;
UPDATE VDB_ASSET_INFORMATIONS SET PRM1 = -1
WHERE PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUID
; ENABLE TRIGGER dbo.info_UpdateTrigger ON VDB_ASSET_INFORMATIONS;
END
-- Eğer sanal silinen kayıtla ilgili RELATION tablosunda kayıt varsa onları da sanal olarak sil
IF EXISTS(select * from VDB_ASSET_RELATIONS where GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUID)
BEGIN
; DISABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;
UPDATE VDB_ASSET_RELATIONS SET PRM1 = -1
WHERE GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUID
; ENABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;
END
END
IF @newPRM1 = 1
BEGIN
-- Eğer aktifleştirilen kayıtla ilgili INFO tablosunda kayıt varsa onları da aktifleştir
IF EXISTS(select * from VDB_ASSET_INFORMATIONS where PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUID )
BEGIN
; DISABLE TRIGGER dbo.info_UpdateTrigger ON VDB_ASSET_INFORMATIONS;
UPDATE VDB_ASSET_INFORMATIONS SET PRM1 = 1
WHERE PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUID
; ENABLE TRIGGER dbo.info_UpdateTrigger ON VDB_ASSET_INFORMATIONS;
END
-- Eğer aktifleştirilen kayıtla ilgili RELATION tablosunda kayıt varsa onları da aktifleştir
IF EXISTS(select * from VDB_ASSET_RELATIONS where GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUID)
BEGIN
; DISABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;
UPDATE VDB_ASSET_RELATIONS SET PRM1 = 1
WHERE GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUID
; ENABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;
END
END
END
İnfo Tablomun Triggerları
USE [Harmony_v3]GO/****** Object: Trigger [dbo].[info_UpdateTrigger] Script Date: 14.6.2013 09:52:46 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Monolâra-- Create date: 12.06.2013-- Description: Update edilen kaydın update edilmeden önceki halini yedeklemeye yarar.-- =============================================ALTER TRIGGER [dbo].[info_UpdateTrigger]ON [dbo].[VDB_ASSET_INFORMATIONS]AFTER UPDATEASBEGINDECLARE@oldGUID_ASSET uniqueidentifier,@oldGUID_TYPE uniqueidentifier,@oldPRM0 nvarchar(max),@oldPRM1 smallint,@oldPRM2 nvarchar(max),@oldPRM3 nvarchar(max),@oldPRM4 uniqueidentifier,@oldPRM5 nvarchar(max),@oldSUBNODE smallint,@oldSEQUENCE_NO smallint,@oldGUID_SECURITY uniqueidentifier,@oldTIMESTAMP datetime,@oldGUID_LANGUAGE uniqueidentifier,@oldGUID_USER uniqueidentifier,@oldGUID_PAGE uniqueidentifierDECLARE @infoGUID uniqueidentifierSELECT@oldGUID_ASSET = GUID_ASSET,@oldGUID_TYPE = GUID_TYPE,@oldPRM0 = PRM0,@oldPRM1 = PRM1,@oldPRM2 = PRM2,@oldPRM3 = PRM3,@oldPRM4 = PRM4,@oldPRM5 = PRM5,@oldSUBNODE = SUBNODE,@oldSEQUENCE_NO = SEQUENCE_NO,@oldGUID_SECURITY = GUID_SECURITY,@oldTIMESTAMP = TIMESTAMP,@oldGUID_LANGUAGE = GUID_LANGUAGE,@oldGUID_USER = GUID_USER,@oldGUID_PAGE = GUID_PAGEFROM DELETEDselect@infoGUID = GUIDFROM INSERTEDINSERT INTO VDB_ASSET_INFORMATIONS(GUID, GUID_PARENT, GUID_ASSET, GUID_TYPE, PRM0, PRM1, PRM2, PRM3, PRM4, PRM5, SUBNODE, SEQUENCE_NO, GUID_SECURITY, TIMESTAMP, GUID_USER, GUID_LANGUAGE, GUID_PAGE)VALUES (NEWID(), @infoGUID, @oldGUID_ASSET, @oldGUID_TYPE, @oldPRM0, 0, @oldPRM2, @oldPRM3, @oldPRM4, @oldPRM5, @oldSUBNODE, @oldSEQUENCE_NO, @oldGUID_SECURITY, @oldTIMESTAMP, @oldGUID_USER, @oldGUID_LANGUAGE, @oldGUID_PAGE)END
Relation tablomun triggerları
USE [Harmony_v3]GO/****** Object: Trigger [dbo].[rel_UpdateTrigger] Script Date: 14.6.2013 09:55:48 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Monolâra-- Create date: 12.06.2013-- Description: Update edilen kaydın update edilmeden önceki halini yedeklemeye yarar.-- =============================================ALTER TRIGGER [dbo].[rel_UpdateTrigger]ON [dbo].[VDB_ASSET_RELATIONS]AFTER UPDATEASBEGINDECLARE@oldGUID_ASSET_X uniqueidentifier,@oldGUID_RELATION_TYPE uniqueidentifier,@oldGUID_ASSET_Y uniqueidentifier,@oldPRM1 smallint,@oldPRM2 nvarchar(max),@oldPRM3 nvarchar(max),@oldPRM4 uniqueidentifier,@oldPRM5 nvarchar(max),@oldSUBNODE smallint,@oldSEQUENCE_NO smallint,@oldGUID_SECURITY uniqueidentifier,@oldTIMESTAMP datetime,@oldGUID_USER uniqueidentifier,@oldGUID_PAGE uniqueidentifierDECLARE@newTIMESTAMP datetimeSELECT@oldGUID_ASSET_X = GUID_ASSET_X,@oldGUID_RELATION_TYPE = GUID_RELATION_TYPE,@oldGUID_ASSET_Y = GUID_ASSET_Y,@oldPRM1 = PRM1,@oldPRM2 = PRM2,@oldPRM3 = PRM3,@oldPRM4 = PRM4,@oldPRM5 = PRM5,@oldSUBNODE = SUBNODE,@oldSEQUENCE_NO = SEQUENCE_NO,@oldGUID_SECURITY = GUID_SECURITY,@oldTIMESTAMP = TIMESTAMP,@oldGUID_USER = GUID_USER,@oldGUID_PAGE = GUID_PAGEFROM DELETEDSELECT @newTIMESTAMP = TIMESTAMP FROM INSERTEDIF @oldTIMESTAMP != @newTIMESTAMPBEGININSERT INTO VDB_ASSET_RELATIONS(GUID, GUID_ASSET_X, GUID_RELATION_TYPE, GUID_ASSET_Y, PRM1, PRM2, PRM3, PRM4, PRM5, SUBNODE, SEQUENCE_NO, GUID_SECURITY, TIMESTAMP, GUID_USER, GUID_PAGE)VALUES (NEWID(), @oldGUID_ASSET_X, @oldGUID_RELATION_TYPE, @oldGUID_ASSET_Y, 0, @oldPRM2, @oldPRM3, @oldPRM4, @oldPRM5, @oldSUBNODE, @oldSEQUENCE_NO, @oldGUID_SECURITY, @oldTIMESTAMP, @oldGUID_USER, @oldGUID_PAGE)ENDENDUSE [Harmony_v3]GO/****** Object: Trigger [dbo].[rel_subnodeManageTrigger] Script Date: 17.6.2013 10:49:39 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: Monolâra-- Create date: 17.06.2013-- Description: Relation tablosunda SUBNODE kontrolü yapmaya yarar. Eğer altında eleman varsa SUBNODE=1, yoksa SUBNODE=0...-- =============================================ALTER TRIGGER [dbo].[rel_subnodeManageTrigger]ON [dbo].[VDB_ASSET_RELATIONS]AFTER UPDATE, INSERT, DELETEASBEGINDECLARE @relationTypeId uniqueidentifierDECLARE @X_ID uniqueidentifierDECLARE @newSUBNODE intDECLARE @newPRM1 intselect @relationTypeId = GUID_RELATION_TYPE, @X_ID = GUID_ASSET_X FROM DELETEDselect @relationTypeId = GUID_RELATION_TYPE, @X_ID = GUID_ASSET_X, @newPRM1 = PRM1 FROM INSERTEDIF NOT EXISTS(select * from VDB_ASSET_RELATIONS where GUID_RELATION_TYPE=@relationTypeId and PRM1 = 1 and GUID_ASSET_X = @X_ID)BEGIN; DISABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;UPDATE VDB_ASSET_RELATIONS SET SUBNODE = 0 WHERE GUID_ASSET_Y = @X_ID AND GUID_RELATION_TYPE=@relationTypeId AND PRM1 = 1 AND SUBNODE = 1; ENABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;END--Aktif kayıt varsaELSEBEGIN; DISABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;UPDATE VDB_ASSET_RELATIONS SET SUBNODE = 1 WHERE GUID_ASSET_Y = @X_ID AND GUID_RELATION_TYPE=@relationTypeId AND PRM1 = 1 AND SUBNODE = 0; ENABLE TRIGGER dbo.rel_UpdateTrigger ON VDB_ASSET_RELATIONS;ENDEND
Şimdilik bu kadar..
Bu triggerlarla samimiyeti ilerletip nimetlerinden daha çok faydalananlar çok bloglardan gördüğüm kadarıyla.. Ben de sevdim aslında ama daha çok triggerlarla, sqllerle samimi olursam WCF sevgilim kızar,, asıl onu tanımam lazım.. :( Bilmiyorum bu ilişki nereye gider,, çünkü daha security olayını bile anlamadııım...
WCF Hiç Tanımasam "WCF sevgilim" olduğunu bilmesem, ve bloğuma kafiyeli yorum yaparak, göstermiş olduğun inceliğe nezaketen buraya birşeyler yazma ihtiyacı hissetmesem, bende yorum yazmazdım; malum wcf kızar! wcf de bir class içinde birden fazla method yada fonksiyon tanımlandığı durumda bunların erişim yetkilendirmesini nasıl yaptığını biliyorsundur heralde...
YanıtlaSilclass users
{
createUser();
GetUser();
DeleteUser();
}
user class'ı içinde 3 tane method tanımlanmış ben istiyorumki kısaca monolâra, Monalisa,Alirıza , üye oluşturabilme ve üye listesi alma yetkisine sahip olucak
Ben ve Arkadaşım sadece silme yetkisine sahip olucak bu yöntemin adı
class seviyesinde yetkilendirme class seviyesinde Authentication ve authorization güvenliğidir..
wcf' e Benden selam söyle...
hazıra alışmışlığın verdiği üşengeçlikle bu olayı didiklemeyi "lazım olacağı zaman"a erteliyorum :P
SilPaylaşım için teşekkür ederim, bu da notlarımda bulunsun.. Eğer basit seviyede güvenliği halledersem class seviyesine de geçeriz evelallah :)
Bu arada wcfciğim rakip göreceği elemanlara karşı kıskançlık besler belki, sen rakibi olamazsın,, yani her daim yorum yazabilirsin benim ilk yorumcum :P Üstelik kendisinden bahsettiğin için wcfciğimin onore olduğundan eminim :)