Triggere
Regler som kjører inne i databasen ved hver innsetting, endring eller sletting — tegnet i en visuell flyt og lagt inn i motoren.
En trigger er en regel som lever inne i databasen og utløses av seg selv hver gang en rad i en tabell settes inn, endres eller slettes. Den bryr seg ikke om hvem som skrev: kommer skrivingen fra en skjerm, et API, et skript eller en annen applikasjon som er koblet til den samme databasen, så kjører triggeren.
Det er argumentet for triggere, og samtidig forsiktigheten de krever — logikk som kjører uten at noen kaller på den, er logikk ingen ser skje.
Hvor triggerne lever
I treet til datakilden, inne i gruppen Programmering, ved siden av Funksjoner / prosedyrer:

Å klikke på en trigger åpner den i en fane i arbeidsområdet, med flyten sin tegnet.
Nota
Ikke alle databasemotorer støtter triggere som tegnes på denne måten. Plattformen tilbyr bare det motoren som er koblet til kan gjøre: dukker ikke Ny trigger opp i menyen til datakilden, er det fordi den motoren ikke støtter det. Triggere som er opprettet utenfor plattformen listes fortsatt opp, merket som Ekstern trigger — støtter ikke canvas (kun SQL-redigering).

Opprette en trigger
- Hold musen over datakilden og åpne menyen ⋯.
- Velg Ny trigger. Dialogen åpnes med innledende data for triggeren — flyten bygges etterpå i canvaset.
- Fyll ut:
| Felt | Hva det er |
|---|---|
| Navn | Navnet på triggeren i databasen. Konvensjonen som foreslås er trg_minha_tabela. |
| Tabell | Tabellen som overvåkes. |
| Tidspunkt | BEFORE (før raden skrives) eller AFTER (etterpå). |
| Hendelser | INSERT, UPDATE, DELETE — minst én. Noen motorer godtar flere i samme trigger, andre bare én. |
- Bekreft med Opprett og åpne canvas.
Triggeren blir født som utkast: den finnes allerede på plattformen, men er ennå ikke lagt inn i databasen. Så lenge den er et utkast, merker treet den som det.
Tidspunkt og hendelser, i praksis
| Valg | Til hva |
|---|---|
| BEFORE INSERT/UPDATE | Normalisere eller fullføre verdier før de lagres — sette en kode i store bokstaver, fylle ut et avledet felt. |
| AFTER INSERT/UPDATE/DELETE | Reagere på det som allerede har skjedd — skrive en historikk, oppdatere en sum i en annen tabell. |
Verdiene i raden er tilgjengelige alt etter hendelsen: Nye verdier (NEW)
finnes i INSERT og i UPDATE; Gamle verdier (OLD) dukker bare opp når
triggeren lytter på UPDATE eller DELETE — i en INSERT finnes det ingen
gammel rad å vise.
Canvaset til triggeren
Flyten tegnes på et canvas, og hintet øverst oppsummerer bevegelsen: dra funksjoner/prosedyrer fra treet ut på canvaset; dobbeltklikk på en boks for å konfigurere utdata/inndata.
I linjen over canvaset står, fra venstre mot høyre:
| Knapp | Hva den gjør |
|---|---|
| Innstillinger | Åpner navn, tabell, Tidspunkt og Hendelser for triggeren på nytt. |
| (sammendraget) | Navnet, tabellen, tidspunktet og hendelsene, alltid synlige. |
| Uttrykk | Legger til en uttrykksnode i flyten. |
| Vis SQL | Viser triggeren kompilert, uten å kjøre noe. |
| Lagre og legg inn i databasen | Lagrer og legger triggeren inn i motoren. |
Tabellboksen — det som kommer inn i flyten
Den første boksen på canvaset er tabellen: det er fra den verdiene i raden som utløste triggeren kommer. Dobbeltklikk på den for å åpne Utdata fra triggeren og velge hva denne triggeren eksponerer til flyten: enkeltkolonner, hele raden (JSON), eller begge.
- Nye verdier (NEW) — raden slik den blir.
- Gamle verdier (OLD) — raden slik den var.
- I begge tilfellene kan du, i tillegg til enkeltkolonner, eksponere hele raden (JSON) — nyttig for å levere alt på én gang til en historikkfunksjon.
Hver utgang du velger blir en port på boksen, klar til å kobles.
Funksjonene og prosedyrene
Arbeidet i en trigger gjøres av funksjoner og prosedyrer som allerede finnes i databasen. Dra dem fra treet (Programmering ▸ Funksjoner / prosedyrer) ut på canvaset: hver av dem blir en boks med én inngang per parameter.
- Koble en port på tabellen til parameteren den mater — parameteren vises da som koblet.
- En parameter uten kobling beholder standardverdien sin.
- Funksjonene returnerer også en verdi: returporten kan mate en annen boks, og slik lenkes stegene sammen.
- Menyen på selve boksen har Fjern fra flyten.
For å fjerne en kobling klikker du på linjen: Fjerne denne koblingen? Parameteren mottar ikke lenger denne verdien.
Uttrykksnodene
Mellom en port og en parameter er ikke verdien alltid brukbar som den er. Knappen
Uttrykk legger til en node som finpusser/transformerer verdier: du erklærer
Inndata (med + inndata), kobler porter til dem, og skriver
SQL-uttrykket med {a}, {b}… for de tilkoblede inndataene — for eksempel
upper({a}) || '-' || {b}. Resultatet kommer ut av porten på noden og går videre
dit du vil.
Dobbeltklikk på noden for å konfigurere den (boksen sier det selv: dobbeltklikk for å redigere… så lenge den er tom).
Se SQL-en før du legger den inn
Vis SQL åpner forhåndsvisningen — SQL for triggeren (forhåndsvisning) — med advarselen som betyr noe: Kompilert med endringene du har nå — ingenting er kjørt. Gå gjennom og legg det inn når du vil.
Det er sikkerhetssteget: du ser nøyaktig hva som kommer til å bli opprettet i databasen, du kan kopiere det, vise det til den som administrerer motoren, og først deretter legge det inn. Den samme dialogen har knappen Lagre og legg inn i databasen for hånden.
Legge inn triggeren
Lagre og legg inn i databasen gjør begge deler: lagrer tegningen og oppretter triggeren i motoren. Går det bra, bekrefter plattformen: Triggeren er lagt inn i databasen.
Før den legges inn, kontrolleres tegningen. Avvisningene er tydelige:
| Melding | Hva som mangler |
|---|---|
| Gi triggeren et navn. | Navnet. |
| Velg tabellen. | Tabellen som overvåkes. |
| Velg minst én hendelse. | Minst én av INSERT/UPDATE/DELETE. |
| Canvaset har ingen funksjon/prosedyre. | En tom flyt gjør ingenting — dra inn minst én funksjon. |
| Det finnes en uttrykksnode uten uttrykk. | En tom uttrykksnode. |
Atenção
Å legge inn en trigger er en skriving i databasen som er koblet til, med umiddelbar virkning på alle skrivinger i den tabellen — også de som allerede var i gang. I et produksjonssystem ser du SQL-en først og legger den inn på et avtalt tidspunkt.
Slette en trigger
Menyen ⋯ for triggeren i treet har Slett, med bekreftelse — Slette triggeren «…»? — og det er endelig: triggeren går ut av databasen.
Se hva som ligger i databasen
SQL-konsollen, under modelldiagrammet, er stedet der du bekrefter virkningen av en trigger: skriv en spørring, Kjør, og se de virkelige radene. Det er også her du inspiserer det som allerede lå der før du kom.

