Päivitettävät näkymät ja INSTEAD OF -triggerit
Tee näkymistä suoraan päivitettäviä tai käytä INSTEAD OF -triggereitä, kun näkymä koostaa tai yhdistää tietoja.
Päivitettävät näkymät ja INSTEAD OF -triggerit on ilmainen SQL Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu SQL Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Automaattisesti päivitettävät näkymät
PostgreSQL tekee yksinkertaisista näkymistä automaattisesti päivitettäviä. Näkymään kohdistuvat INSERT-, UPDATE- ja DELETE-operaatiot kirjoitetaan uudelleen samoiksi operaatioiksi perustaulussa:
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.Automaattisesti päivitettävien näkymien vaatimukset
Näkymän on täytettävä seuraavat ehdot:
- Viitattava täsmälleen yhteen perustauluun
- Ei aggregointeja, GROUP BY-, HAVING- tai DISTINCT-määreitä
- Ei LIMIT- tai OFFSET-määreitä
- Ei joukko-operaatioita, kuten UNION
- Sarakkeet on yhdistettävä suoraan — SELECT-luettelossa ei saa olla lausekkeita, tai niitä saa olla vain rajoitetusti
WITH CHECK OPTION
Estäkää kirjoitukset, jotka loisisivat näkymästä näkymättömiä rivejä:
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.Monimutkaiset näkymät tarvitsevat INSTEAD OF -triggerin
Liitoksia, aggregointeja tai lausekkeita sisältäviä näkymiä ei päivitetä automaattisesti. Teidän on kirjoitettava INSTEAD OF -triggeri, joka määrittää kirjoitusoperaation toiminnan:
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 -triggerifunktio
Funktio päättää, mihin perustauluihin kirjoitetaan:
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;Milloin INSTEAD OF on parempi kuin sovelluslogiikka
Jos monet kuluttajat päivittävät näkymää, päivityslogiikan keskittäminen triggeriin varmistaa yhdenmukaisuuden. Jos vain yksi sovellus tekee päivityksiä, pitäkää logiikka sovelluskoodissa.
SECURITY BARRIER
Estäkää kyselysuunnittelijaa vuotamasta predikaatteja epäluotettaville näkymän käyttäjille kustannusten kautta tapahtuvan tietovuodon estämiseksi:
CREATE VIEW my_things AS
SELECT * FROM things WHERE owner_id = current_user_id()
WITH (security_barrier);Rivitason tietoturva vaihtoehtona
Moderni PostgreSQL tukee myös rivitason tietoturvaa (RLS) perustauluissa — se on usein selkeämpi ratkaisu kuin tietoturvanäkymien rakentaminen.
ALTER TABLE things ENABLE ROW LEVEL SECURITY;
CREATE POLICY owner_only ON things USING (owner_id = current_user_id());Rekursiiviset näkymät
PostgreSQL tukee rekursiivisia näkymiä, joista voitte tehdä kyselyitä esimerkiksi hierarkian käsittelemiseksi:
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;Käyttöoikeudet
Myöntäkää oikeudet näkymään, älkää perustauluihin:
GRANT SELECT, UPDATE ON active_users TO app_user;Suorituskykyä koskeva huomautus
INSTEAD OF -triggeri suoritetaan kerran kutakin riviä kohden. Siksi se on hidas suurissa DML-operaatioissa. Usein soittajien kannattaa kirjoittaa suoraan perustauluihin.
Kertaus
Näkymiin voi kirjoittaa.
- Yksinkertaiset näkymät: päivittyvät automaattisesti
- Monimutkaiset näkymät: INSTEAD OF -triggerit
- WITH CHECK OPTION valvoo näkyvyyttä
- RLS on usein selkeämpi tietoturvamalli
Pikatarkistus
Määrittelette näkymän, joka liittää kaksi taulua. Voitteko oletusarvoisesti tehdä sen kautta UPDATE-operaation?
Opi SQL tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 46
- Oppitunnit
- 183
Usein kysytyt kysymykset
Onko oppitunti ”Päivitettävät näkymät ja INSTEAD OF -triggerit” ilmainen?
Kyllä – oppitunnin ”Päivitettävät näkymät ja INSTEAD OF -triggerit” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko SQL Academy-kurssin, päivitä CoddyKit PROhon. SQL Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Päivitettävät näkymät ja INSTEAD OF -triggerit”?
Tee näkymistä suoraan päivitettäviä tai käytä INSTEAD OF -triggereitä, kun näkymä koostaa tai yhdistää tietoja. Harjoittelet SQL Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni SQL Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin SQL Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Päivitettävät näkymät ja INSTEAD OF -triggerit”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä SQL Academy-oppitunnilla?
Kyllä. Jokainen SQL Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Tavalliset näkymät: looginen uudelleenkäyttö
- Päivitettävät näkymät ja INSTEAD OF -triggerit
- Materialisoidut näkymät ja REFRESH-strategiat
- Milloin esikoostaa