<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Batuhan KATIRCI's Blog]]></title><description><![CDATA[developer and appsec expert with 10+ years of experience]]></description><link>https://blog.batuhan.org</link><generator>RSS for Node</generator><lastBuildDate>Wed, 06 May 2026 16:09:01 GMT</lastBuildDate><atom:link href="https://blog.batuhan.org/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[postgresql trigger ile password degisikligi loglamak]]></title><description><![CDATA[postgresql'de insert/update/delete islemleri sonrasina hook olusturmak mumkun. bu hooklar ile de bir suru degisik senaryoyu db'ye yaptirabiliriz.
ornegin userlarin yaptigi sifre degisikliklerini baska bir tabloda tutmak istiyoruz, bu akis tamamiyle d...]]></description><link>https://blog.batuhan.org/trigger-ile-password-degisikligi-loglamak</link><guid isPermaLink="true">https://blog.batuhan.org/trigger-ile-password-degisikligi-loglamak</guid><category><![CDATA[postgres]]></category><dc:creator><![CDATA[Batuhan KATIRCI]]></dc:creator><pubDate>Wed, 28 Apr 2021 23:48:02 GMT</pubDate><content:encoded><![CDATA[<p>postgresql'de insert/update/delete islemleri sonrasina hook olusturmak mumkun. bu hooklar ile de bir suru degisik senaryoyu db'ye yaptirabiliriz.</p>
<p>ornegin userlarin yaptigi sifre degisikliklerini baska bir tabloda tutmak istiyoruz, bu akis tamamiyle db tarafinda halledilebilir (iyidir kotudur orasi size kalmis tabii).</p>
<p><code>log_user_password_changes</code> adinda bir fonksiyon olusturup, user tablosunda update yaptildiginda bu fonksiyonu trigger ettirelim.</p>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">OR</span> <span class="hljs-keyword">REPLACE</span> <span class="hljs-keyword">FUNCTION</span> log_user_password_changes()
  <span class="hljs-keyword">RETURNS</span> <span class="hljs-keyword">TRIGGER</span> 
  <span class="hljs-keyword">LANGUAGE</span> PLPGSQL
  <span class="hljs-keyword">AS</span>
$$
<span class="hljs-keyword">BEGIN</span>
    <span class="hljs-keyword">IF</span> NEW.password &lt;&gt; OLD.password <span class="hljs-keyword">THEN</span>
        <span class="hljs-comment">--- eski sifreyi db'ye yazalim</span>
         <span class="hljs-keyword">INSERT</span> <span class="hljs-keyword">INTO</span> user_password_changes(user_id, <span class="hljs-keyword">password</span>, changed_on)
         <span class="hljs-keyword">VALUES</span>(OLD.id, OLD.password, <span class="hljs-keyword">now</span>());

        <span class="hljs-comment">--- ayni user icin 90 gunden eski degisiklikleri de silelim</span>
        <span class="hljs-keyword">DELETE</span> <span class="hljs-keyword">from</span> user_password_changes <span class="hljs-keyword">WHERE</span> user_id = OLD.id <span class="hljs-keyword">and</span> changed_on &lt;= <span class="hljs-keyword">current_timestamp</span> - (<span class="hljs-string">'90 days'</span>)::<span class="hljs-built_in">interval</span>;
    <span class="hljs-keyword">END</span> <span class="hljs-keyword">IF</span>;

    RETURN NEW;
<span class="hljs-keyword">END</span>;
$$
</code></pre>
<pre><code class="lang-sql"><span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">TRIGGER</span> user_password_change
    <span class="hljs-keyword">AFTER</span> <span class="hljs-keyword">UPDATE</span> <span class="hljs-keyword">ON</span> <span class="hljs-keyword">users</span>
    <span class="hljs-keyword">FOR</span> <span class="hljs-keyword">EACH</span> <span class="hljs-keyword">ROW</span>
    <span class="hljs-keyword">EXECUTE</span> <span class="hljs-keyword">PROCEDURE</span> log_user_password_changes();
</code></pre>
<p><code>demo</code>:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.youtube.com/watch?v=bIK5mygDWuQ">https://www.youtube.com/watch?v=bIK5mygDWuQ</a></div>
]]></content:encoded></item></channel></rss>