SQL Tetikleyicileri: Temel Kılavuz

Yayınlanan: 2022-10-12

Tetikleyiciler, SQL Server'daki veritabanı varlıklarıdır. Teknik olarak, belirli veritabanı işlemlerine yanıt veren belirli bir işlev çağrısı sınıfıdır.

Bu temel kılavuz, mesleğinizde oldukça faydalı olabilecek SQL Tetikleyicileri hakkında size derinlemesine bilgi verecektir. Başlayalım!

SQL Tetikleyicileri nedir?

"Tetikleyici" kelimesi, veritabanındaki içerik her değiştirildiğinde bir sunucunun sorguyu otomatik olarak yürüttüğünü ifade eder.

Tetikleyici, bellek alanında depolanan özel olarak adlandırılmış SQL sorguları grubudur. Herhangi bir veritabanı olayı gerçekleştiğinde hemen çağrılan belirli bir işlev çağrısı türüdür. Her tetikleyicinin kendisine atanmış bir tablosu vardır.

SQL-Tetikleyiciler Nelerdir?

Örneğin, belirli bir tabloya yeni bir sütun eklendiğinde veya belirli kayıtlar değiştirildiğinde bir tetikleyici etkinleştirilebilir.

Microsoft Developer Network'e göre, tetikleyiciler belirli bir saklı yordam sınıfıdır. Bir trigger deyiminde, ilk olarak tetikleyicinin ne zaman çalıştırılması gerektiğini tanımlarız ve ardından tetikleyici aktif hale getirildikten sonra yapılması gereken işlemi sağlarız.

Sözdizimi:

 CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON tableName FOR EACH ROW SET operation [trigger_body];

Her parametrenin açıklaması

  • CREATE TRIGGER trigger_name – Bir tetikleyici oluşturmak veya mevcut bir tetikleyicinin adını değiştirmek için kullanılır.
  • ÖNCE/SONRA – Bu sorgu, tetikleyicinin yürütme süresini (belirli bir olaydan önce veya sonra) tanımlamak için kullanılır.
  • EKLE/GÜNCELLE/SİL – Bu, tablolarda yapmak istediğimiz eylemi açıklar.
  • ON tableName – Burada, bir tetikleyici kurmak için tablo adını tanımlarız.
  • FOR EACH ROW – Bu ifade, satır tetikleyici ile ilgilidir, yani bir satır değiştirildiğinde tetikleyiciler yürütülür.
  • trigger_body – Tetik etkinleştirildiğinde yapılacak eylemi belirtir.

Tetikleyiciler, halihazırda yürütülmüş ve bellekte güvenli bir şekilde saklanmış sorguları yeniden kullanmamızı sağlayan, ayırt edici kimliklere sahip depolanmış işlevlerdir. Şimdi SQL'in onlara neden ihtiyaç duyduğunu anlamaya çalışalım.

Tetikleyiciler çoğunlukla, bir olay gerçekleştiğinde kodun dağıtımını düzenlemek için kullanılır. Başka bir deyişle, belirli bir olaya yanıt olarak sürekli olarak belirli bir kod parçasının çalıştırılmasını istiyorsanız, tetikleyicileri kullanmak ideal seçimdir.

Aşağıdakiler, SQL veritabanı işlemlerinde tetikleyicileri kullanmanın bazı faydalarıdır.

  1. Etkilenen tablodan veri eklerken, güncellerken veya silerken ek kontroller gerçekleştirir.
  2. Bilgi işlem giderlerini artırmaya yardımcı olan yanıt sürelerini azaltır.
  3. İlk kısıtlamalar tarafından erişilemeyen karmaşık varsayılan parametrelerin kodlanmasını sağlar.

Referans bütünlüğü, ilişkisel veritabanı sistemlerinin temel bir temel özelliğidir. Bu, veritabanı sisteminde tutulan verilerin her işlem ve her işlem için her zaman doğru olması gerektiği anlamına gelir.

İki tablo ayrı veritabanlarında veya sistemlerde bulunuyorsa, kısıtlama değerlerini kullanarak bunların içinde veri doğrulamasını sağlamanın bir yolu yoktur. Böyle bir durumda, tetikleyiciler yürütme için tek seçenektir.

Tetikleyici Argümanların Kombinasyonu

Tetikleyici-Argümanların Kombinasyonu

Her tablo için altı farklı tetik tipi belirtebiliriz. Bunlar, SQL satır düzeyinde Tetikleyicilerde bulunan Tetikleyici bağımsız değişkenlerinin birleşimidir.

