none
Trigger ile 2 tablo arasında bağlantı kurmak RRS feed

  • Genel Tartışma

  • 2 Adet tablom var ve bu tablolar arasında trigger ile bir ilişki kurmak istiyorum yapmaya çalıştığım şey misal müşteri tablosundaki musteriId ile detaylar tablosunda detayMusteriId yi aynı değerler girilmesi lazım bunu da triggerla yapmak istiyorum.

    denediğim Kod :

    GO
    CREATE TRIGGER [Ornek]
    	ON [dbo].[Detaylar]
        AFTER INSERT
        AS
    	DECLARE @id int
    	SELECT @id = Id FROM inserted
        BEGIN
            UPDATE Detaylar SET detayMusteriId= Musteri.musteriId WHERE Id = @id	
        END

    fakat bu kod bloğunu yazdığımda çalışmıyor nasıl yazmalıyım.

    Yardımınızdan ötürü şimdiden teşekkür ederim...

    NOT: Trigger konusunu internette araştırmalar yaptım ancak mantığını henüz tam olarak kavrayamadım bundan dolayı anlatımınızı basit bir şekilde yapabilirseniz bundan memnuniyet duyarım...



    19 Ekim 2020 Pazartesi 09:13

Tüm Yanıtlar

  • Asil yapmak amacinizi anlatmaniz daha iyi olurdu. Sizin kodunuz hatali oldugu icin, aslinda ne yapmak istediginiz belli degil :(

    detayMusteriId= Musteri.musteriId

    Buradaki Musteri.MusteriID nereden gelecek ki? Hata verir. Normal olarak Detaylar'a insert ederken zaten detayMusteriId'nin Musteri.musteriID olmasi gerekmiyor mu? (foreign key). Onun disinda delete\update rule ile kontrol edersiniz.



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


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.


    19 Ekim 2020 Pazartesi 12:54
    Yanıtlayıcı
  • Daha detaylı anlatmalıydım haklısınız şöyle söyleyeyim o halde;

    en temelinde bir kayıt programı yapıyorum

    Müşteriler tablosunun içinde 

    id , müşteriId, müşteri ad, tc ve tel no su var

    detaylar tablosundada

    id, detayId, DetayMusteriId, başlagıç tarihi

    falan diye gidiyor işte normalde bunları tek bir tablonun üzerinde yapabilirim fakat ileriye dönük olarak yapmak istedim ve 2 tablo şeklinde yaptım şimdi ben müşteriyi kayıt ettiğimde haliyle  iki tablom olduğu için dolayısıyla bunları birleştirmem gerekiyor. Müşteriler tablosunda 1 tane trigger ekledim bu trigger id ye hangi sayı yazarda müşteriId dede o yazacak (id si 1 ise müşteriid side 1 oluyor, id si 10 ise müşteriid side 10 oluyor) şeklinde aynısını detaylarada ekledim id de hangi sayı yazarsa o sayı detayid dede yazacak ancak benim sizde yönelmiş olduğum soruda burada devreye giriyor ben müşteriler tablosundaki müşteriid nin içinde yazan sayıyı detaymüşteriId içerisine yazmam gerekiyorki tablolar arasında bir bağlantı kurabiliyim şimdi sorunuma gelicek olursam yukardaki kod bloğunu yazmıştım ve hata alıyordum bu arada bunu vs nin içindeki ms sql veritanıyla yapıyorum eğer sorunumu tam olarak açıklayabilmiş isem yardımınızı rica ediyorum...  




    • Düzenleyen BayGri 19 Ekim 2020 Pazartesi 14:24
    19 Ekim 2020 Pazartesi 14:19
  • Tablo tasarimlariniz biraz tekrarlayici (redundant) bir yapida ve SQL serisi veritabanlarinda bu pek de istenen bir sey degil, sonucta tablolar sizin siz bilirsiniz. Soylesi daha uygun olurdu:

    Musteriler:
    MusteriID, Ad, tc ...

    Detaylar:

    detayID, MusteriID, ...

    Yani iki tabloda da trigger ile kopyelediginiz Id tekrarliyor (redundant). Normalde her iki tabloda o tablonun primary key olan tek bir ID (MusteriId, DetayID) olmasi daha uygun.

    Sorunuza gelince, onun triggerlik bir yani yok. Detaylar'a kayit yaparken, zaten elinizde bir MusteriId olmasi lazim.



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


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    19 Ekim 2020 Pazartesi 15:43
    Yanıtlayıcı
  • demek istediğiniz şeyi anladım ve evet gereksiz tekrarlama yaptığımı şuan kabul ediyorum henüz veritabanı hakkında çok bir bilgiye sahip değilim sql komutlarını biliyorum ama düzen konusunda fazla bir bilgim bulunmamakta ancak yapmaya çalıştığım şeyi trigger ile nasıl yaparım bana bunun çözümünü söyleyebilir misiniz ? Bu benim için bir + olacak bu şekilde düşünün ama sizin söylediğinizide anladım fakat ilerde bir sorun oluştuğunda sizin söylediğiniz yöntem kesin bir yöntem gibi gelmiyor bana, elbette dediğiniz şeyde haklısınız tabloları yeniden tasarladığımda her  tabloya eklenen id 1 er 1 er artacak ve buda diğer tablodaki sayı ile eşleşecek, bu sonucu kesin gibi gözüküyor ve bu şekilde gözüktüğünden dolayı her hangi bir güvenlik oluşturmaya gerek duymazdım ancak farz edin hani ilerleyen vakitlerde bir sorun olduğunda ve bu sorun buradan doğacak olsa gene bu forma gelip aynı şeyleri sormam gerekir ve buda can sıkıcı bir durum olmaz mı sizce ? hani olmaz olmaz deriz ama olabilir sonuçta bundan ötürü sizden bu istediğim şeyi trigger ile nasıl yapabileceğimi söylemenizi rica ediyorum...
    19 Ekim 2020 Pazartesi 16:47
  • Anlasamiyoruz :) Cok farazi konusuyorsunuz. Benim soyledigim hangi yontem kesin gelmiyor? Ben bir yontem soylemedim ki.

    ID'lerin birer birer artip eslesmesinden ne kastettiginizi de anlayamadim. Bir tablodaki ID digeriyle neden eslessin ki? Eslesse de ilgisi var mi ki? Yani burada XY Problemi diye bilinen durumla ugrasiyoruz gibi geldi.

    Ben diyorum ki, Detaylardaki MusteriID'nin triggerlik bir durumu yok. Benim anladigim, detaylar 1-* (0...N) iliskideki * tarafi.  



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


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    19 Ekim 2020 Pazartesi 19:26
    Yanıtlayıcı
  • :) son olarak şu şekilde yazayım o halde 1 .tablodaki her hangi bir a değerimi trigger ile 2 .tablodaki herhangi bir b değerinin yerine yazmak istiyorum en kısa haliyle bu şekilde söyleyebilirim sanırım, bunu nasıl yapabilirim ?

    Şimdiden yardımınız için teşekkür ederim...

    20 Ekim 2020 Salı 07:39
  • :) son olarak şu şekilde yazayım o halde 1 .tablodaki her hangi bir a değerimi trigger ile 2 .tablodaki herhangi bir b değerinin yerine yazmak istiyorum en kısa haliyle bu şekilde söyleyebilirim sanırım, bunu nasıl yapabilirim ?

    Şimdiden yardımınız için teşekkür ederim...

    Gercekten anlasamadik. Yaptiginizin mantikli bir islem olmadigini anlatmaya calistim ama basaramadim sanirim. Hic olmazsa "kismi" olarak dogru gordugum sekliyle yazayim:

    CREATE TRIGGER [trgMusteriInsert]
    	ON [dbo].[Musteriler] -- Detaylarda bir trigger'a anlam veremiyorum
        AFTER INSERT
        AS
        BEGIN
            insert into Detaylar (MusteriId)
            SELECT musteriId 
            FROM inserted; 
        END

    Bu da DBFiddle demosunun linki.



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


    Not: Temelin geri zekali arkadasi Idris bu mesaja da atlayip ne kadar aptal oldugunu bir kez daha belgeleyebilir. Kendisinin tek marifeti beni takip edip, neden her soruya cevap verdigimi, yardim etmeye calistigimi sorgulamaktir. Bu beyinsiz zavalliya, aptal oldugunu hatirlatmayi unutmayiniz.

    20 Ekim 2020 Salı 13:32
    Yanıtlayıcı