Oracle PL/SQL-liipaisin: Yhdistetyyppien & sijaan

โšก ร„lykรคs yhteenveto

PL/SQL-liipaisimet ovat tallennettuja ohjelmia, jotka Oracle moottori kรคynnistyy automaattisesti, kun DML-, DDL- tai tietokantatapahtuma tapahtuu. Ne yllรคpitรคvรคt tietojen eheyttรค, valvovat sรครคntรถjรค ja tukevat tarkastusta, ja ne sisรคltรคvรคt BEFORE-, AFTER-, INSTEAD OF- ja yhdistetyt tyypit.

  • ๐Ÿ”” Liipaisimen mรครคritelmรค: Liipaisin on tallennettu ohjelma, Oracle moottori kรคynnistyy automaattisesti mรครคritetyn DML-, DDL- tai tietokantatapahtuman yhteydessรค.
  • ๐ŸŽฏ Triggerityypit: Kรคynnistimet luokitellaan ajoituksen (ENNEN, Jร„LKEEN, SIJAAN), tason (LAUSEKE, ROW) ja tapahtuman (DML, DDL, TIETOKANTA) mukaan.
  • ๐Ÿ” :UUSI ja :VANHA: Rivitason triggerit kรคyttรคvรคt :NEW- ja :OLD-lauseita sarakearvojen lukemiseen ennen DML-lausetta ja sen jรคlkeen.
  • ๐ŸชŸ Liipaisimen sijaan: INSTEAD OF -liipaisin tekee muuten pรคivittymรคttรถmรคstรค monimutkaisesta nรคkymรคstรค muokattavissa olevan toimimalla sen perustaulukoihin.
  • ๐Ÿงฉ Yhdistelmรคliipaisin: Yhdistelmรคliipaisin yhdistรครค kaikkien neljรคn ajoituspisteen toiminnot yhden liipaisimen rungon sisรคllรค.
  • ๐Ÿค– AI-apu: Tekoรคlyavustajat, kuten GitHub Copilot, luonnostavat kommentista ENNEN, Jร„LKEEN, SIJAAN ja yhdistetyt kรคynnistimet.

Oracle PL/SQL-liipaisimet, mukaan lukien INSTEAD OF ja yhdistetyt liipaisimet

Mikรค on Trigger PL/SQL:ssรค?

Lร„Pร„ISYT tallennetaan PL / SQL ohjelmat, jotka laukaisevat Oracle moottori automaattisesti, kun DML-lauseet kuten lisรคys, pรคivitys ja poisto suoritetaan taulukossa tai kun joitakin tapahtumia tapahtuu. Liipaisimen tapauksessa suoritettava koodi voidaan mรครคritellรค vaatimuksen mukaan. Voit valita tapahtuman, jonka jรคlkeen liipaisin on laukaistava, ja suorituksen ajoituksen. Liipaisimen tarkoituksena on yllรคpitรครค tietojen eheyttรค tietokannassa.

Triggerien edut

Seuraavassa on triggerien edut.

  • Joitakin johdettuja sarakearvoja luodaan automaattisesti
  • Viittauksen eheyden varmistaminen
  • Tapahtumaloki ja tietojen tallentaminen pรถytรคkรคyttรถรถn
  • Tilintarkastus
  • Synctaulukoiden kroninen kopiointi
  • Turvallisuuslupien asettaminen
  • Virheellisten tapahtumien estรคminen

Triggerien tyypit Oracle

Triggerit voidaan luokitella seuraavien parametrien perusteella.

Luokittelu ajoituksen perusteella

  • ENNEN Liipaisinta: Se kรคynnistyy ennen mรครคritetyn tapahtuman tapahtumista.
  • Jร„LKEEN Liipaisin: Se kรคynnistyy mรครคritetyn tapahtuman jรคlkeen.
  • Liipaisimen sijaan: Erikoistyyppi. Lisรคtietoja seuraavista aiheista. (vain DML:lle)

Luokittelu tason perusteella

  • STATEMENT-tason liipaisin: Se laukeaa kerran mรครคritetyn tapahtumalausekkeen mukaisesti.
  • ROW-tason liipaisin: Se kรคynnistyy jokaisen tietueen kohdalla, johon mรครคritetty tapahtuma vaikuttaa. (vain DML:lle)

