# postgresql trigger ile password degisikligi loglamak

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 db tarafinda halledilebilir (iyidir kotudur orasi size kalmis tabii).

`log_user_password_changes` adinda bir fonksiyon olusturup, user tablosunda update yaptildiginda bu fonksiyonu trigger ettirelim.

```sql
CREATE OR REPLACE FUNCTION log_user_password_changes()
  RETURNS TRIGGER 
  LANGUAGE PLPGSQL
  AS
$$
BEGIN
	IF NEW.password <> OLD.password THEN
        --- eski sifreyi db'ye yazalim
		 INSERT INTO user_password_changes(user_id, password, changed_on)
		 VALUES(OLD.id, OLD.password, now());

        --- ayni user icin 90 gunden eski degisiklikleri de silelim
        DELETE from user_password_changes WHERE user_id = OLD.id and changed_on <= current_timestamp - ('90 days')::interval;
	END IF;

	RETURN NEW;
END;
$$
```

```sql
CREATE TRIGGER user_password_change
    AFTER UPDATE ON users
    FOR EACH ROW
    EXECUTE PROCEDURE log_user_password_changes();
```

`demo`:

%[https://www.youtube.com/watch?v=bIK5mygDWuQ]

