Mehmet

WFN Üye
Konular
1,204
Mesajlar
1,205
Çözüm
0
Ticaret Puanı
0
Üyelik
1 Ay 6 Gün
Konum
YurtDışı
Web Sitesi
Var
Alanı
Google Adsense
1/1
Konu sahibi
MySQL trigger, belirli bir tablodaki INSERT, UPDATE veya DELETE işlemi gerçekleştiğinde MySQL tarafından otomatik çalıştırılan, tabloya bağlı adlandırılmış veritabanı nesnesidir. Trigger uygulama kodunun ayrıca çağrı yapmasını beklemez; SQL ile yapılan değişiklikte devreye girer ve FOR EACH ROW nedeniyle etkilenen her satır için ayrı çalışır.

MySQL trigger nasıl çalışır?​


Trigger tanımlarken dört temel seçim yapılır:

Olay: INSERT yeni satır eklenmesini, UPDATE mevcut satırın değiştirilmesini, DELETE satır silinmesini izler.

Zaman: BEFORE satır değişikliği uygulanmadan önce, AFTER ilgili satır işlemi başarıyla tamamlandıktan sonra çalışır. Bu, transactionın COMMIT edilmesinden sonra çalışan bir kanca değildir.

Satır kapsamı: MySQL trigger'ları satır seviyelidir. Tek bir UPDATE sorgusu 100 satırı etkilerse trigger da 100 kez çalışabilir.

Değerler: NEW yeni değeri, OLD eski değeri temsil eder. INSERT içinde yalnızca NEW, DELETE içinde yalnızca OLD, UPDATE içinde ikisi de kullanılabilir. BEFORE trigger içinde NEW.sutun değeri değiştirilebilir; AFTER aşamasında satır değişikliği tamamlandığı için bu yöntem kullanılamaz.

Doğrudan yapılan satır ekleme, güncelleme ve silme işlemlerini tasarlarken, uygulamanın veritabanına hangi DML ifadesini gönderdiğini kontrol edin. Her SQL komutunun aynı trigger olayını oluşturduğunu varsaymayın.

Somut örnek: fiyat değişiklik günlüğü​


Bir ürünün fiyatı değiştiğinde eski ve yeni fiyatı günlük tablosuna kaydetmek için AFTER UPDATE kullanılabilir:

Kod:
CREATE TABLE products (
    id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL(10,2) NOT NULL
) ENGINE=InnoDB;

CREATE TABLE product_price_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    product_id INT NOT NULL,
    old_price DECIMAL(10,2) NOT NULL,
    new_price DECIMAL(10,2) NOT NULL,
    changed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

DELIMITER //

CREATE TRIGGER trg_product_price_log
AFTER UPDATE ON products
FOR EACH ROW
BEGIN
    IF OLD.price <> NEW.price THEN
        INSERT INTO product_price_log
            (product_id, old_price, new_price)
        VALUES
            (NEW.id, OLD.price, NEW.price);
    END IF;
END//

DELIMITER ;

Her iki tablo InnoDB kullanır. Fiyat sütunu NOT NULL olduğundan karşılaştırma doğrudan yapılabilir. Günlük satırı güncelleme sırasında aynı transactionda oluşur; transaction geri alınırsa bu günlük kaydı da geri alınır. Bu nedenle örnek, başarısız işlemleri bağımsız olarak kaydeden bir denetim sistemi değildir.

DELIMITER mysql komut satırı istemcisinin yönergesidir; sunucuya gönderilen SQL komutu değildir. Sürücü veya başka bir editör kullanıyorsanız o aracın çok ifadeli trigger tanımını gönderme biçimine uyun.

Yeni bir test veritabanında tanımı oluşturduktan sonra şu işlemlerle örneği deneyebilirsiniz:

Kod:
INSERT INTO products (id, name, price)
VALUES (1, 'Ornek urun', 100.00);
UPDATE products SET price = 125.00 WHERE id = 1;
SELECT product_id, old_price, new_price FROM product_price_log;

Beklenen günlük kaydı ürün 1 için eski fiyatın 100.00, yeni fiyatın 125.00 olduğunu gösterir. Bu bir beklenen sonuç açıklamasıdır; üretim verilerinde denemeyin.