Luokittelu tapahtuman perusteella

  • DML-liipaisin: Se kรคynnistyy, kun DML-tapahtuma on mรครคritetty (INSERT/UPDATE/DELETE).
  • DDL-liipaisin: Se kรคynnistyy, kun DDL-tapahtuma on mรครคritetty (CREATE/ALTER).
  • TIETOKANTA-liipaisin: Se kรคynnistyy, kun tietokantatapahtuma on mรครคritetty (LOGON/LOGOFF/STARTUP/SHUTDOWN).

Joten jokainen liipaisin on yhdistelmรค yllรค olevista parametreista.

Kuinka luoda triggeri

Alla on syntaksi liipaisimen luomiseksi. Alla oleva kuvakaappaus nรคyttรครค tรคmรคn liipaisimen luomissyntaksin muodossa Oracle.

Kรคynnistรค luontisyntaksi BEFORE-, AFTER- ja INSTEAD OF -asetuksilla Oracle PL / SQL

CREATE [ OR REPLACE ] TRIGGER <trigger_name> 

[BEFORE | AFTER | INSTEAD OF ]

[INSERT | UPDATE | DELETE......]

ON<name of underlying object>

[FOR EACH ROW] 

[WHEN<condition for trigger to get execute> ]

DECLARE
<Declaration part>
BEGIN
<Execution part> 
EXCEPTION
<Exception handling part> 
END;

Syntaksiselitys:

  • Yllรค oleva syntaksi nรคyttรครค erilaiset valinnaiset lauseet, jotka ovat lรคsnรค liipaisimen luomisessa.
  • BEFORE/AFTER mรครคrittรครค tapahtumien ajankohdat.
  • LISร„ร„/Pร„IVITYS/KIRJAUDU/LUO/jne. mรครคrittรครค tapahtuman, jota varten laukaisu on kรคynnistettรคvรค.
  • ON-lauseke mรครคrittรครค objektin, jolle edellรค mainittu tapahtuma on voimassa. Tรคmรค on esimerkiksi sen taulukon nimi, jolle DML-tapahtuma voi tapahtua DML-liipaisimen tapauksessa.
  • Komento โ€FOR EACH ROWโ€ mรครคrittรครค rivitason liipaisimen.
  • WHEN-lauseke mรครคrittรครค lisรคehdon, jossa liipaisimen on laukaistava.
  • Mรครคrittelyosa, suoritusosa ja poikkeusten kรคsittelyosa ovat samat kuin muissakin PL/SQL-lohkotIlmoitusosa ja poikkeusten kรคsittely osat ovat valinnaisia.

:NEW ja :OLD lauseke

Rivitason triggerissรค triggeri kรคynnistyy kullekin liittyvรคlle riville. Ja joskus on tarpeen tietรครค arvo ennen ja jรคlkeen DML-kรคskyn.

Oracle on tarjonnut rivitason liipaisimessa kaksi lauseketta nรคiden arvojen sรคilyttรคmistรค varten. Voimme kรคyttรครค nรคitรค lausekkeita viitataksemme liipaisimen rungon sisรคllรค oleviin vanhoihin ja uusiin arvoihin.

  • : UUSI โ€“ Se sรคilyttรครค uuden arvon perustaulukon/nรคkymรคn sarakkeille liipaisimen suorituksen aikana.
  • :VANHA โ€“ Se sรคilyttรครค perustaulukon/nรคkymรคn sarakkeiden vanhan arvon liipaisimen suorituksen aikana.

Tรคtรค lauseketta tulisi kรคyttรครค DML-tapahtuman perusteella. Alla oleva taulukko mรครคrittรครค, mikรค lauseke on kelvollinen millekin DML-lausekkeelle (INSERT/UPDATE/DELETE).

INSERT Pร„IVITYS POISTA
: UUSI Pร„TEVร„ Pร„TEVร„ POISTOARVOTON. Poistotapauksessa ei ole uutta arvoa.
:VANHA VIRHEELLINEN. Merkkijonossa ei ole vanhaa arvoa. Pร„TEVร„ Pร„TEVร„

Liipaisimen SIJAAN

โ€INSTEAD OF -liipaisinโ€ on erityinen liipaisintyyppi. Sitรค kรคytetรครคn vain DML-liipaisimissa. Sitรค kรคytetรครคn, kun jokin DML-tapahtuma on tapahtumassa monimutkaisessa nรคkymรคssรค.

