KEPLIN Docs

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:

Gruppen Programmering i treet: Funksjoner / prosedyrer og Triggere, med antallet i hver.
Gruppen Programmering i treet: Funksjoner / prosedyrer og Triggere, med antallet i hver.

Å 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).

Handlingsmenyen til datakilden — hva plattformen tilbyr å opprette avhenger av motoren i databasen som er koblet til.
Handlingsmenyen til datakilden — hva plattformen tilbyr å opprette avhenger av motoren i databasen som er koblet til.

Opprette en trigger

  1. Hold musen over datakilden og åpne menyen .
  2. Velg Ny trigger. Dialogen åpnes med innledende data for triggeren — flyten bygges etterpå i canvaset.
  3. 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.
  1. 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.

  1. Koble en port på tabellen til parameteren den mater — parameteren vises da som koblet.
  2. En parameter uten kobling beholder standardverdien sin.
  3. Funksjonene returnerer også en verdi: returporten kan mate en annen boks, og slik lenkes stegene sammen.
  4. 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.

SQL-konsollen, under modellen: du skriver til venstre, Kjør kjører, og resultatet dukker opp til høyre.
SQL-konsollen, under modellen: du skriver til venstre, Kjør kjører, og resultatet dukker opp til høyre.

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å UPDATE eller DELETE. I en INSERT finnes 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 BEFORE og en AFTER ser 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.