ProgramlamaBackend Geliştirici

SQL'de saklanan prosedürler ile tetikleyiciler arasındaki fark nedir? Hangi varlıkları ne zaman kullanmak daha iyidir ve geliştiricilerin bu varlıkların karışımında sık yaptığı hatalar nelerdir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Saklanan prosedürler (stored procedures) — açıkça çağrılan, parametre alabilen, karmaşık iş mantığını, işlemeleri gerçekleştirebilen ve veri setleri veya çıkış parametreleri döndürebilen programlanabilir bloklardır.

Tetikleyiciler (triggers) — veri değişikliği olayları (INSERT, UPDATE, DELETE) üzerinde "otomatik" olarak tetiklenen özel nesnelerdir ve belirli tablolar üzerinde belirli eylemler gerçekleştiğinde belirlenen mantığın şeffaf bir şekilde çalışmasını sağlarlar.

Prosedürlerin ne zaman kullanılacağı

  • Büyük veri setlerinin işlenmesi gerekiyorsa.
  • İşlemler üzerinde açık kontrol gerekiyorsa.
  • Sonuç veya birden fazla veri seti döndürmek gerekiyorsa.

Tetikleyicilerin ne zaman kullanılacağı

  • Veri değişikliği sırasında açık kontrol veya güncellemeleri garanti etmek gerekiyorsa (örneğin, denetim).
  • Bütünlük kontrollerinin gerçekleştirilmesi gerekiyorsa.

Kod örneği

Saklanan prosedür:

CREATE PROCEDURE UpdateProductPrice @ProductID int, @NewPrice money AS BEGIN UPDATE Products SET Price = @NewPrice WHERE ProductID = @ProductID; END

Tetikleyici:

CREATE TRIGGER trg_ProductsPriceChange ON Products AFTER UPDATE AS BEGIN INSERT INTO PriceAuditLog(ProductID, OldPrice, NewPrice, ChangeDate) SELECT i.ProductID, d.Price, i.Price, GETDATE() FROM inserted i JOIN deleted d ON i.ProductID = d.ProductID WHERE i.Price <> d.Price END

Kandırmaca soru.

S: SQL Server'da bir tabloda birden fazla AFTER tetikleyici için çalışma sırasını standart araçlarla belirlemek mümkün mü?

C: Hayır, SQL standardı aynı tabloda benzer yönde olan AFTER tetikleyicilerin çalışma sırasını garanti etmez. Sıra önemliyse, bunlar birleştirilmelidir.

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


Hikaye

CRM çözümünde, değişim geçmişi işlevselliğini desteklemek için tetikleyiciler kullanıldı. Toplu güncellemeler nedeniyle, güncellemeler gecikmeli olarak kayıt altına alındı ve "canlı" işlemleri engelleyerek hizmetin geçici olarak erişilemez olmasına neden oldu.


Hikaye

Geliştirici, veri kontrol mantığını prosedürde değil, tetikleyicide oluşturarak, kullanıcı değişikliklerini anında göreceğini düşündü. Tetikleyicinin "şeffaf" olduğunu unutarak, iş mantığının belirsiz hale geldiği ("büyü") ve hata ayıklamanın zorlaştığı bir durumla karşılaştı.


Hikaye

Önemli: Genellikle bir prosedür, tetikleyici içinde çağrılır ya da tetikleyici, prosedürden çağrılır; bu da özyinelemeye ve derinlik sınırının aşılmasına yol açar — örneğin, otomatik ekleme, ilişkili prosedür aracılığıyla tetikleyicinin tekrar çalışmasına neden olur.