Tarkastellaan esimerkkiรค, jossa nรคkymรค luodaan kolmesta perustaulukosta. Kun jokin DML-tapahtuma suoritetaan tรคmรคn nรคkymรคn kautta, siitรค tulee virheellinen, koska tiedot otetaan kolmesta eri taulukosta. Tรคssรค tapauksessa kรคytetรครคn siis INSTEAD OF -liipaisinta. INSTEAD OF -liipaisinta kรคytetรครคn suoraan perustaulukoiden muokkaamiseen sen sijaan, ettรค nรคkymรครค muokattaisiin tietyn tapahtuman osalta.

Esimerkki 1: Tรคssรค esimerkissรค luomme monimutkaisen nรคkymรคn kahdesta perustaulukosta, jossa Table_1 on emp-taulukko ja Table_2 on osastotaulukko.

Seuraavaksi katsomme, miten INSTEAD OF -liipaisinta kรคytetรครคn sijaintitietojen Pร„IVITYKSEN (UPDATE) antamiseen tรคssรค monimutkaisessa nรคkymรคssรค. Katsomme myรถs, miten :NEW ja :OLD ovat hyรถdyllisiรค liipaisimissa. Esimerkki tehdรครคn seuraavissa vaiheissa:

  • Vaihe 1: Taulukoiden 'emp' ja 'dept' luominen asianmukaisilla sarakkeilla
  • Vaihe 2: Taulukoiden tรคyttรคminen esimerkkiarvoilla
  • Vaihe 3: Nรคkymรคn luominen yllรค luoduille taulukoille
  • Vaihe 4: Nรคkymรคn pรคivittรคminen ennen INSTEAD OF -liipaisinta
  • Vaihe 5: INSTEAD OF -liipaisimen luominen
  • Vaihe 6: Nรคkymรคn pรคivitys INSTEAD OF -liipaisimen jรคlkeen

Vaihe 1) Luodaan taulukot 'emp' ja 'dept' sopivilla sarakkeilla.

Alla oleva kuvakaappaus nรคyttรครค 'emp'- ja 'dept'-perustaulukoiden luomisen ohjelmassa Oracle.

emp- ja dept-perustaulukoiden luominen Oracle INSTEAD OF -liipaisimen esimerkkiรค varten

CREATE TABLE emp(
emp_no NUMBER,
emp_name VARCHAR2(50),
salary NUMBER,
manager VARCHAR2(50),
dept_no NUMBER);
/

CREATE TABLE dept(
Dept_no NUMBER,
Dept_name VARCHAR2(50),
LOCATION VARCHAR2(50));
/

Code Selitys

  • Code rivi 1โ€“7: Taulukon 'emp' luonti.
  • Code rivi 8โ€“12: Taulukon 'osasto' luonti.

lรคhtรถ:

Table Created

Vaihe 2) Koska olemme nyt luoneet taulukot, tรคytรคmme ne esimerkkiarvoilla.

Alla olevassa kuvakaappauksessa nรคytetรครคn esimerkkirivien lisรครคminen 'dept'- ja 'emp'-taulukoihin.

Esimerkkiosastojen ja tyรถntekijรถiden rivien lisรครคminen Oracle PL / SQL

BEGIN
INSERT INTO DEPT VALUES(10,'HR','USA');
INSERT INTO DEPT VALUES(20,'SALES','UK');
INSERT INTO DEPT VALUES(30,'FINANCIAL','JAPAN');
COMMIT;
END;
/

BEGIN
INSERT INTO EMP VALUES(1000,'XXX',15000,'AAA',30);
INSERT INTO EMP VALUES(1001,'YYY',18000,'AAA',20) ;
INSERT INTO EMP VALUES(1002,'ZZZ',20000,'AAA',10);
COMMIT;
END;
/

Code Selitys

  • Code rivi 13โ€“19: Tietojen lisรครคminen 'dept'-taulukkoon.
  • Code rivi 20โ€“26: Tietojen lisรครคminen 'emp'-taulukkoon.

lรคhtรถ:

PL/SQL procedure completed

Vaihe 3) Nรคkymรคn luominen yllรค luoduille taulukoille.