Trigger, skript eller arbeidsflyt?
Alle tre automatiserer, og riktig valg sparer deg for måneder med forvirring:
| Verktøy | Kjører… | God til |
|---|---|---|
| Trigger | Inne i databasen, ved hver skriving i tabellen. | Regler som må gjelde for alle skrivinger: historikk, avledede felt, summer. |
| Skript | Utenfor databasen, for hånd, etter tidsplan eller som et steg i et API. | Tungt arbeid, integrasjoner, filer, utsendelser — alt som tar tid eller snakker med omverdenen. |
| Arbeidsflyt | Som en prosess med steg, beslutninger og menneskelige oppgaver. | Godkjenninger, kretsløp med folk inne i bildet, ventetid. |
Dica
Er logikken om dataene og kan ikke feile, er det en trigger. Er logikken om forretningen og noen må se den skje, er den det ikke: et skript eller en arbeidsflyt legger igjen spor, kjører med historikk og forklarer seg selv i Radar.
Hvorfor ikke…?
- Hvorfor dukker ikke Ny trigger opp i menyen til datakilden? Motoren som er koblet til støtter ikke triggere tegnet på canvaset. Du kan fortsatt opprette dem i SQL, og de dukker opp i treet som eksterne triggere.
- Hvorfor sier triggeren fortsatt at den er et utkast? Den ble opprettet, men er ennå ikke lagt inn. Åpne den og bruk Lagre og legg inn i databasen.
- Hvorfor ser jeg ikke Gamle verdier (OLD)? Triggeren lytter verken på
UPDATEellerDELETE. I enINSERTfinnes det ingen gammel rad. - Hvorfor får jeg ikke koblet en port til en parameter? Ikke alle koblinger gir mening — sjekk at du kobler en utgang (til høyre på boksen) til en inngang (til venstre på den andre).
- Hvorfor gjør triggeren ingenting? En flyt uten funksjoner skaper ikke noe
arbeid: kompileringen avviser den. Og sjekk Tidspunkt — en
BEFOREog enAFTERser ikke det samme. - Hvorfor ble skrivingene trege etter at jeg opprettet triggeren? Triggeren kjører for hver rad som skrives. Kaller den på tungt arbeid, har det arbeidet begynt å skje ved hver innsetting — i de tilfellene er stedet et skript etter tidsplan.