Seçimi basitleştirmek için şu ayrım kullanılabilir:

İhtiyaçÖnerilen seçimGerekçe
Yeni değeri düzeltmek veya doğrulamakBEFORE INSERT / UPDATESatır yazılmadan önce müdahale edilir
Değişiklik geçmişi tutmakAFTER UPDATEBaşarılı değişiklikten sonra kayıt oluşturulur
Silinen satırı arşivlemekAFTER DELETESilinen satırın OLD değerleri kullanılabilir

Trigger seçimi ve kurulum adımları​


  1. Otomatik işin hangi tablo olayına bağlı olduğunu belirleyin: INSERT, UPDATE veya DELETE.
  2. Yeni değeri doğrulamak ya da düzenlemek gerekiyorsa BEFORE; günlük veya yardımcı kayıt oluşturmak gerekiyorsa çoğunlukla AFTER seçin.
  3. Kullanılabilecek OLD ve NEW değerlerini olay türüne göre kontrol edin.
  4. Trigger'ı önce test veritabanında deneyin. Özellikle birden fazla satırı etkileyen toplu işlemleri ayrıca test edin.
  5. Tanımları incelemek için SHOW TRIGGERS veya SHOW CREATE TRIGGER trigger_adi kullanın.
  6. Artık gerekmeyen tanımı kaldırmak için DROP TRIGGER trigger_adi çalıştırın. Şema dağıtım betiklerine trigger oluşturma ve kaldırma adımlarını da ekleyin.



Sık yapılan hatalar​


Tek sorguda tek kez çalışacağını sanmak: Trigger satır başına çalıştığından toplu işlemler beklenenden çok günlük veya yardımcı kayıt üretebilir.

Gizli iş mantığı eklemek: Trigger başka tabloları da değiştiriyorsa bu davranışı adlandırın ve belgeleyin. Aksi halde uygulamadaki basit bir UPDATE beklenmedik yan etkilere yol açabilir.

Ana tabloyu tekrar değiştirmeye çalışmak: Trigger'ın bağlı olduğu tabloya gövdeden tekrar UPDATE göndermek hata oluşturabilir. BEFORE içinde SET NEW.sutun kullanmak, aynı tabloya ayrı bir yazma sorgusu göndermekten farklıdır. Gerekirse mantığı saklı yordam ya da uygulama katmanında daha açık biçimde tasarlayın.

Hata etkisini test etmemek: Trigger içindeki hata, onu çalıştıran SQL ifadesinin başarısız olmasına neden olabilir. Günlük, stok veya finansal kayıtlar için hata senaryosunu test edin.

Devre dışı bırakmayı varsaymak: Dağıtım sırasında trigger'ı kapatmanız gerekiyorsa bunu gelişigüzel bir oturum değişkenine bağlamayın. Kontrollü koşul, kaldırıp yeniden oluşturma veya ayrı bir dağıtım betiği kullanın; her yöntemi test edin.

Sık sorulan sorular​


TRUNCATE veya foreign key cascade DELETE triggerını çalıştırır mı?​


Hayır. TRUNCATE TABLE, DELETE triggerını çalıştırmaz; ayrıca implicit commit oluşturan bir DDL işlemidir. Foreign key cascade işlemleri de trigger tetiklemez. Silme günlüğü tasarlarken yalnızca triggera güvenmeden bu yolları ayrıca değerlendirin.

Trigger oluşturma ve çalıştırmada kimin yetkileri kullanılır?​


Oluşturan hesabın ilgili tablo üzerinde TRIGGER yetkisi gerekir. Çalışma sırasında güvenlik bağlamını DEFINER belirler; bu hesabın trigger ve gövdedeki okuma/yazma işlemleri için gerekli yetkileri bulunmalıdır. Ana tabloyu değiştiren uygulama kullanıcısına sırf trigger tetiklenecek diye geniş yönetim yetkisi vermeyin.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Konuyu görüntüleyenler

Bu konuyu şu anda görüntüleyen üye bulunmuyor.