Alla olevassa kuvakaappauksessa nรคkyy, kuinka monimutkainen nรคkymรค luodaan ja sitรค sitten kysellรครคn.

guru99_emp_view-kompleksinรคkymรคn luominen ja kysely yhdistรคmรคllรค emp ja dept

CREATE VIEW guru99_emp_view(
Employee_name,dept_name,location) AS
SELECT emp.emp_name,dept.dept_name,dept.location
FROM emp,dept
WHERE emp.dept_no=dept.dept_no;
/
SELECT * FROM guru99_emp_view;

Code Selitys

  • Code rivi 27โ€“32: 'guru99_emp_view'-nรคkymรคn luominen.
  • Code rivi 33: Kysely guru99_emp_view.

lรคhtรถ:

View created
TYร–NTEKIJร„N NIMI DEPT_NAME SIJAINTI
ZZZ HR Soumi
YYY MYYNTI UK
XXX TALOUDELLINEN JAPANI

Vaihe 4) Nรคkymรคn pรคivitys ennen INSTEAD OF -liipaisinta.

Alla oleva kuvakaappaus nรคyttรครค pรคivitysyrityksen kompleksinรคkymรคssรค ja siitรค johtuvan virheen.

Pรคivitys kompleksisen nรคkymรคn virheestรค ORA-01779:n vuoksi ennen INSTEAD OF -liipaisinta

BEGIN
UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';
COMMIT;
END;
/

Code Selitys

  • Code rivi 34โ€“38: Pรคivitรค โ€œXXXโ€:n sijainniksi 'FRANCE'. Se aiheutti poikkeuksen, koska DML-lausekkeita ei sallita suoraan kompleksinรคkymรคssรค.

lรคhtรถ:

ORA-01779: cannot modify a column which maps to a non key-preserved table

ORA-06512: at line 2

Vaihe 5) Vรคlttรครคksemme edellisessรค vaiheessa nรคkymรคn pรคivittรคmisen aikana ilmenneen virheen, kรคytรคmme tรคssรค vaiheessa โ€INSTEAD OFโ€ -liipaisinta.

Alla oleva kuvakaappaus nรคyttรครค INSTEAD OF -liipaisimen luomisen.

guru99_view_modify_trg-liipaisimen luominen kompleksinรคkymรคssรค liipaisimen SIJAAN

CREATE TRIGGER guru99_view_modify_trg
INSTEAD OF UPDATE
ON guru99_emp_view
FOR EACH ROW
BEGIN
UPDATE dept
SET location=:new.location
WHERE dept_name=:old.dept_name;
END;
/

Code Selitys

  • Code rivi 39: INSTEAD OF -liipaisimen luonti 'UPDATE'-tapahtumalle 'guru99_emp_view'-nรคkymรคssรค ROW-tasolla. Se sisรคltรครค update-lausekkeen, joka pรคivittรครค sijainnin perustaulukossa 'dept'.
  • Code rivi 44: Pรคivityslauseke kรคyttรครค ':NEW'- ja ':OLD'-muuttujaa sarakkeiden arvon lรถytรคmiseen ennen pรคivitystรค ja sen jรคlkeen.

lรคhtรถ:

Trigger Created

Vaihe 6) Nรคkymรคn pรคivitys INSTEAD OF -liipaisimen jรคlkeen. Virhettรค ei enรครค ilmene, koska โ€INSTEAD OF -liipaisinโ€ kรคsittelee tรคmรคn monimutkaisen nรคkymรคn pรคivitystoiminnon. Kun koodi suoritetaan, tyรถntekijรคn XXX sijainti pรคivittyy โ€Japanistaโ€ muotoon โ€Ranskaโ€.

Alla oleva kuvakaappaus nรคyttรครค onnistuneen pรคivityksen INSTEAD OF -liipaisimen avulla ja pรคivitetyn nรคkymรคn.

Nรคkymรคn pรคivitys onnistui INSTEAD OF -liipaisimen kautta, joka nรคyttรครค sijainnin FRANCE

BEGIN
UPDATE guru99_emp_view SET location='FRANCE' WHERE employee_name='XXX';
COMMIT;
END;
/
SELECT * FROM guru99_emp_view;

