14 Haziran 2013 Cuma

INSERT, UPDATE, DELETE Trigger larıyla Samimiyet Kuruşumun Hikayesidir.. :p


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
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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 UPDATE
AS
BEGIN
       DECLARE @assetGUID uniqueidentifier
       DECLARE @newPRM0 nvarchar(max)
       DECLARE @oldPRM0 nvarchar(max)
       select @assetGUID = GUID, @oldPRM0 = PRM0 FROM DELETED
       select @assetGUID = GUID,  @newPRM0 = PRM0 FROM INSERTED 
       --Eğer ASSET tablosunda PRM0 alanı güncelleniyorsa başla
       IF @newPRM0 != @oldPRM0
       BEGIN
             --Eğer INFO tablosunda PRM4 ü, güncellenen asset in GUID siyle eşit olan kayıt varsa başla
             IF 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;
             END
       END
END
USE [Harmony_v3]
GO
/****** Object:  Trigger [dbo].[asset_UpdateTrigger]    Script Date: 14.6.2013 09:20:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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 UPDATE
AS
BEGIN
       DECLARE @assetGUID uniqueidentifier
       DECLARE
             @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 uniqueidentifier
       SELECT 
             @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_PAGE
       FROM DELETED
       select
             @assetGUID = GUID
       FROM INSERTED
       INSERT 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)
END
USE [Harmony_v3]
GO
/****** Object:  Trigger [dbo].[assetDeleteTrigger]    Script Date: 14.6.2013 09:29:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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 DELETE
AS
BEGIN
       DECLARE @assetGUID uniqueidentifier
       select @assetGUID = GUID FROM DELETED
       --     Eğer silinen kayıtla ilgili INFO tablosunda kayıt varsa onları da sil
       IF EXISTS(select * from VDB_ASSET_INFORMATIONS where PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUID )
       BEGIN
             DELETE FROM VDB_ASSET_INFORMATIONS where PRM4 = @assetGUID or GUID_ASSET = @assetGUID or GUID_TYPE = @assetGUID
       END   
       --     Eğer silinen kayıtla ilgili RELATION tablosunda kayıt varsa onları da sil
       IF EXISTS(select * from VDB_ASSET_RELATIONS where GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUID)
       BEGIN
             DELETE FROM VDB_ASSET_RELATIONS where GUID_ASSET_X = @assetGUID or GUID_ASSET_Y = @assetGUID
       END   
END
USE [Harmony_v3]
GO
/****** Object:  Trigger [dbo].[subnodeManageTrigger]    Script Date: 17.6.2013 09:47:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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, DELETE
AS
BEGIN
       DECLARE @assetGUID uniqueidentifier
       DECLARE @GUID_PARENT uniqueidentifier
       DECLARE @newPRM1 smallint
       select @assetGUID = GUID, @GUID_PARENT = GUID_PARENT FROM DELETED
       select @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=0
             WHERE 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=1
             WHERE GUID = @GUID_PARENT AND PRM1 = 1
       ; ENABLE TRIGGER dbo.asset_UpdateTrigger ON VDB_ASSETS;
       END
END

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 ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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 UPDATE
AS
BEGIN 
       DECLARE
             @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 uniqueidentifier
       DECLARE @infoGUID uniqueidentifier
       SELECT 
             @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_PAGE
       FROM DELETED
       select
             @infoGUID = GUID
       FROM INSERTED
       INSERT 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 ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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 UPDATE
AS
BEGIN
       DECLARE
             @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 uniqueidentifier
       DECLARE
             @newTIMESTAMP datetime
       SELECT 
             @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_PAGE
       FROM DELETED
       SELECT @newTIMESTAMP = TIMESTAMP FROM INSERTED
       IF @oldTIMESTAMP != @newTIMESTAMP
       BEGIN
       INSERT 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)
       END
END
USE [Harmony_v3]
GO
/****** Object:  Trigger [dbo].[rel_subnodeManageTrigger]    Script Date: 17.6.2013 10:49:39 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- 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, DELETE
AS
BEGIN

       DECLARE @relationTypeId uniqueidentifier 
       DECLARE @X_ID uniqueidentifier
       DECLARE @newSUBNODE int
       DECLARE @newPRM1 int

       select @relationTypeId = GUID_RELATION_TYPE, @X_ID = GUID_ASSET_X FROM DELETED
       select @relationTypeId = GUID_RELATION_TYPE, @X_ID = GUID_ASSET_X, @newPRM1 = PRM1 FROM INSERTED

       IF 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 varsa
       ELSE
       BEGIN
       ; 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;
       END
END


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



2 yorum:

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

    YanıtlaSil
    Yanıtlar
    1. hazıra alışmışlığın verdiği üşengeçlikle bu olayı didiklemeyi "lazım olacağı zaman"a erteliyorum :P
      Paylaşı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 :)

      Sil