{"id":33157,"date":"2025-10-30T10:41:20","date_gmt":"2025-10-30T07:41:20","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33157"},"modified":"2025-10-30T10:41:20","modified_gmt":"2025-10-30T07:41:20","slug":"mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/","title":{"rendered":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma"},"content":{"rendered":"<p><body><\/p>\n<h2>MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma<\/h2>\n<h2>Giri\u015f<\/h2>\n<p>Veritaban\u0131 y\u00f6netim sistemleri, modern uygulamalar\u0131n temelini olu\u015fturur ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc, tutarl\u0131l\u0131\u011f\u0131n\u0131 ve g\u00fcvenli\u011fini sa\u011flamak kritik \u00f6neme sahiptir. MySQL, a\u00e7\u0131k kaynakl\u0131 ve yayg\u0131n olarak kullan\u0131lan g\u00fc\u00e7l\u00fc bir veritaban\u0131 sistemidir. Bu sistemin sundu\u011fu \u00f6zelliklerden biri de &#8220;tetikleyiciler&#8221;dir (triggers). Tetikleyiciler, belirli bir veritaban\u0131 olay\u0131na (INSERT, UPDATE, DELETE gibi) yan\u0131t olarak otomatik olarak \u00e7al\u0131\u015fan \u00f6zel sakl\u0131 prosed\u00fcrlerdir. Bu makalede, MySQL tetikleyicilerinin ne oldu\u011funu, nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131, Ubuntu 18.04 i\u015fletim sistemi \u00fczerinde nas\u0131l kurulup y\u00f6netilece\u011fini ve en iyi uygulamalar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<p>Ubuntu 18.04, bir\u00e7ok sunucu ve geli\u015ftirme ortam\u0131 i\u00e7in pop\u00fcler bir se\u00e7imdir. Bu platform \u00fczerinde MySQL tetikleyicilerini anlamak ve etkin bir \u015fekilde kullanmak, veritaban\u0131 y\u00f6neticileri ve geli\u015ftiriciler i\u00e7in \u00f6nemli bir yetkinliktir. Veri do\u011frulama, denetim izleri olu\u015fturma, karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 uygulama ve referans b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruma gibi bir\u00e7ok senaryoda tetikleyiciler g\u00fc\u00e7l\u00fc bir ara\u00e7 olabilir. Ancak, yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda performans sorunlar\u0131na veya beklenmedik davran\u0131\u015flara da yol a\u00e7abilirler. Bu nedenle, tetikleyicilerin do\u011fru bir \u015fekilde anla\u015f\u0131lmas\u0131 ve uygulanmas\u0131 b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r.<\/p>\n<h2>MySQL Tetikleyicileri Nedir?<\/h2>\n<p>MySQL tetikleyicileri, bir tablodaki belirli bir olay (INSERT, UPDATE, DELETE) ger\u00e7ekle\u015fti\u011finde otomatik olarak y\u00fcr\u00fct\u00fclen bir t\u00fcr sakl\u0131 prosed\u00fcrd\u00fcr. Bu olaylar, veritaban\u0131na bir kay\u0131t eklendi\u011finde, mevcut bir kay\u0131t g\u00fcncellendi\u011finde veya bir kay\u0131t silindi\u011finde meydana gelir. Tetikleyiciler, bu olaylardan <em>\u00f6nce<\/em> (BEFORE) veya <em>sonra<\/em> (AFTER) \u00e7al\u0131\u015facak \u015fekilde yap\u0131land\u0131r\u0131labilir. Bu yetenek, veritaban\u0131 seviyesinde karma\u015f\u0131k i\u015f kurallar\u0131n\u0131 ve veri do\u011frulama mant\u0131\u011f\u0131n\u0131 uygulamak i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar.<\/p>\n<h3>Tetikleyici T\u00fcrleri<\/h3>\n<p>MySQL tetikleyicileri, \u00e7al\u0131\u015ft\u0131klar\u0131 olay\u0131n zamanlamas\u0131na ve t\u00fcr\u00fcne g\u00f6re s\u0131n\u0131fland\u0131r\u0131l\u0131r:<\/p>\n<p>*   <strong>Zamanlama:<\/strong><br \/>\n    *   <strong>BEFORE Tetikleyicileri:<\/strong> Veritaban\u0131 i\u015flemi (INSERT, UPDATE, DELETE) ger\u00e7ekle\u015fmeden hemen \u00f6nce \u00e7al\u0131\u015f\u0131r. Bu t\u00fcr tetikleyiciler genellikle veri do\u011frulama, varsay\u0131lan de\u011fer atama veya i\u015flemi engelleme gibi g\u00f6revler i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n ya\u015f\u0131n\u0131n belirli bir de\u011ferin alt\u0131nda olup olmad\u0131\u011f\u0131n\u0131 kontrol edip i\u015flemi iptal edebilirsiniz.<br \/>\n    *   <strong>AFTER Tetikleyicileri:<\/strong> Veritaban\u0131 i\u015flemi (INSERT, UPDATE, DELETE) ba\u015far\u0131yla ger\u00e7ekle\u015ftikten hemen sonra \u00e7al\u0131\u015f\u0131r. Bu t\u00fcr tetikleyiciler genellikle denetim izleri (audit logs) olu\u015fturma, ba\u015fka bir tabloyu g\u00fcncelleme veya karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 uygulama gibi g\u00f6revler i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, bir \u00fcr\u00fcn\u00fcn sto\u011fu g\u00fcncellendi\u011finde, bu de\u011fi\u015fikli\u011fi ayr\u0131 bir log tablosuna kaydedebilirsiniz.<\/p>\n<p>*   <strong>Olay T\u00fcr\u00fc:<\/strong><br \/>\n    *   <strong>INSERT Tetikleyicileri:<\/strong> Bir tabloya yeni bir sat\u0131r eklendi\u011finde tetiklenir.<br \/>\n    *   <strong>UPDATE Tetikleyicileri:<\/strong> Bir tablodaki mevcut bir sat\u0131r g\u00fcncellendi\u011finde tetiklenir.<br \/>\n    *   <strong>DELETE Tetikleyicileri:<\/strong> Bir tablodan bir sat\u0131r silindi\u011finde tetiklenir.<\/p>\n<p>Bu kombinasyonlar, toplamda alt\u0131 farkl\u0131 tetikleyici t\u00fcr\u00fc olu\u015fturur (BEFORE INSERT, AFTER INSERT, BEFORE UPDATE, AFTER UPDATE, BEFORE DELETE, AFTER DELETE). Her bir tetikleyici, tetiklendi\u011fi olay t\u00fcr\u00fcne ve zamanlamas\u0131na g\u00f6re farkl\u0131 senaryolarda kullan\u0131labilir.<\/p>\n<h3>Tetikleyicilerin Avantajlar\u0131<\/h3>\n<p>Tetikleyicilerin kullan\u0131m\u0131, veritaban\u0131 y\u00f6netiminde ve uygulama geli\u015ftirmede bir dizi \u00f6nemli avantaj sunar:<\/p>\n<p>*   <strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> Tetikleyiciler, veritaban\u0131 seviyesinde veri b\u00fct\u00fcnl\u00fc\u011f\u00fc kurallar\u0131n\u0131 zorunlu k\u0131labilir. \u00d6rne\u011fin, bir s\u00fctuna yanl\u0131\u015f veri girilmesini engelleyebilir veya belirli ko\u015fullar alt\u0131nda bir i\u015flemi iptal edebilir.<br \/>\n*   <strong>Otomatik G\u00f6revler:<\/strong> Belirli bir olay ger\u00e7ekle\u015fti\u011finde otomatik olarak y\u00fcr\u00fct\u00fclmesi gereken g\u00f6revleri (\u00f6rne\u011fin, denetim izi olu\u015fturma, ba\u015fka bir tabloyu g\u00fcncelleme) uygulama kodundan ba\u011f\u0131ms\u0131z olarak y\u00f6netir.<br \/>\n*   <strong>\u0130\u015f Mant\u0131\u011f\u0131 Merkeziyeti:<\/strong> \u0130\u015f kurallar\u0131n\u0131 do\u011frudan veritaban\u0131na g\u00f6merek, bu kurallar\u0131n farkl\u0131 uygulamalar taraf\u0131ndan eri\u015filse bile tutarl\u0131 bir \u015fekilde uygulanmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <strong>Denetim \u0130zleri (Audit Trails):<\/strong> Veritaban\u0131ndaki de\u011fi\u015fiklikleri (kimin, ne zaman, hangi veriyi de\u011fi\u015ftirdi\u011fi gibi) kaydetmek i\u00e7in idealdir.<br \/>\n*   <strong>Karma\u015f\u0131k K\u0131s\u0131tlamalar:<\/strong> <code>CHECK<\/code> k\u0131s\u0131tlamalar\u0131n\u0131n veya <code>FOREIGN KEY<\/code> k\u0131s\u0131tlamalar\u0131n\u0131n yetersiz kald\u0131\u011f\u0131 durumlarda daha karma\u015f\u0131k veri do\u011frulama ve i\u015f mant\u0131\u011f\u0131 uygulanabilir.<\/p>\n<h3>Tetikleyicilerin Dezavantajlar\u0131<\/h3>\n<p>Tetikleyiciler g\u00fc\u00e7l\u00fc ara\u00e7lar olsa da, baz\u0131 dezavantajlar\u0131 ve dikkat edilmesi gereken noktalar\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Performans Etkisi:<\/strong> Her tetikleyici, ilgili veritaban\u0131 i\u015flemiyle birlikte \u00e7al\u0131\u015f\u0131r. Karma\u015f\u0131k tetikleyiciler, veritaban\u0131 i\u015flemlerinin performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde yava\u015flatabilir.<br \/>\n*   <strong>Hata Ay\u0131klama Zorlu\u011fu:<\/strong> Tetikleyicilerin davran\u0131\u015f\u0131, uygulama kodundan ba\u011f\u0131ms\u0131z olarak veritaban\u0131 seviyesinde ger\u00e7ekle\u015fti\u011fi i\u00e7in, beklenmedik hatalar\u0131 ay\u0131klamak zor olabilir. Uygulama geli\u015ftiricileri, veritaban\u0131nda \u00e7al\u0131\u015fan tetikleyicilerden haberdar olmayabilir.<br \/>\n*   <strong>Gizli Mant\u0131k:<\/strong> Tetikleyiciler, uygulama kodunda a\u00e7\u0131k\u00e7a g\u00f6r\u00fcnmeyen &#8220;gizli&#8221; bir i\u015f mant\u0131\u011f\u0131 katman\u0131 olu\u015fturabilir. Bu durum, yeni geli\u015ftiricilerin sistemi anlamas\u0131n\u0131 zorla\u015ft\u0131rabilir ve beklenmedik yan etkilere yol a\u00e7abilir.<br \/>\n*   <strong>Ta\u015f\u0131nabilirlik Sorunlar\u0131:<\/strong> Tetikleyici s\u00f6zdizimi ve \u00f6zellikleri, farkl\u0131 veritaban\u0131 sistemleri aras\u0131nda de\u011fi\u015fiklik g\u00f6sterebilir. Bu da veritaban\u0131n\u0131 ba\u015fka bir platforma ta\u015f\u0131rken sorunlara yol a\u00e7abilir.<br \/>\n*   <strong>D\u00f6ng\u00fcsel Tetikleyiciler:<\/strong> Bir tetikleyicinin ba\u015fka bir tetikleyiciyi tetiklemesi ve bu durumun bir d\u00f6ng\u00fc olu\u015fturmas\u0131, sonsuz bir d\u00f6ng\u00fcye ve sistem \u00e7\u00f6kmesine neden olabilir.<\/p>\n<p>Bu avantajlar ve dezavantajlar g\u00f6z \u00f6n\u00fcnde bulundurularak, tetikleyicilerin ne zaman ve nas\u0131l kullan\u0131laca\u011f\u0131na dikkatlice karar verilmelidir.<\/p>\n<h2>Ortam Kurulumu<\/h2>\n<p>MySQL tetikleyicilerini Ubuntu 18.04 \u00fczerinde kullanmaya ba\u015flamadan \u00f6nce, gerekli ortam\u0131 kurmam\u0131z gerekmektedir. Bu b\u00f6l\u00fcmde, Ubuntu sisteminizi g\u00fcncellemeyi, MySQL sunucusunu kurmay\u0131 ve \u00f6rnek bir veritaban\u0131 ile tablo olu\u015fturmay\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>Ubuntu 18.04 G\u00fcncelleme<\/h3>\n<p>Herhangi bir yaz\u0131l\u0131m kurulumuna ba\u015flamadan \u00f6nce sisteminizin paket listesini g\u00fcncellemek ve mevcut paketleri y\u00fckseltmek iyi bir uygulamad\u0131r:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade<\/code><\/pre>\n<p>Bu komutlar, sisteminizdeki t\u00fcm paketlerin en son s\u00fcr\u00fcmlerine sahip olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>MySQL Kurulumu<\/h3>\n<p>Ubuntu 18.04 \u00fczerinde MySQL sunucusunu kurmak olduk\u00e7a basittir. A\u015fa\u011f\u0131daki komutu kullanarak MySQL sunucusunu ve istemcisini y\u00fckleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\">sudo apt install mysql-server<\/code><\/pre>\n<p>Kurulum s\u0131ras\u0131nda, MySQL root kullan\u0131c\u0131s\u0131 i\u00e7in bir parola belirlemeniz istenebilir. G\u00fc\u00e7l\u00fc bir parola se\u00e7ti\u011finizden emin olun.<\/p>\n<h3>MySQL G\u00fcvenlik Ayarlar\u0131<\/h3>\n<p>MySQL kurulumundan sonra, <code>mysql_secure_installation<\/code> beti\u011fini \u00e7al\u0131\u015ft\u0131rarak temel g\u00fcvenlik ayarlar\u0131n\u0131 yap\u0131land\u0131rman\u0131z \u00f6nerilir:<\/p>\n<pre><code class=\"language-bash\">sudo mysql_secure_installation<\/code><\/pre>\n<p>Bu betik size a\u015fa\u011f\u0131daki gibi sorular soracakt\u0131r:<br \/>\n*   <code>VALIDATE PASSWORD PLUGIN<\/code> kurmak isteyip istemedi\u011finiz (Parola g\u00fcc\u00fc politikas\u0131).<br \/>\n*   MySQL root parolas\u0131 belirleme veya de\u011fi\u015ftirme.<br \/>\n*   Anonim kullan\u0131c\u0131lar\u0131 kald\u0131rma.<br \/>\n*   Uzak root giri\u015fini devre d\u0131\u015f\u0131 b\u0131rakma.<br \/>\n*   Test veritaban\u0131n\u0131 kald\u0131rma.<br \/>\n*   Yetki tablolar\u0131n\u0131 yeniden y\u00fckleme.<\/p>\n<p>Bu ad\u0131mlar\u0131 dikkatlice takip ederek veritaban\u0131 sunucunuzun g\u00fcvenli\u011fini art\u0131r\u0131n.<\/p>\n<h3>\u00d6rnek Veritaban\u0131 ve Tablo Olu\u015fturma<\/h3>\n<p>Tetikleyicileri test etmek i\u00e7in bir veritaban\u0131na ve birka\u00e7 tabloya ihtiyac\u0131m\u0131z var. MySQL istemcisine root kullan\u0131c\u0131s\u0131 olarak giri\u015f yap\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo mysql -u root -p<\/code><\/pre>\n<p>Parolan\u0131z\u0131 girdikten sonra MySQL komut istemine d\u00fc\u015feceksiniz. \u015eimdi \u00f6rnek bir veritaban\u0131 ve tablo olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-sql\">CREATE DATABASE ornek_db;\nUSE ornek_db;\n\nCREATE TABLE kullanicilar (\n    id INT AUTO_INCREMENT PRIMARY KEY,\n    ad VARCHAR(100) NOT NULL,\n    email VARCHAR(100) UNIQUE NOT NULL,\n    olusturma_tarihi DATETIME DEFAULT CURRENT_TIMESTAMP,\n    guncelleme_tarihi DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP\n);\n\nCREATE TABLE kullanici_log (\n    log_id INT AUTO_INCREMENT PRIMARY KEY,\n    kullanici_id INT,\n    islem_turu VARCHAR(50),\n    eski_deger TEXT,\n    yeni_deger TEXT,\n    islem_tarihi DATETIME DEFAULT CURRENT_TIMESTAMP\n);\n\nCREATE TABLE urunler (\n    urun_id INT AUTO_INCREMENT PRIMARY KEY,\n    urun_adi VARCHAR(255) NOT NULL,\n    stok_miktari INT NOT NULL DEFAULT 0,\n    fiyat DECIMAL(10, 2) NOT NULL,\n    son_guncelleme DATETIME\n);<\/code><\/pre>\n<p>Bu komutlar, <code>ornek_db<\/code> ad\u0131nda bir veritaban\u0131, <code>kullanicilar<\/code> ad\u0131nda bir kullan\u0131c\u0131 tablosu, <code>kullanici_log<\/code> ad\u0131nda bir log tablosu ve <code>urunler<\/code> ad\u0131nda bir \u00fcr\u00fcn tablosu olu\u015fturacakt\u0131r. <code>kullanicilar<\/code> tablosundaki <code>guncelleme_tarihi<\/code> s\u00fctunu, <code>ON UPDATE CURRENT_TIMESTAMP<\/code> \u00f6zelli\u011fi sayesinde otomatik olarak g\u00fcncellenecektir. Ancak bu \u00f6zelli\u011fi bir tetikleyici ile nas\u0131l y\u00f6netece\u011fimizi de g\u00f6sterece\u011fiz.<\/p>\n<h2>Tetikleyici Olu\u015fturma<\/h2>\n<p>MySQL&#8217;de tetikleyici olu\u015fturmak i\u00e7in <code>CREATE TRIGGER<\/code> ifadesi kullan\u0131l\u0131r. Tetikleyiciler, genellikle birden fazla SQL ifadesi i\u00e7erdi\u011fi i\u00e7in <code>DELIMITER<\/code> komutunu kullanarak varsay\u0131lan noktal\u0131 virg\u00fcl (<code>;<\/code>) s\u0131n\u0131rlay\u0131c\u0131s\u0131n\u0131 ge\u00e7ici olarak de\u011fi\u015ftirmek yayg\u0131n bir uygulamad\u0131r. Bu, MySQL&#8217;in tetikleyici tan\u0131m\u0131n\u0131n tamam\u0131n\u0131 tek bir blok olarak i\u015flemesini sa\u011flar.<\/p>\n<h3>CREATE TRIGGER S\u00f6zdizimi<\/h3>\n<p>Genel <code>CREATE TRIGGER<\/code> s\u00f6zdizimi a\u015fa\u011f\u0131daki gibidir:<\/p>\n<pre><code class=\"language-sql\">DELIMITER \/\/\n\nCREATE TRIGGER trigger_adi\n[BEFORE | AFTER] [INSERT | UPDATE | DELETE] ON tablo_adi\nFOR EACH ROW\nBEGIN\n    -- Tetikleyici mant\u0131\u011f\u0131 buraya gelir\n    -- SQL ifadeleri\nEND; \/\/\n\nDELIMITER ;<\/code><\/pre>\n<p>*   <strong><code>DELIMITER \/\/<\/code><\/strong>: Varsay\u0131lan noktal\u0131 virg\u00fcl s\u0131n\u0131rlay\u0131c\u0131s\u0131n\u0131 <code>\/\/<\/code> ile de\u011fi\u015ftirir. Bu, tetikleyici g\u00f6vdesi i\u00e7indeki noktal\u0131 virg\u00fcllerin MySQL taraf\u0131ndan ayr\u0131 komutlar olarak yorumlanmas\u0131n\u0131 engeller.<br \/>\n*   <strong><code>CREATE TRIGGER trigger_adi<\/code><\/strong>: Tetikleyiciye benzersiz bir ad verir.<br \/>\n*   <strong><code>[BEFORE | AFTER]<\/code><\/strong>: Tetikleyicinin olay\u0131n \u00f6ncesinde mi yoksa sonras\u0131nda m\u0131 \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <strong><code>[INSERT | UPDATE | DELETE]<\/code><\/strong>: Tetikleyicinin hangi olay t\u00fcr\u00fcnde tetiklenece\u011fini belirtir.<br \/>\n*   <strong><code>ON tablo_adi<\/code><\/strong>: Tetikleyicinin hangi tablo \u00fczerinde \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <strong><code>FOR EACH ROW<\/code><\/strong>: Bu, MySQL&#8217;de varsay\u0131lan ve tek se\u00e7enektir. Tetikleyicinin, etkilenen her sat\u0131r i\u00e7in bir kez \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir.<br \/>\n*   <strong><code>BEGIN ... END;<\/code><\/strong>: Tetikleyici mant\u0131\u011f\u0131n\u0131 i\u00e7eren SQL ifadeleri blo\u011fudur.<br \/>\n*   <strong><code>DELIMITER ;<\/code><\/strong>: Tetikleyici tan\u0131m\u0131 bittikten sonra s\u0131n\u0131rlay\u0131c\u0131y\u0131 tekrar varsay\u0131lan noktal\u0131 virg\u00fcl\u00fcne geri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Tetikleyici i\u00e7inde, <code>NEW<\/code> ve <code>OLD<\/code> anahtar kelimelerini kullanarak i\u015flemden etkilenen sat\u0131r\u0131n verilerine eri\u015febilirsiniz:<br \/>\n*   <strong><code>NEW<\/code><\/strong>: <code>INSERT<\/code> ve <code>UPDATE<\/code> tetikleyicilerinde, i\u015flem sonras\u0131 sat\u0131r\u0131n yeni de\u011ferlerini temsil eder. <code>INSERT<\/code> tetikleyicilerinde <code>NEW.sutun_adi<\/code> ile yeni eklenecek de\u011ferlere eri\u015filebilir ve <code>BEFORE INSERT<\/code> tetikleyicilerinde bu de\u011ferler de\u011fi\u015ftirilebilir. <code>UPDATE<\/code> tetikleyicilerinde <code>NEW.sutun_adi<\/code> ile g\u00fcncellenmi\u015f de\u011ferlere eri\u015filir ve <code>BEFORE UPDATE<\/code> tetikleyicilerinde de\u011fi\u015ftirilebilir.<br \/>\n*   <strong><code>OLD<\/code><\/strong>: <code>UPDATE<\/code> ve <code>DELETE<\/code> tetikleyicilerinde, i\u015flem \u00f6ncesi sat\u0131r\u0131n orijinal de\u011ferlerini temsil eder. <code>UPDATE<\/code> tetikleyicilerinde <code>OLD.sutun_adi<\/code> ile g\u00fcncellenmeden \u00f6nceki de\u011ferlere, <code>DELETE<\/code> tetikleyicilerinde ise silinmeden \u00f6nceki de\u011ferlere eri\u015filir. <code>OLD<\/code> de\u011ferleri de\u011fi\u015ftirilemez.<\/p>\n<h3>\u00d6rnek 1: INSERT \u00d6ncesi Tetikleyici (BEFORE INSERT) &#8211; Veri Do\u011frulama ve Otomatik Zaman Damgas\u0131<\/h3>\n<p><code>kullanicilar<\/code> tablosuna yeni bir kay\u0131t eklenmeden \u00f6nce, e-posta adresinin ge\u00e7erli bir formatta olup olmad\u0131\u011f\u0131n\u0131 kontrol eden ve <code>olusturma_tarihi<\/code> s\u00fctununu manuel olarak ayarlayan bir tetikleyici olu\u015ftural\u0131m. Ayr\u0131ca, <code>guncelleme_tarihi<\/code> s\u00fctununu da ba\u015flang\u0131\u00e7ta <code>olusturma_tarihi<\/code> ile ayn\u0131 de\u011fere ayarlayal\u0131m.<\/p>\n<pre><code class=\"language-sql\">DELIMITER \/\/\n\nCREATE TRIGGER before_kullanici_insert\nBEFORE INSERT ON kullanicilar\nFOR EACH ROW\nBEGIN\n    -- E-posta format\u0131n\u0131 kontrol et\n    IF NEW.email NOT LIKE '%@%.%' THEN\n        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Ge\u00e7ersiz e-posta format\u0131!';\n    END IF;\n\n    -- Olu\u015fturma ve g\u00fcncelleme tarihlerini manuel olarak ayarla (e\u011fer NULL ise veya otomatik set edilmiyorsa)\n    -- Bu \u00f6rnekte CURRENT_TIMESTAMP default oldu\u011fu i\u00e7in asl\u0131nda gerek yok ama tetikleyici ile nas\u0131l yap\u0131laca\u011f\u0131n\u0131 g\u00f6steriyor.\n    IF NEW.olusturma_tarihi IS NULL THEN\n        SET NEW.olusturma_tarihi = NOW();\n    END IF;\n    IF NEW.guncelleme_tarihi IS NULL THEN\n        SET NEW.guncelleme_tarihi = NOW();\n    END IF;\nEND; \/\/\n\nDELIMITER ;<\/code><\/pre>\n<p><strong>A\u00e7\u0131klama:<\/strong><br \/>\n*   <code>before_kullanici_insert<\/code> ad\u0131nda bir tetikleyici olu\u015fturuldu.<br \/>\n<em>   Bu tetikleyici, <code>kullanicilar<\/code> tablosuna bir <code>INSERT<\/code> i\u015flemi yap\u0131lmadan <\/em>\u00f6nce* \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <code>NEW.email<\/code> ifadesi, eklenmekte olan sat\u0131rdaki e-posta de\u011ferine eri\u015fir.<br \/>\n*   <code>IF NEW.email NOT LIKE '%@%.%' THEN ... END IF;<\/code> blo\u011fu, e-posta format\u0131n\u0131n temel bir kontrol\u00fcn\u00fc yapar. E\u011fer format uygun de\u011filse, <code>SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Ge\u00e7ersiz e-posta format\u0131!';<\/code> komutu ile bir hata f\u0131rlat\u0131l\u0131r ve <code>INSERT<\/code> i\u015flemi iptal edilir. <code>45000<\/code> genel bir SQLSTATE kodudur ve kullan\u0131c\u0131 tan\u0131ml\u0131 hatalar i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>SET NEW.olusturma_tarihi = NOW();<\/code> ve <code>SET NEW.guncelleme_tarihi = NOW();<\/code> komutlar\u0131, <code>NEW<\/code> anahtar kelimesini kullanarak eklenmekte olan sat\u0131r\u0131n s\u00fctun de\u011ferlerini de\u011fi\u015ftirir. Bu, <code>BEFORE<\/code> tetikleyicilerinin en g\u00fc\u00e7l\u00fc \u00f6zelliklerinden biridir.<\/p>\n<p><strong>Test Edelim:<\/strong><\/p>\n<pre><code class=\"language-sql\">-- Ge\u00e7erli bir ekleme\nINSERT INTO kullanicilar (ad, email) VALUES ('Ay\u015fe Y\u0131lmaz', 'ayse.yilmaz@example.com');\nSELECT * FROM kullanicilar;\n\n-- Ge\u00e7ersiz e-posta ile ekleme (hata vermeli)\nINSERT INTO kullanicilar (ad, email) VALUES ('Mehmet Can', 'mehmet.canexample.com');<\/code><\/pre>\n<h3>\u00d6rnek 2: AFTER UPDATE Tetikleyici &#8211; De\u011fi\u015fiklikleri Loglama<\/h3>\n<p><code>kullanicilar<\/code> tablosundaki bir kullan\u0131c\u0131n\u0131n e-postas\u0131 veya ad\u0131 g\u00fcncellendi\u011finde, bu de\u011fi\u015fikli\u011fi <code>kullanici_log<\/code> tablosuna kaydeden bir tetikleyici olu\u015ftural\u0131m. Bu, denetim izi (audit trail) olu\u015fturmak i\u00e7in harika bir y\u00f6ntemdir.<\/p>\n<pre><code class=\"language-sql\">DELIMITER \/\/\n\nCREATE TRIGGER after_kullanici_update\nAFTER UPDATE ON kullanicilar\nFOR EACH ROW\nBEGIN\n    -- Sadece ad veya e-posta de\u011fi\u015ftiyse logla\n    IF OLD.ad <> NEW.ad OR OLD.email <> NEW.email THEN\n        INSERT INTO kullanici_log (kullanici_id, islem_turu, eski_deger, yeni_deger, islem_tarihi)\n        VALUES (\n            OLD.id,\n            'UPDATE',\n            CONCAT('Ad: ', OLD.ad, ', Email: ', OLD.email),\n            CONCAT('Ad: ', NEW.ad, ', Email: ', NEW.email),\n            NOW()\n        );\n    END IF;\nEND; \/\/\n\nDELIMITER ;<\/code><\/pre>\n<p><strong>A\u00e7\u0131klama:<\/strong><br \/>\n*   <code>after_kullanici_update<\/code> ad\u0131nda bir tetikleyici olu\u015fturuldu.<br \/>\n<em>   Bu tetikleyici, <code>kullanicilar<\/code> tablosunda bir <code>UPDATE<\/code> i\u015flemi yap\u0131ld\u0131ktan <\/em>sonra* \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <code>OLD.ad<\/code> ve <code>NEW.ad<\/code>, g\u00fcncellenmeden \u00f6nceki ve sonraki ad de\u011ferlerini temsil eder. Ayn\u0131 \u015fekilde <code>OLD.email<\/code> ve <code>NEW.email<\/code> e-posta de\u011ferleri i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>IF OLD.ad <> NEW.ad OR OLD.email <> NEW.email THEN ... END IF;<\/code> ko\u015fulu, sadece ad veya e-posta alanlar\u0131ndan biri de\u011fi\u015fti\u011finde loglama i\u015flemini tetikler. Bu, gereksiz log kay\u0131tlar\u0131n\u0131 \u00f6nler.<br \/>\n*   <code>INSERT INTO kullanici_log ...<\/code> ifadesi, <code>kullanici_log<\/code> tablosuna bir kay\u0131t ekleyerek de\u011fi\u015fikli\u011fi loglar. <code>CONCAT<\/code> fonksiyonu, birden fazla s\u00fctun de\u011ferini birle\u015ftirerek okunabilir bir log mesaj\u0131 olu\u015fturur.<\/p>\n<p><strong>Test Edelim:<\/strong><\/p>\n<pre><code class=\"language-sql\">-- Kullan\u0131c\u0131 bilgilerini g\u00fcncelle\nUPDATE kullanicilar SET email = 'ayse.y@example.com' WHERE id = 1;\nUPDATE kullanicilar SET ad = 'Ay\u015fe Sultan', email = 'ayse.sultan@example.com' WHERE id = 1;\n\nSELECT * FROM kullanicilar;\nSELECT * FROM kullanici_log;<\/code><\/pre>\n<h3>\u00d6rnek 3: BEFORE DELETE Tetikleyici &#8211; Silme \u0130\u015flemini Engelleme<\/h3>\n<p>Baz\u0131 durumlarda, belirli ko\u015fullar alt\u0131nda bir kayd\u0131n silinmesini engellemek isteyebilirsiniz. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n aktif sipari\u015fleri varsa silinmesini engellemek gibi. Basit bir \u00f6rnek olarak, ID&#8217;si 1 olan kullan\u0131c\u0131n\u0131n silinmesini engelleyen bir tetikleyici olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-sql\">DELIMITER \/\/\n\nCREATE TRIGGER before_kullanici_delete\nBEFORE DELETE ON kullanicilar\nFOR EACH ROW\nBEGIN\n    IF OLD.id = 1 THEN\n        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'ID\\'si 1 olan kullan\u0131c\u0131 silinemez!';\n    END IF;\nEND; \/\/\n\nDELIMITER ;<\/code><\/pre>\n<p><strong>A\u00e7\u0131klama:<\/strong><br \/>\n*   <code>before_kullanici_delete<\/code> ad\u0131nda bir tetikleyici olu\u015fturuldu.<br \/>\n<em>   Bu tetikleyici, <code>kullanicilar<\/code> tablosundan bir <code>DELETE<\/code> i\u015flemi yap\u0131lmadan <\/em>\u00f6nce* \u00e7al\u0131\u015f\u0131r.<br \/>\n*   <code>IF OLD.id = 1 THEN ... END IF;<\/code> ko\u015fulu, silinmekte olan sat\u0131r\u0131n <code>id<\/code> de\u011ferinin 1 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n*   E\u011fer <code>id<\/code> 1 ise, <code>SIGNAL SQLSTATE '45000' ...<\/code> komutu ile bir hata f\u0131rlat\u0131l\u0131r ve silme i\u015flemi iptal edilir.<\/p>\n<p><strong>Test Edelim:<\/strong><\/p>\n<pre><code class=\"language-sql\">-- ID'si 1 olan kullan\u0131c\u0131y\u0131 silmeye \u00e7al\u0131\u015f (hata vermeli)\nDELETE FROM kullanicilar WHERE id = 1;\n\n-- Ba\u015fka bir kullan\u0131c\u0131 ekleyip onu silmeye \u00e7al\u0131\u015f (ba\u015far\u0131l\u0131 olmal\u0131)\nINSERT INTO kullanicilar (ad, email) VALUES ('Deneme Kullan\u0131c\u0131', 'deneme@example.com');\nDELETE FROM kullanicilar WHERE email = 'deneme@example.com';\n\nSELECT * FROM kullanicilar;<\/code><\/pre>\n<h3>\u00d6rnek 4: Karma\u015f\u0131k Mant\u0131k Tetikleyicisi &#8211; Ba\u015fka Bir Tabloyu G\u00fcncelleme<\/h3>\n<p><code>urunler<\/code> tablosundaki <code>stok_miktari<\/code> g\u00fcncellendi\u011finde, bu de\u011fi\u015fikli\u011fi takip etmek ve <code>son_guncelleme<\/code> s\u00fctununu otomatik olarak ayarlamak isteyebiliriz. Ayr\u0131ca, stok belirli bir seviyenin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde uyar\u0131 mekanizmas\u0131 gibi ek mant\u0131klar da eklenebilir. Bu \u00f6rnekte <code>son_guncelleme<\/code> s\u00fctununu g\u00fcncelleyelim.<\/p>\n<pre><code class=\"language-sql\">DELIMITER \/\/\n\nCREATE TRIGGER after_urun_stok_update\nAFTER UPDATE ON urunler\nFOR EACH ROW\nBEGIN\n    -- E\u011fer stok miktar\u0131 de\u011fi\u015ftiyse ve yeni stok eski stoktan farkl\u0131ysa\n    IF OLD.stok_miktari <> NEW.stok_miktari THEN\n        -- son_guncelleme s\u00fctununu g\u00fcncelleyelim\n        -- NOT: AFTER UPDATE tetikleyicisinde ayn\u0131 tabloyu do\u011frudan UPDATE edemeyiz\n        -- Bu durumda BEFORE UPDATE kullanmal\u0131 veya bir stored procedure \u00e7a\u011f\u0131rmal\u0131y\u0131z.\n        -- Ancak, tetikleyicinin ba\u015fka bir tabloyu nas\u0131l etkileyebilece\u011fini g\u00f6stermek i\u00e7in\n        -- basit bir loglama \u00f6rne\u011fi ekleyelim veya BEFORE UPDATE ile son_guncelleme yapal\u0131m.\n\n        -- E\u011fer amac\u0131m\u0131z sadece son_guncelleme s\u00fctununu otomatik yapmaksa BEFORE UPDATE daha uygun:\n        -- A\u015fa\u011f\u0131daki k\u0131s\u0131m BEFORE UPDATE i\u00e7in daha uygun olurdu.\n        -- SET NEW.son_guncelleme = NOW();\n\n        -- AFTER UPDATE ile ba\u015fka bir tabloya loglama veya uyar\u0131 g\u00f6nderme mant\u0131\u011f\u0131 daha uygun\n        INSERT INTO kullanici_log (kullanici_id, islem_turu, eski_deger, yeni_deger, islem_tarihi)\n        VALUES (\n            NULL, -- Kullan\u0131c\u0131 ID'si yok, bu bir \u00fcr\u00fcn i\u015flemi\n            'URUN_STOK_UPDATE',\n            CONCAT('\u00dcr\u00fcn ID: ', OLD.urun_id, ', Eski Stok: ', OLD.stok_miktari),\n            CONCAT('\u00dcr\u00fcn ID: ', NEW.urun_id, ', Yeni Stok: ', NEW.stok_miktari),\n            NOW()\n        );\n\n        -- Stok kritik seviyenin alt\u0131na d\u00fc\u015ferse (\u00f6rne\u011fin 10) bir uyar\u0131 logu ekleyelim\n        IF NEW.stok_miktari < 10 AND OLD.stok_miktari >= 10 THEN\n            INSERT INTO kullanici_log (kullanici_id, islem_turu, eski_deger, yeni_deger, islem_tarihi)\n            VALUES (\n                NULL,\n                'STOK_UYARI',\n                CONCAT('\u00dcr\u00fcn ID: ', OLD.urun_id, ', Stok: ', OLD.stok_miktari),\n                CONCAT('\u00dcr\u00fcn ID: ', NEW.urun_id, ', Stok D\u00fc\u015f\u00fck: ', NEW.stok_miktari),\n                NOW()\n            );\n        END IF;\n    END IF;\nEND; \/\/\n\nDELIMITER ;<\/code><\/pre>\n<p><strong>Not:<\/strong> Ayn\u0131 tabloyu <code>AFTER UPDATE<\/code> tetikleyicisi i\u00e7inde do\u011frudan <code>UPDATE<\/code> edemezsiniz, \u00e7\u00fcnk\u00fc bu sonsuz bir d\u00f6ng\u00fcye yol a\u00e7abilir. <code>son_guncelleme<\/code> gibi bir s\u00fctunu otomatik olarak g\u00fcncellemek i\u00e7in <code>BEFORE UPDATE<\/code> tetikleyicisini kullanmal\u0131 veya s\u00fctunu <code>ON UPDATE CURRENT_TIMESTAMP<\/code> ile tan\u0131mlamal\u0131s\u0131n\u0131z. Yukar\u0131daki \u00f6rnekte <code>son_guncelleme<\/code> i\u00e7in bir tetikleyici yerine, stok de\u011fi\u015fikliklerini <code>kullanici_log<\/code> tablosuna kaydetme ve kritik stok seviyesi uyar\u0131s\u0131 verme mant\u0131\u011f\u0131na odakland\u0131m.<\/p>\n<p>\u015eimdi <code>son_guncelleme<\/code> i\u00e7in bir <code>BEFORE UPDATE<\/code> tetikleyicisi olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-sql\">DELIMITER \/\/\n\nCREATE TRIGGER before_urun_update_set_date\nBEFORE UPDATE ON urunler\nFOR EACH ROW\nBEGIN\n    -- Sadece stok veya fiyat de\u011fi\u015ftiyse son_guncelleme tarihini ayarla\n    IF OLD.stok_miktari <> NEW.stok_miktari OR OLD.fiyat <> NEW.fiyat THEN\n        SET NEW.son_guncelleme = NOW();\n    END IF;\nEND; \/\/\n\nDELIMITER ;<\/code><\/pre>\n<p><strong>Test Edelim:<\/strong><\/p>\n<pre><code class=\"language-sql\">-- \u00dcr\u00fcn ekle\nINSERT INTO urunler (urun_adi, stok_miktari, fiyat) VALUES ('Laptop', 25, 1200.00);\nINSERT INTO urunler (urun_adi, stok_miktari, fiyat) VALUES ('Mouse', 15, 25.00);\n\n-- \u00dcr\u00fcn sto\u011funu g\u00fcncelle\nUPDATE urunler SET stok_miktari = 20 WHERE urun_id = 1; -- son_guncelleme de\u011fi\u015fmeli, loga d\u00fc\u015fmeli\nUPDATE urunler SET fiyat = 30.00 WHERE urun_id = 2; -- son_guncelleme de\u011fi\u015fmeli, loga d\u00fc\u015fmeli\n\n-- Stok kritik seviyenin alt\u0131na d\u00fc\u015fs\u00fcn\nUPDATE urunler SET stok_miktari = 5 WHERE urun_id = 1; -- son_guncelleme de\u011fi\u015fmeli, loga d\u00fc\u015fmeli, uyar\u0131 logu d\u00fc\u015fmeli\n\nSELECT * FROM urunler;\nSELECT * FROM kullanici_log;<\/code><\/pre>\n<p>Bu \u00f6rnekler, tetikleyicilerin veri do\u011frulama, loglama, otomatik de\u011fer atama ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131n\u0131 nas\u0131l uygulayabilece\u011fini g\u00f6stermektedir.<\/p>\n<h2>Tetikleyicileri Y\u00f6netme<\/h2>\n<p>Tetikleyicileri olu\u015fturmak kadar, mevcut tetikleyicileri g\u00f6r\u00fcnt\u00fclemek, de\u011fi\u015ftirmek ve silmek de \u00f6nemlidir.<\/p>\n<h3>Mevcut Tetikleyicileri Listeleme<\/h3>\n<p>Veritaban\u0131n\u0131zdaki t\u00fcm tetikleyicileri veya belirli bir veritaban\u0131ndaki tetikleyicileri listelemek i\u00e7in <code>SHOW TRIGGERS<\/code> komutunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-sql\">SHOW TRIGGERS;<\/code><\/pre>\n<p>Bu komut, tetikleyicinin ad\u0131, olay\u0131 (BEFORE\/AFTER, INSERT\/UPDATE\/DELETE), \u00e7al\u0131\u015ft\u0131\u011f\u0131 tablo, tetikleyiciyi olu\u015fturan kullan\u0131c\u0131, olu\u015fturma zaman\u0131 ve SQL g\u00f6vdesi gibi bilgileri i\u00e7eren bir \u00e7\u0131kt\u0131 verecektir.<\/p>\n<p>Belirli bir veritaban\u0131ndaki tetikleyicileri g\u00f6rmek i\u00e7in:<\/p>\n<pre><code class=\"language-sql\">SHOW TRIGGERS FROM ornek_db;<\/code><\/pre>\n<p>Veya <code>information_schema.TRIGGERS<\/code> tablosunu sorgulayarak daha detayl\u0131 bilgi alabilirsiniz:<\/p>\n<pre><code class=\"language-sql\">SELECT *\nFROM information_schema.TRIGGERS\nWHERE TRIGGER_SCHEMA = 'ornek_db';<\/code><\/pre>\n<p>Bu sorgu, tetikleyiciler hakk\u0131nda daha fazla meta veri sa\u011flar ve \u00e7\u0131kt\u0131lar\u0131 filtrelemek i\u00e7in daha fazla esneklik sunar.<\/p>\n<h3>Tetikleyiciyi De\u011fi\u015ftirme (ALTER TRIGGER)<\/h3>\n<p>MySQL&#8217;de, di\u011fer veritaban\u0131 sistemlerinin aksine, mevcut bir tetikleyiciyi do\u011frudan <code>ALTER TRIGGER<\/code> komutuyla de\u011fi\u015ftirmek m\u00fcmk\u00fcn de\u011fildir. Bir tetikleyicinin mant\u0131\u011f\u0131n\u0131 veya \u00f6zelliklerini de\u011fi\u015ftirmek isterseniz, onu silip yeniden olu\u015fturman\u0131z gerekir.<\/p>\n<h3>Tetikleyiciyi Silme (DROP TRIGGER)<\/h3>\n<p>Bir tetikleyiciyi silmek i\u00e7in <code>DROP TRIGGER<\/code> komutunu kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-sql\">DROP TRIGGER [IF EXISTS] trigger_adi;<\/code><\/pre>\n<p>\u00d6rne\u011fin, <code>before_kullanici_insert<\/code> tetikleyicisini silmek i\u00e7in:<\/p>\n<pre><code class=\"language-sql\">DROP TRIGGER IF EXISTS before_kullanici_insert;<\/code><\/pre>\n<p><code>IF EXISTS<\/code> anahtar kelimesi, tetikleyicinin var olup olmad\u0131\u011f\u0131n\u0131 kontrol eder ve e\u011fer yoksa bir hata f\u0131rlat\u0131lmas\u0131n\u0131 engeller. Bu, betiklerde ve otomatikle\u015ftirilmi\u015f i\u015flemlerde kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<h2>Tetikleyicilerle \u0130lgili En \u0130yi Uygulamalar ve Dikkat Edilmesi Gerekenler<\/h2>\n<p>Tetikleyiciler g\u00fc\u00e7l\u00fc ara\u00e7lar olsa da, performans sorunlar\u0131na, hata ay\u0131klama zorluklar\u0131na ve beklenmedik davran\u0131\u015flara yol a\u00e7abilirler. Bu nedenle, onlar\u0131 dikkatli bir \u015fekilde kullanmak ve belirli en iyi uygulamalara uymak \u00f6nemlidir.<\/p>\n<h3>Performans Etkisi<\/h3>\n<p>*   <strong>Basit Tutun:<\/strong> Tetikleyicilerin i\u00e7indeki mant\u0131\u011f\u0131 m\u00fcmk\u00fcn oldu\u011funca basit ve h\u0131zl\u0131 tutun. Karma\u015f\u0131k sorgular veya uzun s\u00fcren i\u015flemler i\u00e7eren tetikleyiciler, her sat\u0131r i\u015flemi i\u00e7in tetiklendi\u011finde performans\u0131 ciddi \u015fekilde etkileyebilir.<br \/>\n*   <strong>Gereksiz Tetikleyicilerden Ka\u00e7\u0131n\u0131n:<\/strong> Yaln\u0131zca kesinlikle gerekli oldu\u011funda tetikleyici kullan\u0131n. Uygulama katman\u0131nda veya sakl\u0131 yordamlarda \u00e7\u00f6z\u00fclebilecek sorunlar i\u00e7in tetikleyici kullanmaktan ka\u00e7\u0131n\u0131n.<br \/>\n*   <strong>\u0130ndeksleme:<\/strong> Tetikleyiciler i\u00e7inde kullan\u0131lan <code>WHERE<\/code> ko\u015fullar\u0131ndaki s\u00fctunlar\u0131n d\u00fczg\u00fcn bir \u015fekilde indekslendi\u011finden emin olun. Bu, tetikleyicinin i\u00e7indeki sorgular\u0131n h\u0131zl\u0131 \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Hata Y\u00f6netimi<\/h3>\n<p>*   <strong>SIGNAL Kullan\u0131m\u0131:<\/strong> <code>SIGNAL SQLSTATE<\/code> komutunu kullanarak, tetikleyici i\u00e7inde veri do\u011frulama hatalar\u0131n\u0131 a\u00e7\u0131k\u00e7a bildirin. Bu, uygulama katman\u0131n\u0131n hatay\u0131 anlamas\u0131na ve uygun \u015fekilde yan\u0131t vermesine yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Loglama:<\/strong> \u00d6nemli tetikleyici eylemlerini veya hatalar\u0131n\u0131 ayr\u0131 bir log tablosuna kaydetmek, sorun giderme ve izleme i\u00e7in faydal\u0131d\u0131r.<\/p>\n<h3>Bak\u0131m ve Okunabilirlik<\/h3>\n<p>*   <strong>Anlaml\u0131 Adland\u0131rma:<\/strong> Tetikleyicilerinize, ne zaman ve hangi olayda \u00e7al\u0131\u015ft\u0131klar\u0131n\u0131 a\u00e7\u0131k\u00e7a belirten anlaml\u0131 adlar verin (\u00f6rne\u011fin, <code>before_kullanici_insert<\/code>, <code>after_urun_update<\/code>).<br \/>\n*   <strong>Dok\u00fcmantasyon:<\/strong> Tetikleyicilerin ne i\u015fe yarad\u0131\u011f\u0131n\u0131, hangi ko\u015fullarda \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 ve hangi i\u015f mant\u0131\u011f\u0131n\u0131 uygulad\u0131\u011f\u0131n\u0131 belgeleyin. Bu, \u00f6zellikle yeni geli\u015ftiricilerin sistemi anlamas\u0131na yard\u0131mc\u0131 olur.<br \/>\n*   <strong>Mod\u00fcler Yakla\u015f\u0131m:<\/strong> Karma\u015f\u0131k tetikleyici mant\u0131\u011f\u0131n\u0131 do\u011frudan tetikleyici g\u00f6vdesine yazmak yerine, sakl\u0131 yordamlar olu\u015fturarak ve bu sakl\u0131 yordamlar\u0131 tetikleyiciden \u00e7a\u011f\u0131rarak kodu daha mod\u00fcler ve y\u00f6netilebilir hale getirebilirsiniz.<\/p>\n<h3>D\u00f6ng\u00fcsel Tetikleyiciler<\/h3>\n<p>*   <strong>Ka\u00e7\u0131n\u0131n:<\/strong> Bir tetikleyicinin ba\u015fka bir tetikleyiciyi tetiklemesi ve bu durumun bir d\u00f6ng\u00fc olu\u015fturmas\u0131, sonsuz bir d\u00f6ng\u00fcye ve veritaban\u0131n\u0131n kilitlenmesine neden olabilir. Bu t\u00fcr senaryolardan ka\u00e7\u0131nmak i\u00e7in tetikleyici mant\u0131\u011f\u0131n\u0131 dikkatlice tasarlay\u0131n. \u00d6zellikle <code>AFTER<\/code> tetikleyicileri i\u00e7inde ayn\u0131 tabloyu g\u00fcncellemekten veya <code>BEFORE<\/code> tetikleyicileri i\u00e7inde tetikleyiciyi yeniden tetikleyebilecek i\u015flemleri yapmaktan ka\u00e7\u0131n\u0131n.<\/p>\n<h3>Alternatif Yakla\u015f\u0131mlar<\/h3>\n<p>*   <strong>Uygulama Mant\u0131\u011f\u0131:<\/strong> Bir\u00e7ok i\u015f kural\u0131, uygulama katman\u0131nda daha iyi y\u00f6netilebilir. Bu, hata ay\u0131klamay\u0131 kolayla\u015ft\u0131r\u0131r ve performans \u00fczerinde daha fazla kontrol sa\u011flar.<br \/>\n*   <strong>Sakl\u0131 Yordamlar (Stored Procedures):<\/strong> E\u011fer birden fazla veritaban\u0131 i\u015flemi bir arada y\u00fcr\u00fct\u00fclmesi gerekiyorsa, sakl\u0131 yordamlar tetikleyicilere bir alternatif olabilir. Tetikleyiciler genellikle tek bir tablo \u00fczerindeki tek bir olaya odaklan\u0131rken, sakl\u0131 yordamlar daha geni\u015f kapsaml\u0131 i\u015flemleri y\u00f6netebilir.<br \/>\n*   <strong>Foreign Key K\u0131s\u0131tlamalar\u0131:<\/strong> Referans b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in tetikleyiciler yerine \u00f6ncelikle <code>FOREIGN KEY<\/code> k\u0131s\u0131tlamalar\u0131n\u0131 kullan\u0131n. <code>FOREIGN KEY<\/code>&#8216;ler, CASCADE (ON UPDATE CASCADE, ON DELETE CASCADE) gibi yerle\u015fik davran\u0131\u015flarla referans b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc \u00e7ok daha verimli ve g\u00fcvenli bir \u015fekilde sa\u011flar. Tetikleyiciler, ancak <code>FOREIGN KEY<\/code>&#8216;lerin yetersiz kald\u0131\u011f\u0131 karma\u015f\u0131k ko\u015fullarda d\u00fc\u015f\u00fcn\u00fclmelidir.<\/p>\n<h2>S\u0131k Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h2>\n<p>Tetikleyicilerle \u00e7al\u0131\u015f\u0131rken kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri \u015funlard\u0131r:<\/p>\n<h3>DELIMITER Unutulmas\u0131<\/h3>\n<p><strong>Sorun:<\/strong> <code>CREATE TRIGGER<\/code> ifadesi i\u00e7inde birden fazla SQL komutu kullan\u0131rken <code>DELIMITER<\/code> komutunu kullanmay\u0131 unutmak veya yanl\u0131\u015f yap\u0131land\u0131rmak. Bu durumda MySQL, tetikleyici g\u00f6vdesindeki ilk noktal\u0131 virg\u00fcl\u00fc komutun sonu olarak alg\u0131lar ve bir s\u00f6zdizimi hatas\u0131 verir.<br \/>\n<strong>\u00c7\u00f6z\u00fcm:<\/strong> Tetikleyiciyi olu\u015fturmadan \u00f6nce <code>DELIMITER \/\/<\/code> gibi bir ifadeyle s\u0131n\u0131rlay\u0131c\u0131y\u0131 de\u011fi\u015ftirin ve tetikleyici tan\u0131m\u0131 bittikten sonra <code>DELIMITER ;<\/code> ile varsay\u0131lan s\u0131n\u0131rlay\u0131c\u0131ya geri d\u00f6n\u00fcn.<\/p>\n<pre><code class=\"language-sql\">DELIMITER \/\/\nCREATE TRIGGER my_trigger ...\nBEGIN\n    -- SQL komutlar\u0131;\n    -- Di\u011fer SQL komutlar\u0131;\nEND; \/\/\nDELIMITER ;<\/code><\/pre>\n<h3>NEW ve OLD Kullan\u0131m\u0131 Hatalar\u0131<\/h3>\n<p><strong>Sorun:<\/strong> <code>NEW<\/code> ve <code>OLD<\/code> anahtar kelimelerini yanl\u0131\u015f tetikleyici t\u00fcr\u00fcnde kullanmak veya var olmayan s\u00fctunlara eri\u015fmeye \u00e7al\u0131\u015fmak.<br \/>\n*   <code>BEFORE INSERT<\/code> tetikleyicilerinde <code>OLD<\/code> kullan\u0131lamaz.<br \/>\n*   <code>AFTER DELETE<\/code> tetikleyicilerinde <code>NEW<\/code> kullan\u0131lamaz.<br \/>\n*   <code>OLD<\/code> de\u011ferleri de\u011fi\u015ftirilemez.<br \/>\n<strong>\u00c7\u00f6z\u00fcm:<\/strong> Hangi tetikleyici t\u00fcr\u00fcnde hangi anahtar kelimelerin kullan\u0131labilece\u011fini ve de\u011fi\u015ftirilebilece\u011fini iyi anlay\u0131n.<br \/>\n*   <code>BEFORE INSERT<\/code>: <code>NEW<\/code> okunabilir ve de\u011fi\u015ftirilebilir.<br \/>\n*   <code>AFTER INSERT<\/code>: <code>NEW<\/code> okunabilir (de\u011fi\u015ftirilemez).<br \/>\n*   <code>BEFORE UPDATE<\/code>: <code>OLD<\/code> okunabilir (de\u011fi\u015ftirilemez), <code>NEW<\/code> okunabilir ve de\u011fi\u015ftirilebilir.<br \/>\n*   <code>AFTER UPDATE<\/code>: <code>OLD<\/code> ve <code>NEW<\/code> okunabilir (de\u011fi\u015ftirilemez).<br \/>\n*   <code>BEFORE DELETE<\/code>: <code>OLD<\/code> okunabilir (de\u011fi\u015ftirilemez).<br \/>\n*   <code>AFTER DELETE<\/code>: <code>OLD<\/code> okunabilir (de\u011fi\u015ftirilemez).<\/p>\n<h3>\u0130zin Sorunlar\u0131<\/h3>\n<p><strong>Sorun:<\/strong> Tetikleyici olu\u015fturmak veya tetikleyicinin i\u00e7indeki i\u015flemleri ger\u00e7ekle\u015ftirmek i\u00e7in yeterli yetkilere sahip olmamak.<br \/>\n<strong>\u00c7\u00f6z\u00fcm:<\/strong> Tetikleyiciyi olu\u015fturan kullan\u0131c\u0131n\u0131n <code>CREATE TRIGGER<\/code> yetkisine ve tetikleyici i\u00e7indeki SQL ifadelerini (\u00f6rne\u011fin, <code>INSERT<\/code>, <code>UPDATE<\/code> veya <code>DELETE<\/code> ba\u015fka bir tabloya) ger\u00e7ekle\u015ftirmek i\u00e7in gerekli yetkilere sahip oldu\u011fundan emin olun. Gerekirse, veritaban\u0131 y\u00f6neticinizden ilgili yetkileri isteyin veya <code>GRANT<\/code> komutunu kullanarak yetkileri verin.<\/p>\n<pre><code class=\"language-sql\">GRANT CREATE TRIGGER ON ornek_db.* TO 'kullanici_adi'@'localhost';\nGRANT INSERT ON ornek_db.kullanici_log TO 'kullanici_adi'@'localhost';<\/code><\/pre>\n<h3>Performans D\u00fc\u015f\u00fc\u015f\u00fc<\/h3>\n<p><strong>Sorun:<\/strong> Tetikleyiciler, \u00f6zellikle karma\u015f\u0131k mant\u0131k i\u00e7eriyorlarsa veya s\u0131k s\u0131k tetikleniyorlarsa, veritaban\u0131 i\u015flemlerinin yava\u015flamas\u0131na neden olabilir.<br \/>\n<strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n*   Yukar\u0131da bahsedilen en iyi uygulamalar\u0131 takip ederek tetikleyicileri basit ve verimli tutun.<br \/>\n*   Tetikleyicilerin i\u00e7indeki sorgular\u0131n performans\u0131n\u0131 <code>EXPLAIN<\/code> ile analiz edin.<br \/>\n*   Gereksiz tetikleyicileri kald\u0131r\u0131n.<br \/>\n*   Yo\u011fun i\u015flem g\u00f6ren tablolarda tetikleyici kullan\u0131m\u0131n\u0131 en aza indirin veya alternatif \u00e7\u00f6z\u00fcmler (uygulama mant\u0131\u011f\u0131, sakl\u0131 yordamlar) d\u00fc\u015f\u00fcn\u00fcn.<\/p>\n<h3>Hata Mesajlar\u0131n\u0131n Anla\u015f\u0131lmas\u0131<\/h3>\n<p><strong>Sorun:<\/strong> Tetikleyici taraf\u0131ndan f\u0131rlat\u0131lan hata mesajlar\u0131n\u0131n yetersiz veya anla\u015f\u0131lmaz olmas\u0131.<br \/>\n<strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>SIGNAL SQLSTATE<\/code> komutunu kullan\u0131rken a\u00e7\u0131klay\u0131c\u0131 <code>MESSAGE_TEXT<\/code> sa\u011flay\u0131n. Bu, hatan\u0131n nedenini ve nas\u0131l d\u00fczeltilece\u011fini anlamak i\u00e7in \u00f6nemlidir.<\/p>\n<pre><code class=\"language-sql\">SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Hata: \u00dcr\u00fcn sto\u011fu s\u0131f\u0131r\u0131n alt\u0131na d\u00fc\u015femez!';<\/code><\/pre>\n<p>Bu yayg\u0131n sorunlar\u0131 ve \u00e7\u00f6z\u00fcmleri bilmek, tetikleyicileri daha verimli ve sorunsuz bir \u015fekilde kullanman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>MySQL veritaban\u0131 tetikleyicileri, veritaban\u0131 seviyesinde otomasyon, veri b\u00fct\u00fcnl\u00fc\u011f\u00fc ve karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131 uygulamak i\u00e7in g\u00fc\u00e7l\u00fc bir mekanizma sunar. Ubuntu 18.04 \u00fczerinde MySQL&#8217;i kurup yap\u0131land\u0131rd\u0131ktan sonra, <code>CREATE TRIGGER<\/code> komutunu kullanarak <code>BEFORE<\/code> veya <code>AFTER<\/code> olaylar\u0131nda <code>INSERT<\/code>, <code>UPDATE<\/code> veya <code>DELETE<\/code> i\u015flemleri i\u00e7in tetikleyiciler olu\u015fturabilirsiniz. <code>NEW<\/code> ve <code>OLD<\/code> anahtar kelimeleri sayesinde, i\u015flem \u00f6ncesi ve sonras\u0131 verilere eri\u015febilir, hatta <code>BEFORE<\/code> tetikleyicilerinde bu verileri de\u011fi\u015ftirebilirsiniz.<\/p>\n<p>Ancak, tetikleyicilerin yanl\u0131\u015f veya a\u015f\u0131r\u0131 kullan\u0131m\u0131 performans sorunlar\u0131na, hata ay\u0131klama zorluklar\u0131na ve sistem karma\u015f\u0131kl\u0131\u011f\u0131na yol a\u00e7abilir. Bu nedenle, tetikleyicileri kullan\u0131rken dikkatli olmak, en iyi uygulamalar\u0131 takip etmek ve alternatif yakla\u015f\u0131mlar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir. Tetikleyicileri basit, odakl\u0131 ve iyi belgelenmi\u015f tutmak, veritaban\u0131 sisteminizin sa\u011fl\u0131\u011f\u0131n\u0131 ve y\u00f6netilebilirli\u011fini koruman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<p>Bu makalede sunulan bilgiler ve \u00f6rnekler, MySQL tetikleyicilerini Ubuntu 18.04 ortam\u0131nda etkin bir \u015fekilde y\u00f6netmek ve kullanmak i\u00e7in sa\u011flam bir temel sa\u011flamaktad\u0131r. Veritaban\u0131 y\u00f6netim becerilerinizi geli\u015ftirmek ve uygulamalar\u0131n\u0131z\u0131n veri katman\u0131n\u0131 daha sa\u011flam hale getirmek i\u00e7in tetikleyicilerin potansiyelini ke\u015ffetmeye devam edin.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma\nGiri\u015f\nVeritaban\u0131 y\u00f6netim sistemleri, modern uygulamalar\u0131n temelin","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1468],"tags":[],"class_list":{"0":"post-33157","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma\" \/>\n<meta property=\"og:description\" content=\"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma Giri\u015f Veritaban\u0131 y\u00f6netim sistemleri, modern uygulamalar\u0131n temelin\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-30T07:41:20+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma\",\"datePublished\":\"2025-10-30T07:41:20+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/\"},\"wordCount\":3386,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/\",\"name\":\"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-30T07:41:20+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/","og_locale":"tr_TR","og_type":"article","og_title":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma","og_description":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma Giri\u015f Veritaban\u0131 y\u00f6netim sistemleri, modern uygulamalar\u0131n temelin","og_url":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-30T07:41:20+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma","datePublished":"2025-10-30T07:41:20+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/"},"wordCount":3386,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/","url":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/","name":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-30T07:41:20+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/mysql-veritabani-tetikleyicilerini-ubuntu-18-04-uzerinde-yonetme-ve-kullanma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MySQL Veritaban\u0131 Tetikleyicilerini Ubuntu 18.04 \u00dczerinde Y\u00f6netme ve Kullanma"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33157","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33157"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33157\/revisions"}],"predecessor-version":[{"id":33158,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33157\/revisions\/33158"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33157"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33157"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33157"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}