Code Selitys:

  • Code rivi 49โ€“53: Sijainnin โ€œXXXโ€ pรคivitys muotoon 'FRANCE'. Pรคivitys onnistuu, koska liipaisin 'INSTEAD OF' on pysรคyttรคnyt varsinaisen pรคivityskรคskyn nรคkymรคlle ja suorittanut perustaulukon pรคivityksen.
  • Code rivi 55: Pรคivitetyn tietueen tarkistaminen.

lรคhtรถ:

PL/SQL procedure successfully completed
TYร–NTEKIJร„N NIMI DEPT_NAME SIJAINTI
ZZZ HR Soumi
YYY MYYNTI UK
XXX TALOUDELLINEN RANSKA

Yhdistelmรคlaukaisu

Yhdistetyn liipaisimen avulla voit mรครคrittรครค toiminnot jokaiselle neljรคlle ajoituspisteelle yhdessรค liipaisimen rungossa. Sen tukemat neljรค erilaista ajoituspistettรค ovat seuraavat.

  • ENNEN LAUSUNTOA โ€“ taso
  • ENNEN RIVAA โ€“ taso
  • RIVIN Jร„LKEEN โ€“ taso
  • LAUSUNNON Jร„LKEEN โ€“ taso

Se tarjoaa mahdollisuuden yhdistรครค eri ajoitusten toiminnot samaan liipaisimeen.

Alla oleva kuvakaappaus nรคyttรครค yhdistetyn liipaisimen syntaksin ja sen neljรค ajoitusosiota.

Yhdistetty liipaisinsyntaksi, joka nรคyttรครค BEFORE- ja AFTER-lausekkeet sekรค rivien ajoitusosiot

CREATE [ OR REPLACE ] TRIGGER <trigger_name>
FOR
[INSERT | UPDATE | DELETE.......]
ON <name of underlying object>
<Declarative part>
BEFORE STATEMENT IS
BEGIN
<Execution part>;
END BEFORE STATEMENT;

BEFORE EACH ROW IS
BEGIN
<Execution part>;
END EACH ROW;

AFTER EACH ROW IS
BEGIN
<Execution part>;
END AFTER EACH ROW;

AFTER STATEMENT IS
BEGIN
<Execution part>;
END AFTER STATEMENT;
END;

Syntaksiselitys:

  • Yllรค oleva syntaksi nรคyttรครค 'COMPOUND'-liipaisimen luomisen.
  • Deklaratiiviosa on yhteinen kaikille liipaisimen rungon suorituslohkoille.
  • Nรคmรค neljรค ajoituslohkoa voivat olla missรค tahansa jรคrjestyksessรค. Kaikkien neljรคn ajoituslohkon olemassaolo ei ole pakollista. Voimme luoda COMPOUND-liipaisimen vain tarvittaville ajoituksille.

Esimerkki 1: Tรคssรค esimerkissรค luomme liipaisimen, joka tรคyttรครค palkkasarakkeen automaattisesti oletusarvolla 5000.

Alla oleva kuvakaappaus nรคyttรครค yhdistetyn liipaisimen esimerkin ja sen tulosteen.

Yhdistelmรคliipaisin tรคyttรครค palkkasarakkeen automaattisesti oletusarvolla 5000

CREATE TRIGGER emp_trig
FOR INSERT
ON emp
COMPOUND TRIGGER
BEFORE EACH ROW IS
BEGIN
:new.salary:=5000;
END BEFORE EACH ROW;
END emp_trig;
/
BEGIN
INSERT INTO EMP VALUES(1004,'CCC',15000,'AAA',30);
COMMIT;
END;
/
SELECT * FROM emp WHERE emp_no=1004;

Code Selitys:

  • Code rivi 2โ€“10: Yhdistetyn liipaisimen luonti. Se luodaan BEFORE ROW -tasolle, jotta palkkaan lisรคtรครคn oletusarvo 5000. Tรคmรค muuttaa palkan oletusarvoon '5000' ennen tietueen lisรครคmistรค tauluun.
  • Code rivi 11โ€“14: Lisรครค tietue 'emp'-taulukkoon.
  • Code rivi 16: Lisรคtyn tietueen varmentaminen.

lรคhtรถ:

Trigger created

PL/SQL procedure successfully completed.
EMP_NAME EMP_NO PALKKA MANAGER DEPT_NO
CCC 1004 5000 AAA 30

Triggerien ottaminen kรคyttรถรถn ja poistaminen kรคytรถstรค