ÖNCE INSERT : Bu tetikleyiciler, belirtilen tabloda veya veritabanında herhangi bir INSERT işlemi gerçekleştirmeden önce satırlarda eylemi yürütür.

SONRA INSERT : Herhangi bir veritabanı INSERT etkinliğinin hemen ardından satırlarda eylemi yürütür.

GÜNCELLEMEDEN ÖNCE : Bu tetikleyicilerle, veritabanında bir GÜNCELLEME eylemi gerçekleştirilmeden önce satırlarda bir işlev gerçekleştirilir.

GÜNCELLEME SONRASI : Herhangi bir veritabanı veya belirli tablo GÜNCELLEME etkinliğinin hemen ardından satırlarda eylemi yürütür.

SİLMEDEN ÖNCE : Veritabanı veya tablo DELETE işlemine tabi tutulmadan önce satırlar üzerinde belirli bir işlemi gerçekleştirir.

SİLMEDEN SONRA : Bu tetikleyiciler, her DELETE işlemini izleyen satırlarda eylemi yürütür.

SQL Tetikleyici Türleri

SQL-Tetikleyici Türleri

SQL tetikleyicileri, belirli olaylar meydana geldiğinde hemen çalışan depolanmış işlevlerdir. Olay güdümlü zamanlamaya benzer. Sonraki durumlar, tetikleyicilerin yürütülmesini başlatabilir.

DML Tetikleyicileri – DML, Veri Manipülasyon Dili anlamına gelir. Veri değişikliğine tepki olarak kod yürütme, DML Tetikleyicileri kullanılarak mümkün hale getirilir. Bu tetikleyici, INSERT, UPDATE ve DELETE gibi DML komutları yürütüldüğünde etkinleştirilir. Bunlara “Tablo Seviyesi Tetikleyicileri” de denir.

DDL Tetikleyicileri – DDL, Veri Tanımlama Dili anlamına gelir. DDL Tetikleyicileri, tablo ekleme veya silme gibi veritabanı şeması değişikliklerine veya bir kullanıcının check-in yaptığı gibi sunucu olaylarına tepki olarak kod çalıştırmamızı sağlar. Bunlara “Veritabanı Düzeyi Tetikleyicileri” denir.

Bu Tetikleyiciler, aktif veritabanında CREATE, ALTER veya DROP gibi belirli DDL ifadeleri yürütüldüğünde etkinleştirilebilir. Bunlar ayrıca yürütülen faaliyetleri izlemek ve yönetmek için de kullanılabilir.

LOGON Tetikleyicileri – Herhangi bir LOGON (Başlangıç, oturum açma, Oturumu kapatma, kapatma) olayı meydana geldiğinde, Oturum Açma Tetikleyicileri hemen başlatılır. Kullanıcı işlemi başlatılmadan önce bile yalnızca bir kullanıcı kimlik doğrulama sürecinin ardından gerçekleştirilirler. Yetkilendirme başarısız olursa LOGON tetikleyicileri tetiklenmez.

Bu tetikleyiciler, sunucu bağlantıları için diğer denetleme ve kimlik yönetimi işlevlerinin yanı sıra oturum açma geçmişini kaydetmek veya belirli bir oturum açma için bir olay kısıtlaması oluşturmak için kullanılabilir.

CLR Tetikleyicileri – CLR, Ortak Dil Çalışma Zamanı anlamına gelir. CLR tetikleyicileri, gerçekten de, çoğunlukla .NET teknolojisi içinde CLR'ye dayanan benzersiz bir tetikleyici alt kümesidir. Bu tetikleyiciler, tetikleyicinin çok sayıda hesaplama yapması veya SQL dışında bir varlıkla ilişki kurması gerekiyorsa yararlıdır.

DML ve DDL tetikleyicileri, Visual Basic, C# ve F-sharp dahil .NET teknolojilerinde desteklenen CLR tetikleyicilerinin kodlanması etkinleştirilerek gerçekten oluşturulabilir.

Örnek SQL Server Tetikleyicisi

Örnek-SQL-Sunucu-Tetikleyici

Bu tetikleyici kavramları bir örnekle anlayalım.

Öncelikle SQL deyimlerini kullanarak bir veritabanı oluşturalım.

 CREATE DATABASE testdb; use testdb;

Burada veritabanı adı olarak bir “testdb” verdim. Ve bir sonraki adım bir tablo oluşturmaktır.

 CREATE TABLE student( name varchar(25), id int(2), maths int(2), physics int(2), biology int(2), social int(2), total int(2) );

