Güncellenebilir VIEW'lar ve INSTEAD OF Tetikleyicileri
VIEW'ları doğrudan güncellenebilir hâle getirin veya VIEW verileri topluyor ya da birleştiriyorsa INSTEAD OF tetikleyicilerini kullanın.
Güncellenebilir VIEW'lar ve INSTEAD OF Tetikleyicileri, CoddyKit'te ücretsiz bir SQL Academy dersidir. Bu, 4 dersinin 2. 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.
Otomatik Olarak Güncellenebilir Görünümler
PostgreSQL, basit görünümleri otomatik olarak güncellenebilir hale getirir. Görünüm üzerindeki INSERT/UPDATE/DELETE işlemi, temel tablo üzerinde aynı işleme dönüştürülür:
CREATE VIEW active_users AS
SELECT id, email, full_name FROM users WHERE deleted_at IS NULL;
UPDATE active_users SET full_name = 'Alice' WHERE id = 1;
-- Translates to UPDATE on the users table.Otomatik Güncellenebilirlik Gereksinimleri
Görünüm:
- Tam olarak ONE temel tabloya başvurmalıdır
- Toplulaştırma, GROUP BY, HAVING veya DISTINCT içermemelidir
- LIMIT veya OFFSET içermemelidir
- Küme işlemleri (UNION vb.) içermemelidir
- Sütunları doğrudan eşlemelidir (SELECT listesindeki ifadeler olmamalıdır — ya da yalnızca bazıları olabilir)
WITH CHECK OPTION
Görünümde görünmeyecek satırlar oluşturacak yazma işlemlerini engelleyin:
CREATE VIEW active_users AS
SELECT * FROM users WHERE deleted_at IS NULL
WITH CHECK OPTION;
INSERT INTO active_users (email, deleted_at) VALUES (..., NOW());
-- ERROR — would create a row outside the view's WHERE.Karmaşık Görünümler için INSTEAD OF Gerekir
Birleştirmeler, toplulaştırmalar veya ifadeler içeren görünümler otomatik olarak güncellenemez. Yazma işleminin ne anlama geldiğini tanımlayan bir INSTEAD OF tetikleyicisi yazmalısınız:
CREATE VIEW user_with_address AS
SELECT u.id, u.email, a.city, a.country
FROM users u JOIN addresses a ON a.user_id = u.id;
CREATE TRIGGER user_addr_update
INSTEAD OF UPDATE ON user_with_address
FOR EACH ROW EXECUTE FUNCTION update_user_addr();INSTEAD OF Tetikleyici İşlevi
İşlev, hangi temel tablolara yazılacağına karar verir:
CREATE FUNCTION update_user_addr() RETURNS TRIGGER AS $$
BEGIN
UPDATE users SET email = NEW.email WHERE id = NEW.id;
UPDATE addresses SET city = NEW.city, country = NEW.country WHERE user_id = NEW.id;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;INSTEAD OF Ne Zaman Uygulama Mantığından Daha İyidir
Birçok tüketici görünümü güncelliyorsa, güncelleme mantığını bir tetikleyicide merkezileştirmek tutarlılık sağlar. Yalnızca bir uygulama güncelleme yapıyorsa mantığı uygulama kodunda tutun.
SECURITY BARRIER
Planlayıcının güvenilmeyen görünüm tüketicilerine koşulları sızdırmasını engelleyin (maliyet üzerinden bilgi sızıntısı):
CREATE VIEW my_things AS
SELECT * FROM things WHERE owner_id = current_user_id()
WITH (security_barrier);Alternatif Olarak Satır Düzeyi Güvenliği
Modern PostgreSQL, temel tablolarda Satır Düzeyi Güvenliği (RLS) de destekler — çoğu zaman güvenlik görünümleri oluşturmaktan daha temizdir.
ALTER TABLE things ENABLE ROW LEVEL SECURITY;
CREATE POLICY owner_only ON things USING (owner_id = current_user_id());Özyinelemeli Görünümler
PostgreSQL, özyinelemeli görünümleri destekler (SELECT ile sorgulayabileceğiniz bir hiyerarşi):
CREATE RECURSIVE VIEW tree (id, parent_id, depth) AS
SELECT id, parent_id, 0 FROM nodes WHERE parent_id IS NULL
UNION ALL
SELECT n.id, n.parent_id, t.depth + 1
FROM nodes n JOIN tree t ON n.parent_id = t.id;İzinler
Temel tablolara değil, görünüm üzerinde izin verin:
GRANT SELECT, UPDATE ON active_users TO app_user;Performans Notu
INSTEAD OF tetikleyicisi satır başına bir kez çalışır. Toplu DML işlemleri için bu yavaştır. Çoğu zaman çağıranların doğrudan temel tablolara yazmasını tercih etmek daha iyidir.
Özet
Görünümler yazılabilir olabilir.
- Basit görünümler: otomatik olarak güncellenebilir
- Karmaşık görünümler: INSTEAD OF tetikleyicileri gerekir
- WITH CHECK OPTION görünürlüğü zorunlu kılar
- RLS çoğu zaman daha temiz bir güvenlik modelidir
Hızlı Kontrol
İki tabloyu birleştiren bir görünüm tanımlıyorsunuz. Varsayılan olarak bu görünüm üzerinden UPDATE çalıştırabilir misiniz?
Sıkça Sorulan Sorular
“Güncellenebilir VIEW'lar ve INSTEAD OF Tetikleyicileri” dersi ücretsiz mi?
Evet — “Güncellenebilir VIEW'lar ve INSTEAD OF Tetikleyicileri” 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.
“Güncellenebilir VIEW'lar ve INSTEAD OF Tetikleyicileri” dersinde ne öğreneceğim?
VIEW'ları doğrudan güncellenebilir hâle getirin veya VIEW verileri topluyor ya da birleştiriyorsa INSTEAD OF tetikleyicilerini kullanın. 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 2. dersidir.
“Güncellenebilir VIEW'lar ve INSTEAD OF Tetikleyicileri” 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
- Basit VIEW'lar: Mantıksal Yeniden Kullanım
- Güncellenebilir VIEW'lar ve INSTEAD OF Tetikleyicileri
- MATERIALIZED VIEW'lar ve REFRESH Stratejileri
- Önceden Toplama Ne Zaman Yapılmalı