none
C# Neden Trigger'ı tetiklemiyor? RRS feed

  • Soru

  • Merhaba

    bir tabloya update, delete ve insert triggerları yazdım.

    c# üzerinden tabloya insert işlemi yaptığımda stok kısmında düşüş başarılı bir şekilde oluyor.  Bunda sorun yok.

    ancak yine C# üzerinden delete işlemi yaptığımda Delete trigger'i tetiklenmiyor.

    (Bu arada delete işleminide stored procedure ile yapıyorum C# üzerinden)

    ama sql den yeni sorgu deyip delete işlemi yaptığımda trigger tetikleniyor ve görevini yerine getiriyor.

    Bu durumun sebebi nedir ve nasıl çözebilirim?

    trigger ı aşağıya ekledim.

    GO
    ALTER trigger [dbo].[trg_StokTakip3]
    on [dbo].[ServisIslemlerSub]
    after delete
    as
    declare @UrunId int
    declare @ServisID bigint
    declare @ServisTipID int
    declare @MontajYapilmaDurum bit
    select @UrunId=ServisUrunID, @ServisID=ServisID, @MontajYapilmaDurum=MontajYapilmaDurum from deleted
    select @ServisTipID=ServisTipID from ServisIslemler where ServisID=@ServisID

    IF @ServisTipID=1 and @MontajYapilmaDurum=1
    BEGIN

    update ServisProduc set UrunMevcudu+=1 where ServisProducID=@UrunId
    END
    ELSE if @ServisTipID=2 and @MontajYapilmaDurum=1
    BEGIN

    update MontajUrun set UrunMevcudu+=1 where MontajUrunID=@UrunId
    end

    23 Aralık 2019 Pazartesi 12:08

Yanıtlar

Tüm Yanıtlar

  • Trigger hatali gibi:

    ALTER TRIGGER [dbo].[trg_StokTakip3]
    ON [dbo].[ServisIslemlerSub]
    AFTER DELETE
    AS
    BEGIN
        UPDATE sp
        SET UrunMevcudu += 1
        FROM ServisProduc sp
            INNER JOIN deleted d
                ON d.ServisUrunId = sp.ServisProducID
            INNER JOIN ServisIslemler si
                ON d.ServisId = si.ServisId
        WHERE d.MontajYapilmaDurum = 1
              AND si.ServisTipId = 1;
    
        UPDATE mu
        SET UrunMevcudu += 1
        FROM MontajUrun mu
            INNER JOIN deleted d
                ON d.ServisUrunId = mu.MontajUrunID
            INNER JOIN ServisIslemler si
                ON d.ServisId = si.ServisId
        WHERE d.MontajYapilmaDurum = 1
              AND si.ServisTipId = 2;
    END;

    Bunun disinda sanırım SP ve C# kodlarını görmekte fayda var.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    23 Aralık 2019 Pazartesi 15:13
  • trigger hatalı olsa sql management studio üzerinde delete işlemi yaptığımda çalışmaz.

    sorunun C# kısmından kaynaklandığını tespit ettim.

    silme işlemini içinde farklı tabloların da bulunduğu stored procedure üzerinden toplu olarak yaptırıyordum.

    bunu iptal edip triggerin tetiklenmesini istediğim tablodaki silme işlemi için ayrı bir datacontext belirledim. sorun çözüldü...

    ama hala anlamış değilim neden toplu işlemlerde yada stored procedure ile yapılan delete işleminde trigger tetiklenmiyor. bu çok saçma...

    C#

    ---------------

    dbServisDataContext dbt = new dbServisDataContext();
    var y = dbt.ServisIslemlerSubs.Where(c => c.ServisID == DeleteServisID);
    dbt.ServisIslemlerSubs.DeleteAllOnSubmit(y);
    dbt.SubmitChanges();

    db = new dbServisDataContext();
    var x = db.ServisIslemlers.Where(c => c.ServisID == DeleteServisID);
    db.ServisIslemlers.DeleteAllOnSubmit(x);
    db.SubmitChanges();

    var z = db.CariBorcs.Where(c => c.ServisID == DeleteServisID);
    db.CariBorcs.DeleteAllOnSubmit(z);
    db.SubmitChanges();

    var q = db.CariTahsilats.Where(c => c.ServisID == DeleteServisID);
    db.CariTahsilats.DeleteAllOnSubmit(q);
    db.SubmitChanges();

    23 Aralık 2019 Pazartesi 15:47
  • Triggerin hatalı olması SSMS uzerinde calismasina engel degil. Tek bir kayıt silersiniz ve calisir, bu hatasız demek degil. N tane silerek denediniz mi? C# kodunuzda bulduğunuzu söylediğiniz hata buna bağlı gorunuyor. 



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    23 Aralık 2019 Pazartesi 16:50
  • tamam trigger yukarıda..

    hata tam olarak nerde.

    yani anladığım kadarıyla birden fazla kaydı silmek istediğimde böyle bir sıkıntı ortaya çıkıyor.

    trigger ı nasıl tasarlamam gerekiyor?

    23 Aralık 2019 Pazartesi 19:22
  • Yazdim yukarıda.


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    23 Aralık 2019 Pazartesi 19:57
  • denedim çalışmadı.

    C# kodu;

       db = new dbServisDataContext();
        db.Sp_Delete_ServisIslemler(DeleteServisID);    
        db.SubmitChanges();

    Sp;

    ALTER proc [dbo].[Sp_Delete_ServisIslemler]
    (
    @ServisID bigint

    )
    as
    begin 
    delete ServisIslemler where ServisID=@ServisID
    delete ServisIslemlerSub where ServisID=@ServisID
    delete CariBorc where ServisID=@ServisID
    delete CariTahsilat where ServisID=@ServisID
    End

    23 Aralık 2019 Pazartesi 20:16
  • Tablo yapilarinizi, içlerinde biraz veri ile kod olarak verebilirseniz bakalım.

    Not: Linq ile ExecuteCommand deneyin.



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.


    • Düzenleyen CetinBasoz 23 Aralık 2019 Pazartesi 20:23
    23 Aralık 2019 Pazartesi 20:20
  • USE [OnayServis]
    GO
    /****** Object:  Table [dbo].[MontajUrun]    Script Date: 23.12.2019 23:26:21 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[MontajUrun](
    	[MontajUrunID] [int] IDENTITY(1,1) NOT NULL,
    	[MontajUrunModelID] [int] NULL,
    	[MontajUrunGrupID] [int] NULL,
    	[UrunMarkasi] [nvarchar](100) NULL,
    	[UrunAciklama] [nvarchar](100) NULL,
    	[GarantiSuresi] [int] NULL,
    	[OlusturmaTarihi] [datetime] NULL,
    	[DuzenlemeTarihi] [datetime] NULL,
    	[UrunMevcudu] [int] NULL,
    	[Durum] [bit] NULL,
     CONSTRAINT [PK_MontajUrun] PRIMARY KEY CLUSTERED 
    (
    	[MontajUrunID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[ServisIslemler]    Script Date: 23.12.2019 23:26:21 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ServisIslemler](
    	[ServisID] [bigint] IDENTITY(1,1) NOT NULL,
    	[ServisTipID] [int] NULL,
    	[CariID] [int] NULL,
    	[ServisAciklama] [nvarchar](200) NULL,
    	[MusteriTaahhut] [nvarchar](200) NULL,
    	[ServisTutar] [decimal](18, 2) NULL,
    	[AlinanPesinat] [decimal](18, 2) NULL,
    	[KalanTutar] [decimal](18, 2) NULL,
    	[OdemeSekilID] [int] NULL,
    	[OdemeDurumID] [int] NULL,
    	[IslemTarihi] [datetime] NULL,
    	[SonrakiZiyaretTarihi] [datetime] NULL,
    	[IslemGarantiDurum] [bit] NULL,
    	[OlusturmaTarihi] [datetime] NULL,
    	[DuzenlemeTarihi] [datetime] NULL,
    	[SatisYapanPersonel] [int] NULL,
    	[MontajYapanPersonel] [int] NULL,
    	[MontajYapildi] [bit] NULL,
    	[Durum] [bit] NULL,
     CONSTRAINT [PK_ServisIslemler] PRIMARY KEY CLUSTERED 
    (
    	[ServisID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[ServisIslemlerSub]    Script Date: 23.12.2019 23:26:21 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ServisIslemlerSub](
    	[ServisSubID] [bigint] IDENTITY(1,1) NOT NULL,
    	[ServisID] [bigint] NULL,
    	[CariID] [int] NULL,
    	[ServisUrunID] [int] NULL,
    	[MontajTarihi] [datetime] NULL,
    	[SonrakiMontajTarihi] [datetime] NULL,
    	[MontajYapilmaDurum] [bit] NULL,
    	[HatirlatmaDurum] [bit] NULL,
     CONSTRAINT [PK_SerisIslemlerSub] PRIMARY KEY CLUSTERED 
    (
    	[ServisSubID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[ServisProduc]    Script Date: 23.12.2019 23:26:21 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ServisProduc](
    	[ServisProducID] [int] IDENTITY(1,1) NOT NULL,
    	[ServisProducName] [nvarchar](100) NULL,
    	[ServisProducDegisimPeriyod] [int] NULL,
    	[OlusturmaTarihi] [datetime] NULL,
    	[DuzenlemeTarihi] [datetime] NULL,
    	[UrunMevcudu] [int] NULL,
    	[Durum] [bit] NULL,
     CONSTRAINT [PK_ServisProduc] PRIMARY KEY CLUSTERED 
    (
    	[ServisProducID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    /****** Object:  Table [dbo].[ServisTip]    Script Date: 23.12.2019 23:26:21 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[ServisTip](
    	[ServisTipID] [int] IDENTITY(1,1) NOT NULL,
    	[ServisTipAd] [nvarchar](50) NULL,
    	[Durum] [bit] NULL,
     CONSTRAINT [PK_ServisTip] PRIMARY KEY CLUSTERED 
    (
    	[ServisTipID] ASC
    )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    ) ON [PRIMARY]
    
    GO
    SET IDENTITY_INSERT [dbo].[MontajUrun] ON 
    
    INSERT [dbo].[MontajUrun] ([MontajUrunID], [MontajUrunModelID], [MontajUrunGrupID], [UrunMarkasi], [UrunAciklama], [GarantiSuresi], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (1, 1, 1, N'DİSCOVERY WATER İRONİC
    ', N'Aciklama', 24, CAST(0x0000AB2100000000 AS DateTime), NULL, 0, 1)
    INSERT [dbo].[MontajUrun] ([MontajUrunID], [MontajUrunModelID], [MontajUrunGrupID], [UrunMarkasi], [UrunAciklama], [GarantiSuresi], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (2, 1, 1, N'DİSCOVERY LİFE 5A
    ', N'Aciklama', 24, CAST(0x0000AB2100000000 AS DateTime), CAST(0x0000AB1F0053C68A AS DateTime), -1, 1)
    INSERT [dbo].[MontajUrun] ([MontajUrunID], [MontajUrunModelID], [MontajUrunGrupID], [UrunMarkasi], [UrunAciklama], [GarantiSuresi], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (3, 1, 1, N'DİSCOVERY LİFE 6A
    ', N'Aciklama', 24, CAST(0x0000AB2100000000 AS DateTime), NULL, 0, 1)
    INSERT [dbo].[MontajUrun] ([MontajUrunID], [MontajUrunModelID], [MontajUrunGrupID], [UrunMarkasi], [UrunAciklama], [GarantiSuresi], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (4, 2, 1, N'DİSCOVERY SEMBOL
    ', N'Aciklamaa', 24, CAST(0x0000AB2100000000 AS DateTime), CAST(0x0000AB1F002DECF7 AS DateTime), 0, 1)
    INSERT [dbo].[MontajUrun] ([MontajUrunID], [MontajUrunModelID], [MontajUrunGrupID], [UrunMarkasi], [UrunAciklama], [GarantiSuresi], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (5, 2, 1, N'AQUA SEBİL ARITMA
    ', N'Aciklama', 24, CAST(0x0000AB2100000000 AS DateTime), NULL, 0, 1)
    SET IDENTITY_INSERT [dbo].[MontajUrun] OFF
    SET IDENTITY_INSERT [dbo].[ServisIslemler] ON 
    
    INSERT [dbo].[ServisIslemler] ([ServisID], [ServisTipID], [CariID], [ServisAciklama], [MusteriTaahhut], [ServisTutar], [AlinanPesinat], [KalanTutar], [OdemeSekilID], [OdemeDurumID], [IslemTarihi], [SonrakiZiyaretTarihi], [IslemGarantiDurum], [OlusturmaTarihi], [DuzenlemeTarihi], [SatisYapanPersonel], [MontajYapanPersonel], [MontajYapildi], [Durum]) VALUES (1, 2, 1, N'', N'', CAST(0.00 AS Decimal(18, 2)), CAST(0.00 AS Decimal(18, 2)), CAST(0.00 AS Decimal(18, 2)), 1, 1, CAST(0x0000AB2C00000000 AS DateTime), NULL, 1, CAST(0x0000AB2C018134AF AS DateTime), NULL, 1, 2, 1, 1)
    INSERT [dbo].[ServisIslemler] ([ServisID], [ServisTipID], [CariID], [ServisAciklama], [MusteriTaahhut], [ServisTutar], [AlinanPesinat], [KalanTutar], [OdemeSekilID], [OdemeDurumID], [IslemTarihi], [SonrakiZiyaretTarihi], [IslemGarantiDurum], [OlusturmaTarihi], [DuzenlemeTarihi], [SatisYapanPersonel], [MontajYapanPersonel], [MontajYapildi], [Durum]) VALUES (2, 1, 1, N'', N'', CAST(0.00 AS Decimal(18, 2)), CAST(0.00 AS Decimal(18, 2)), CAST(0.00 AS Decimal(18, 2)), 0, 1, NULL, CAST(0x0000ABE300000000 AS DateTime), 1, CAST(0x0000AB2C018134BA AS DateTime), NULL, 1, NULL, 0, 1)
    SET IDENTITY_INSERT [dbo].[ServisIslemler] OFF
    SET IDENTITY_INSERT [dbo].[ServisIslemlerSub] ON 
    
    INSERT [dbo].[ServisIslemlerSub] ([ServisSubID], [ServisID], [CariID], [ServisUrunID], [MontajTarihi], [SonrakiMontajTarihi], [MontajYapilmaDurum], [HatirlatmaDurum]) VALUES (1, 1, 1, 2, CAST(0x0000AB2C00000000 AS DateTime), NULL, 1, 0)
    INSERT [dbo].[ServisIslemlerSub] ([ServisSubID], [ServisID], [CariID], [ServisUrunID], [MontajTarihi], [SonrakiMontajTarihi], [MontajYapilmaDurum], [HatirlatmaDurum]) VALUES (2, 2, 1, 1, NULL, CAST(0x0000ABE300000000 AS DateTime), 0, 1)
    SET IDENTITY_INSERT [dbo].[ServisIslemlerSub] OFF
    SET IDENTITY_INSERT [dbo].[ServisProduc] ON 
    
    INSERT [dbo].[ServisProduc] ([ServisProducID], [ServisProducName], [ServisProducDegisimPeriyod], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (1, N'İLK 3 FİLTRE', 6, CAST(0x0000AB1F00000000 AS DateTime), CAST(0x0000AB1F0053A554 AS DateTime), 0, 1)
    INSERT [dbo].[ServisProduc] ([ServisProducID], [ServisProducName], [ServisProducDegisimPeriyod], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (2, N'MEMBRAN', 24, CAST(0x0000AB1F0053A554 AS DateTime), CAST(0x0000AB1F0053A554 AS DateTime), 0, 1)
    INSERT [dbo].[ServisProduc] ([ServisProducID], [ServisProducName], [ServisProducDegisimPeriyod], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (3, N'TATLANDIRICI FİLTRE', 12, CAST(0x0000AB1A00000000 AS DateTime), CAST(0x0000AB1F0053A554 AS DateTime), 0, 1)
    INSERT [dbo].[ServisProduc] ([ServisProducID], [ServisProducName], [ServisProducDegisimPeriyod], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (4, N'MİNERAL FİLTRE', 12, CAST(0x0000AB1A00000000 AS DateTime), CAST(0x0000AB1F0053A554 AS DateTime), 0, 1)
    INSERT [dbo].[ServisProduc] ([ServisProducID], [ServisProducName], [ServisProducDegisimPeriyod], [OlusturmaTarihi], [DuzenlemeTarihi], [UrunMevcudu], [Durum]) VALUES (5, N'ALKALİ FİLTRE', 12, CAST(0x0000AB2200C0D133 AS DateTime), CAST(0x0000AB1F0053A554 AS DateTime), 0, 1)
    SET IDENTITY_INSERT [dbo].[ServisProduc] OFF
    SET IDENTITY_INSERT [dbo].[ServisTip] ON 
    
    INSERT [dbo].[ServisTip] ([ServisTipID], [ServisTipAd], [Durum]) VALUES (1, N'BAKIM', 1)
    INSERT [dbo].[ServisTip] ([ServisTipID], [ServisTipAd], [Durum]) VALUES (2, N'MONTAJ', 1)
    INSERT [dbo].[ServisTip] ([ServisTipID], [ServisTipAd], [Durum]) VALUES (3, N'NAKİL MONTAJ', 1)
    INSERT [dbo].[ServisTip] ([ServisTipID], [ServisTipAd], [Durum]) VALUES (4, N'PİYASA MONTAJ', 1)
    SET IDENTITY_INSERT [dbo].[ServisTip] OFF
    

    23 Aralık 2019 Pazartesi 20:27
  • Benim verdigim trigger ile calisiyor, ancak SP'de bir mantik hatası var. Silme islemini once ServisIslemler, sonra ServisIslemlerSub'dan yapmissiniz. Siralamayi degistirirseniz calisiyor (yoksa trigger'da kullanilan kayit silinmis durumda oluyor):

    using (SqlConnection cn = new SqlConnection(@"server=.\SQLexpress;trusted_connection=yes;database=OnayServis"))
    using (SqlCommand cmd = new SqlCommand("Sp_Delete_ServisIslemler", cn))
    {
    	cmd.CommandType = CommandType.StoredProcedure;
    	cmd.Parameters.Add("@ServisID", SqlDbType.BigInt).Value = 1;
    	cn.Open();
    	cmd.ExecuteNonQuery();
    	cn.Close();
    }



    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.



    • Düzenleyen CetinBasoz 23 Aralık 2019 Pazartesi 21:31
    • Yanıt Olarak İşaretleyen 315180 23 Aralık 2019 Pazartesi 21:37
    23 Aralık 2019 Pazartesi 21:30
  • evet sp deki sıralamayı değiştirdim.

    herşey yoluna girdi. çok teşekkür ederim. emekleriniz için

    sıralama neden çalışmasını bozuyor trigger'ın neticede o tabloda bir delete işlemi gerçekleşiyor.

    23 Aralık 2019 Pazartesi 21:38
  • Bozuyor çünkü triggerdaki islem o tablodaki kayda bagimli. Oysa trigger oncesi o kayıt gitmis oluyor. Yani hiç SP kullanmadan da, once orada silip, arkasından digeride silerseniz bir etkisi olmayacak.


    How to create a Minimal, Reproducible Example
    The way to Go.
    World's most advanced open source (object-) relational Database.
    Flutter (for mobile, for web & desktop.

    • Yanıt Olarak İşaretleyen 315180 23 Aralık 2019 Pazartesi 21:56
    23 Aralık 2019 Pazartesi 21:43
  • çok iyi anladım.

    teşekkür ederim hocam.

    23 Aralık 2019 Pazartesi 21:57