Öğrenci detaylarını saklamak için bir tablo oluşturdum. Ve işte tablonun yapısını tanımlayan komut. Burada “öğrenci” vermiş olduğum tablo adıdır.

 DESC student;

Oluşturduğum tablonun yapısı aşağıdadır.

 +---------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+---------+-------+ | name | varchar(25) | YES | | NULL | | | id | int | YES | | NULL | | | maths | int | YES | | NULL | | | physics | int | YES | | NULL | | | biology | int | YES | | NULL | | | social | int | YES | | NULL | | | total | int | YES | | NULL | | +---------+-------------+------+-----+---------+-------+ 7 rows in set (0.00 sec)

Bir tablo oluşturduktan sonraki adım bir tetikleyici kurmaktır. BEFORE INSERT argümanını kullanmayı deneyelim.

Oluşturduğum tetikleyicinin adı “marks”. Tablo öğrencinin notlarıyla değiştirilir değiştirilmez, aşağıdaki tetikleyici öğrencinin genel notunu otomatik olarak belirlemeye çalışır.

 CREATE TRIGGER marks BEFORE INSERT ON student FOR EACH ROW set new.total=new.maths+new.physics+new.biology+new.social;

Eskileriyle çalışmak yerine satır verilerini değiştirmemiz gerektiğinden, yeni bir sınıf adı kullanarak “toplam” tanımladık ve sonraki tüm ifadeler, nokta operatörü kullanılarak toplamdan sonra yeni anahtar kelimelerle öneklendi. Şimdi her satıra değerler ekleyeceğiz ve sonuçları göreceğiz. Başlangıçta, her öğrenci için toplam not 0'dır.

 INSERT INTO student VALUES("George",02,99,87,92,91,0); INSERT INTO student VALUES("James",03,91,81,94,90,0); INSERT INTO student VALUES("Harry",04,86,70,73,88,0); INSERT INTO student VALUES("John",05,73,89,78,92,0); INSERT INTO student VALUES("Lisa",01,94,75,69,79,0);

Bu durumda öğrenci tablosuna veri eklendiğinde tetikleyici ifade otomatik olarak tetiklenecektir. Her öğrencinin toplam notu tetikleyici tarafından hesaplanacaktır. Şimdi, tetikleyicinin bir SELECT deyimi kullanılarak çağrılıp çağrılmadığını görelim.

 SELECT * FROM table_name;

Ve işte son çıktı.

 mysql> select * from student; +--------+------+-------+---------+---------+--------+-------+ | name | id | maths | physics | biology | social | total | +--------+------+-------+---------+---------+--------+-------+ | George | 2 | 91 | 81 | 94 | 90 | 356 | | James | 3 | 86 | 70 | 73 | 88 | 317 | | Harry | 4 | 73 | 89 | 78 | 92 | 332 | | John | 5 | 94 | 75 | 69 | 79 | 317 | | Lisa | 1 | 99 | 87 | 92 | 91 | 369 | +--------+------+-------+---------+---------+--------+-------+ 5 rows in set (0.00 sec)

Yukarıdaki sonuçta her öğrenci için tüm konu işaretlerinin otomatik olarak eklendiğini görebilirsiniz. Böylece, tetikleyicinin başarıyla çağrıldığı sonucuna varabiliriz.

Ek Tetikleme İşlemleri

Tetikleyicileri kullanarak birçok işlemi gerçekleştirebiliriz. Bazıları basit, bazıları biraz karmaşık olabilir, ancak sorguları bir kez gözden geçirdiğimizde anlaşılması kolaydır. Transact-SQL deyimlerini kullanarak aşağıdaki komutları kullanarak tetikleyicileri etkinleştirebilir, devre dışı bırakabilir veya silebilirsiniz.

Belirli bir Tetikleyicinin orada olup olmadığını kontrol etmek için sorgulama

Bu komut, tüm veritabanında belirtilen tetikleyiciyi kontrol eder.

 SELECT * FROM [sys].[triggers] WHERE [name] = 'Trigger_name'

Tetikleyicileri görüntülemek için sorgu

Aktif veritabanında bulunan tüm tetikleyiciler aşağıdaki ifade ile gösterilecektir.

 SHOW TRIGGERS;

Tetikleyiciyi Devre Dışı Bırakma Sorgusu

Aşağıdaki komut, çalışan veritabanındaki tetikleyiciyi devre dışı bırakır.

 DISABLE TRIGGER trigger_name ON DATABASE;

