Tabloları Tetikleyicilerle Denetleme
audit_log tablosuna yazan AFTER INSERT/UPDATE/DELETE tetikleyicileriyle bir denetim izi oluşturun.
Tabloları Tetikleyicilerle Denetleme, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, SQL Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. SQL Academy kursu toplamda 4 dersten oluşur.
Denetim Neden Gerekli?
Denetim günlükleri "kim, neyi, ne zaman değiştirdi" sorularını yanıtlar. Uyumluluk (HIPAA, SOX ve GDPR kapsamındaki silme hakkı incelemeleri) ve operasyonel adli incelemeler için gereklidir.
Denetim Tablosu
Tek bir merkezi tablo her değişikliği kaydeder:
CREATE TABLE audit_log (
id BIGSERIAL PRIMARY KEY,
ts TIMESTAMPTZ NOT NULL DEFAULT NOW(),
user_name TEXT NOT NULL DEFAULT CURRENT_USER,
table_name TEXT NOT NULL,
action TEXT NOT NULL, -- INSERT, UPDATE, DELETE
row_id TEXT,
old_data JSONB,
new_data JSONB
);Denetim Tetikleyici İşlevi
Birçok tabloda yeniden kullanılabilen tek bir işlev:
CREATE OR REPLACE FUNCTION audit_row()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO audit_log (table_name, action, row_id, old_data, new_data)
VALUES (
TG_TABLE_NAME,
TG_OP,
COALESCE(NEW.id::TEXT, OLD.id::TEXT),
CASE WHEN TG_OP IN ('UPDATE','DELETE') THEN to_jsonb(OLD) END,
CASE WHEN TG_OP IN ('INSERT','UPDATE') THEN to_jsonb(NEW) END
);
RETURN COALESCE(NEW, OLD);
END;
$$ LANGUAGE plpgsql;Tablolara Ekleyin
AFTER INSERT/UPDATE/DELETE işlemlerinde tetikleyin:
CREATE TRIGGER trg_audit_users
AFTER INSERT OR UPDATE OR DELETE ON users
FOR EACH ROW EXECUTE FUNCTION audit_row();to_jsonb(NEW)
to_jsonb yöntemi satırın tamamını genel amaçlı olarak yakalar — sütun başına kod yazmanız gerekmez. id sütunu bulunan tüm tablolarda çalışır.
İşlemi Yapanı İzleme
Uygulama tek bir veritabanı kullanıcısı olarak çalışıyorsa mevcut kullanıcı bilgisi yeterli değildir. Uygulama kullanıcısını bir oturum GUC'si üzerinden aktarın:
-- App sets:
SET LOCAL app.user_id = '42';
-- Trigger reads:
INSERT INTO audit_log (... actor_id ...) VALUES (..., current_setting('app.user_id', true)::BIGINT);Belirli Sütunları Denetleme
Seçmeli denetim için tetikleyicinin WHEN yan tümcesini kullanın:
CREATE TRIGGER trg_audit_role_change
AFTER UPDATE OF role ON users
FOR EACH ROW WHEN (OLD.role IS DISTINCT FROM NEW.role)
EXECUTE FUNCTION audit_role_change();Tablo Başına Denetim Tabloları
Alternatif olarak her gerçek tablo için (örneğin users_audit) aynı şemaya ve denetim üst verilerine sahip bir denetim tablosu oluşturabilirsiniz. Sorgulaması daha kolaydır ancak sürdürülecek DDL miktarı daha fazladır.
Yalnızca Farkları Denetleme
Yalnızca değişen sütunları saklayın:
INSERT INTO audit_log (table_name, action, changes)
VALUES (
TG_TABLE_NAME, TG_OP,
(SELECT jsonb_object_agg(key, value)
FROM jsonb_each(to_jsonb(NEW))
WHERE NEW.* IS DISTINCT FROM OLD.* AND to_jsonb(NEW)->key IS DISTINCT FROM to_jsonb(OLD)->key)
);Denetim Tablosu Performansı
Denetim tablosu yoğun sistemlerde hızla büyür. Zamana göre bölümlere ayırın:
CREATE TABLE audit_log (...) PARTITION BY RANGE (ts);
CREATE TABLE audit_log_2024_q1 PARTITION OF audit_log
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');Performans Dengesi
Artık her insert/update/delete işlemi ikinci bir satır daha yazar. Yazma ağırlıklı tablolarda bu, G/Ç miktarını iki katına çıkarabilir. Sınayın, izleyin ve bu dengenin buna değip değmediğine karar verin.
Veritabanı Tetikleyicilerini Ne Zaman Kullanmayın
Olay veri yolu entegrasyonuna ihtiyacınız varsa olayları NOTIFY veya LISTEN ile kuyruğa alın ya da tetikleyiciler yerine mantıksal çoğaltma / CDC araçlarını (Debezium) kullanın.
Özet
Denetim tetikleyicileri, geçmişi yakalamanın en basit yoludur.
- to_jsonb(NEW/OLD) kullanan tek bir genel amaçlı işlev
- Her denetlenen tabloya ekleyin
- Denetim tablolarını zamana göre bölümlere ayırın
- Uygulamadaki işlemi yapan kullanıcıyı GUC'ler üzerinden açıkça izleyin
Hızlı Kontrol
Bir denetim tetikleyici işlevinin içinde yeni satırı genel amaçlı olarak JSONB biçiminde nasıl yakalarsınız?
Sıkça Sorulan Sorular
“Tabloları Tetikleyicilerle Denetleme” dersi ücretsiz mi?
Evet — “Tabloları Tetikleyicilerle Denetleme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve SQL Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. SQL Academy kursu toplamda 4 dersten oluşur.
“Tabloları Tetikleyicilerle Denetleme” dersinde ne öğreneceğim?
audit_log tablosuna yazan AFTER INSERT/UPDATE/DELETE tetikleyicileriyle bir denetim izi oluşturun. SQL Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
SQL Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te SQL Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Tabloları Tetikleyicilerle Denetleme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu SQL Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her SQL Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Tetikleyici Anatomisi: BEFORE/AFTER, FOR EACH ROW
- PL/pgSQL İşlevlerinin Temelleri
- DO Blokları ve Anonim Kod
- Tabloları Tetikleyicilerle Denetleme