Arkadaşlar şu şekilde bir triger var ben burda şunu yapmak istedim, Kullanıcı Vergi No ve TC Kimlik No boş geçmeyecek Vergi No yazmamışsa TC Kimlik No boş geçmeyecek, Vergi No yazılmışsa TC Kimlik No boş geçebilecek. Yardımcı olabilecek misiniz?
CREATE TRIGGER [dbo].[BIOSOFT_CARI_KONTROL]
ON [dbo].[TBLCASABIT,TBLCASABITEK] FOR INSERT AS
BEGIN
DECLARE @BioSoft_Kontrol VARCHAR(300)
IF(SELECT COUNT(*)
FROM INSERTED
WHERE (VERGI_NUMARASI IS NULL OR VERGI_NUMARASI=''))>0
BEGIN
SET @BioSoft_Kontrol = 'MSSQLVALIDATION'+'VERGI NO BOS GECILEMEZ !'
RAISERROR (@BioSoft_Kontrol, 16, 1)
ROLLBACK
END
IF(SELECT COUNT(*)
FROM INSERTED
WHERE (VERGI_DAIRESI IS NULL OR VERGI_DAIRESI=''))>0
BEGIN
SET @BioSoft_Kontrol = 'MSSQLVALIDATION'+'VERGI DAIRESI BOS GECILEMEZ !'
RAISERROR (@BioSoft_Kontrol, 16, 1)
ROLLBACK
END
IF(SELECT COUNT(*)
FROM INSERTED
WHERE (TBLCASABITEK.TCKIMLIKNO IS NULL OR TBLCASABITEK.TCKIMLIKNO=''))>0
BEGIN
SET @BioSoft_Kontrol = 'MSSQLVALIDATION'+'TC KIMLIK NO BOS GECILEMEZ !'
RAISERROR (@BioSoft_Kontrol, 16, 1)
END
END
Daha önce hiç yapmadım, yapıldığını duydum danışmanlığını yapanlardan. Aşağıdaki adreste asri arkadaşımızın yaptığı bir araç var belki işinize yarar, bir inceleyin isterseniz.
Neden Visual Basic'e ihtiyacınız olması gerektiğini anlamlandıramadım. T-SQL ile rahatlıkla yapılabilir bu tarz bir şey. Öncelikle bir instead of trigger'ı yazmanızı tavsiye ederim. Bir nevi before insert trigger'ı. Bu trigger aslında tam da istediğiniz işleri yapabilmek adına düşünülmüştür. Insert isteği nereden gelirse gelsin(ister A programından, ister B programından, ister Enterprise Manager'dan) farketmez ve sizin yazdığınız kodlar öncelikle işletilir. Trigger içinde de ilgili alanların NULL olup olmadıklarını ihtiyacınıza göre kontrol edersiniz.
Hatalı giriş mevcut ise Raiserror/return ile işleme devam etmezsiniz. Bu sayede aslında ilgili tabloya hiç bir şekilde kayıt da girilmemiş olur. Instead of trigger'larının en dikkat edilesi durumu, bu trigger'ı kodladığınızda SQL Server'a şunu demiş oluyorsunuz: "Sen zahmet etme, insert işlemini ben yöneteceğim.!"
Dolayısı ile ilgili trigger içinde her türlü kontrolünüzü yaptıktan sonra insert into .... ile ilgili tabloya verileri de kayıt etmeyi unutmamanız gerekir.
thelvacı kardeşim bana bu konuda yardımcı olabilir misin peki ? Benim istediğim çok da detaylı bir triger değil sadece "vergi dairesi" "vergi no" ve "vergi no" yu boş girmemesini kontrol ettirecem.
@thelvaci konu netsis olduğu için kendi yapısı içinde çözüm bulunmasının daha iyi olacağını düşündüm. db seviyesinde yapılacak bir koruma uygulamada ne gibi hatalara neden olur bilemiyorum, netsis tecrübem bulunmuyor. DB'den dönen hata nedeniyle uygulama farklı hatalar verebilir. Eksik veriler ile kayıt sürecini tamamlayabilir.
@mkysoft arkadaşımız sorusunun içinde trigger kullandığı için ben de trigger istikametinde bir yanıt verdim. Paylaştığı trigger bir after insert trigger'ı olduğu için; tavsiye ettiğimiz instead of insert trigger'ı veritabanında hiç bir aksamaya neden olmaz. Çünkü kayıt fiziksel olarak veritabanına yazılmadan önce devreye girecek bu trigger ve kullanıcı bu trigger içinde ilgili tabloya insert into .... kodu yazmadığı müddetçe ilgili tabloya kayıt girilememiş olacak.
Yapılan kontrollerin aşılmasının ardından işletilecek olan insert into ... kodu, after insert trigger'ına dallanılmasına ve sistemin geri kalan işleyişi düzgün bir şekilde yürütmesine neden olacak.
ozcank yazdı:thelvaci kardeşim tamda istediğimi izah ettin. Peki bana sadece böyle bir kontrol için kod anlamında yardımcı olabilir misin ?
Üstad zaten yardımcı olamadık mı acaba ? Tek yapacağınız "SQL Server'da Instead of triggerları nasıl yazılır" konusunu araştırmak. Syntax'ı anladıktan sonra trigger'ın içine yazılacak mantığı kurmak da sizin için zaten kolay olacaktır diye düşünüyorum.