Bir tetikleyiciyi devre dışı bırakmak için belirli bir tablo adı da belirtebilirsiniz.

 DISABLE TRIGGER trigger_name ON table_name;

Tetikleyiciyi Etkinleştirmek için Sorgu

Aşağıdaki komut, yeniden etkinleştirmeden önce etkin veritabanında belirtilen tabloda tanımlanan belirli bir tetikleyiciyi ilk olarak devre dışı bırakır.

 ALTER TABLE table_name DISABLE TRIGGER trigger_name ALTER TABLE table_name ENABLE TRIGGER trigger_name

Etkinleştirmeye çalışmadan önce tetikleyici devre dışı bırakılmalıdır,

Bir tablodaki tüm tetikleyicileri etkinleştirmek veya devre dışı bırakmak için sorgu

Yukarıdaki SQL ifadesini kullanarak, belirli bir tetikleyici adı yerine “ALL” yazarak tüm tablo tetikleyicilerini aynı anda devre dışı bırakabilir veya etkinleştirebiliriz.

 ALTER TABLE table_name DISABLE TRIGGER ALL ALTER TABLE table_name ENABLE TRIGGER ALL

Tetikleyiciyi Silme veya Bırakma Sorgusu

Bir tetikleyici, onu veya tüm tabloyu silerek ortadan kaldırılabilir. Bir tablo silindiğinde ilgili her tetikleyici de silinir.

 DROP TRIGGER [trigger_name];

Bir tetikleyici silindiğinde, ilgili veriler sys.objects veri tablosundan çıkarılır.

Tetikleyicilerin Avantajları

  • Tetikleyiciler oluşturmak kolaydır ve tetikleyicinin kendisi, saklanan işlevleri ve yöntemleri çağırabilir.
  • Kullanıcılar, tetikleyicileri kullanarak basit denetim uygulayabilir.
  • Ne yazık ki, tetikleyicileri kullanarak kısıtlamaların işleyişini taklit edebilmenize rağmen, SQL Server ile veritabanı sistemlerinde varlıklar arasında kısıtlamalar oluşturamazsınız.
  • Bütünlük kısıtlamaları, tetikleyiciler kullanılarak veritabanlarında uygulanabilir.
  • Yeni girilen veya değiştirilen verilerin satır satır doğrulanması yerine grup doğrulaması gerektiğinde, tetikleyiciler yardımcı olabilir.

Tetikleyicilerin Dezavantajları

SQL Tetikleyicileri, bazı durumlarda sınırlamaları nedeniyle en iyi seçim olmayabilir.

  • Tetikleyiciler doğru bir şekilde belgelenmelidir.
  • Uygulama bileşenlerinin erişemeyeceği eşzamanlı veritabanı yürütmesi nedeniyle, tetikleyicilerin hata ayıklaması zor olabilir.
  • Tetikleyiciler kullanıldığında DML ifadeleri daha karmaşık hale gelir.
  • Küçük bir tetikleme sorunu bile ifadede mantıksal hatalara yol açma potansiyeline sahiptir.

Çözüm

Tetikleyiciler, Transact-SQL ve SQL'in çok yararlı bileşenleridir ve bunları Oracle'da da kullanabilirsiniz. Saklanan yöntemleri çağırırken tetikleyicilerin kullanımı çok önemlidir. Bu SQL Tetikleyicileri, etkinlik zaman çizelgelerini analiz etmemize ve gerekirse bunlara nasıl yanıt vereceğimizi belirlememize olanak tanır. Veri almak için bir tetikleyiciye bağlı belirli bir tabloyu da kontrol edebiliriz.

Özyineleme, tetikleyiciler tarafından etkinleştirilebilir. Bir tablodaki bir tetikleyici, üst tabloda bir komut yürüttüğünde, tetikleyicinin ikinci yinelemesi başlatılır ve bu, özyinelemeli tetikleyici olarak bilinir. Bu, bir kimlik korelasyonunu çözmeye çalışırken yardımcı olur.

Ayrıca, tetikleyiciler, veritabanının kabul etmesine izin verilen güncelleme modelini düzenler. SQL kısıtlama anahtarları esas olarak birincil anahtar ve yabancı anahtar yoksa, veri bütünlüğü kısıtlamalarını veritabanı sisteminde tutmak oldukça faydalıdır.

Umarım bu makaleyi SQL Tetikleyiciler hakkında bilgi edinme konusunda faydalı bulmuşsunuzdur.

Veritabanlarını derinlemesine öğrenmek istiyorsanız, SQL ve NoSQL öğrenmek için bazı mükemmel kaynaklar burada.