Liipaisimet voidaan ottaa kรคyttรถรถn tai poistaa kรคytรถstรค. Liipaisimen ottamiseksi kรคyttรถรถn tai poistamiseksi kรคytรถstรค on annettava ALTER (DDL) -lauseke liipaisimelle, joka poistaa sen kรคytรถstรค tai ottaa sen kรคyttรถรถn.

Alla on syntaksi liipaisimien kรคyttรถรถnottoa/poistamista varten.

ALTER TRIGGER <trigger_name> [ENABLE|DISABLE];
ALTER TABLE <table_name> [ENABLE|DISABLE] ALL TRIGGERS;

Syntaksiselitys:

  • Ensimmรคinen syntaksi nรคyttรครค, kuinka yksittรคinen liipaisin otetaan kรคyttรถรถn/pois kรคytรถstรค.
  • Toinen lause nรคyttรครค, kuinka kaikki tietyn taulukon triggerit otetaan kรคyttรถรถn tai poistetaan kรคytรถstรค.

UKK

ORA-04091-mutaation taulukkovirhe ilmenee, kun rivitason triggeri yrittรครค kysellรค tai muokata samaa taulukkoa, joka sen kรคynnisti. Voit vรคlttรครค sen kรคyttรคmรคllรค yhdistettyรค triggeria, lausetason triggeria tai pitรคmรคllรค rivejรค pakettikokoelmassa.

Liipaisin laukeaa automaattisesti, kun DML-, DDL- tai tietokantatapahtuma tapahtuu, se ei ota vastaan โ€‹โ€‹parametreja eikรค palauta mitรครคn. tallennettu menettely toimii vain, kun sitรค kutsutaan erikseen, hyvรคksyy parametrit ja voi palauttaa arvoja.

Kรคytรค DROP TRIGGER trigger_name -lauseketta poistaaksesi liipaisimen pysyvรคsti. Toisin kuin kรคytรถstรค poistaminen, joka pitรครค liipaisimen, mutta estรครค sen toiminnan, dropping poistaa mรครคritelmรคn kokonaan, joten sinun on luotava se uudelleen, jos logiikkaa tarvitaan uudelleen.

Tee kysely datakirjaston nรคkymistรค USER_TRIGGERS omille triggereillesi tai ALL_TRIGGERS kaikille triggereille, joihin sinulla on pรครคsy. Ne nรคyttรคvรคt triggerin nimen, tyypin, triggeritapahtuman, perusobjektin ja tilan, mikรค auttaa sinua tarkastamaan olemassa olevia triggereitรค.

Ei suoraan, koska liipaisin jakaa sytytyslausekkeen kauppaJos haluat tehdรค itsenรคisen commitin, mรครคritรค liipaisin tai sen kutsuma proseduuri PRAGMA AUTONOMOUS_TRANSACTION-metodilla, joka suorittaa tyรถn erillisessรค, itsenรคisesti committoivassa transaktiossa.

Ennen Oracle Versiossa 11g samantyyppisten liipaisimien jรคrjestystรค ei taattu. Versiosta 11g eteenpรคin CREATE TRIGGER -lausekkeen FOLLOWS-lauseke antaa sinun mรครคrittรครค, ettรค yksi liipaisin laukeaa toisensa jรคlkeen, mikรค antaa deterministisen suoritusjรคrjestyksen.

Kyllรค. GitHub Copilot luonnokset ENNEN, Jร„LKEEN, SIJAAN ja yhdistetyt liipaisimet, mukaan lukien :NEW ja :OLD viittaukset kommentista. RevTarkista ajoitus, WHEN-ehto ja mutatointitaulukon riskit ennen luodun liipaisimen kรคyttรถรถnottoa.

Tekoรคlyavustajat skannaavat liipaisimia mutatoituvien taulukoiden riskien, puuttuvien :NEW- tai :OLD-kรคsittelyjen, rekursiivisten kรคynnistysten ja DML:รครค hidastavan raskaan logiikan varalta. Tรคmรค koneoppimisen tarkastelu merkitsee hauraita liipaisimia ja ehdottaa lausetason tai yhdistettyjen koodien uudelleenkirjoittamista ennen kuin koodi pรครคsee tuotantoon.

Tiivistรค tรคmรค viesti seuraavasti: