KEPLIN Docs

Triggers

Regler som körs inne i databasen vid varje infogning, ändring eller borttagning — ritade i ett visuellt flöde och tillämpade på motorn.

En trigger är en regel som lever inne i databasen och utlöses av sig själv varje gång en rad i en tabell infogas, ändras eller raderas. Den bryr sig inte om vem som skrev: kommer skrivningen från en skärm, ett API, ett skript eller en annan applikation kopplad till samma databas, så körs triggern.

Det är argumentet för triggers, och också den försiktighet de kräver — logik som körs utan att någon anropar den är logik som ingen ser hända.

Var triggers lever

I datakällans träd, inuti gruppen Programmering, bredvid Funktioner/procedurer:

Gruppen Programmering i trädet: Funktioner/procedurer och Triggers, med antalet i varje.
Gruppen Programmering i trädet: Funktioner/procedurer och Triggers, med antalet i varje.

Att klicka på en trigger öppnar den i en flik i arbetsytan, med sitt flöde uppritat.

Nota

Alla databasmotorer stöder inte triggers som ritas så här. Plattformen erbjuder bara det som den anslutna motorn kan göra: om Ny trigger inte dyker upp i datakällans meny är det för att den motorn inte stöder det. Triggers som skapats utanför plattformen listas fortfarande, märkta som Extern trigger — stöder inte canvas (endast SQL-redigering).

Datakällans åtgärdsmeny — vad plattformen erbjuder att skapa beror på den anslutna databasens motor.
Datakällans åtgärdsmeny — vad plattformen erbjuder att skapa beror på den anslutna databasens motor.

Skapa en trigger

  1. Hovra över datakällan och öppna menyn .
  2. Välj Ny trigger. Dialogen öppnas med triggerns grunduppgifter — flödet byggs sedan i canvasen.
  3. Fyll i:
Fält Vad det är
Namn Triggerns namn i databasen. Konventionen som föreslås är trg_min_tabell.
Tabell Tabellen som bevakas.
Tidpunkt BEFORE (innan raden skrivs) eller AFTER (efteråt).
Händelser INSERT, UPDATE, DELETE — minst en. Vissa motorer tar emot flera i samma trigger, andra bara en.
  1. Bekräfta med Skapa och öppna canvas.

Triggern föds som utkast: den finns redan i plattformen, men har ännu inte tillämpats på databasen. Så länge den är utkast markerar trädet den som sådan.

Tidpunkt och händelser, i praktiken

Val Till vad
BEFORE INSERT/UPDATE Normalisera eller komplettera värden innan de sparas — sätta en kod i versaler, fylla i ett härlett fält.
AFTER INSERT/UPDATE/DELETE Reagera på det som redan hänt — skriva en historik, uppdatera en summa i en annan tabell.

Radens värden är tillgängliga beroende på händelsen: Nya värden (NEW) finns i INSERT och UPDATE; Gamla värden (OLD) dyker bara upp när triggern lyssnar på UPDATE eller DELETE — i ett INSERT finns ingen gammal rad att visa.

Triggerns canvas

Flödet ritas på en canvas, och tipset längst upp sammanfattar rörelsen: dra funktioner och procedurer från trädet till canvasen; dubbelklicka på en ruta för att konfigurera dess in- och utdata.

I listen ovanför canvasen finns, från vänster till höger:

Knapp Vad den gör
Inställningar Öppnar triggerns namn, tabell, Tidpunkt och Händelser igen.
(sammanfattningen) Namnet, tabellen, tidpunkten och händelserna, alltid synliga.
Uttryck Lägger till en uttrycksnod i flödet.
Visa SQL Visar den kompilerade triggern, utan att köra något.
Spara och tillämpa i databasen Sparar och tillämpar triggern på motorn.

Tabellrutan — det som kommer in i flödet

Canvasens första ruta är tabellen: det är därifrån värdena kommer från raden som utlöste triggern. Dubbelklicka på den för att öppna Triggerns outputs och välja vad den här triggern exponerar för flödet: enskilda kolumner, hela raden (JSON) eller båda.

  • Nya värden (NEW) — raden som den blir.
  • Gamla värden (OLD) — raden som den var.
  • I båda fallen kan du, utöver de enskilda kolumnerna, exponera hela raden (JSON) — praktiskt för att lämna över allt på en gång till en historikfunktion.

Varje vald utdata blir en port på rutan, redo att kopplas.

Funktionerna och procedurerna

Arbetet i en trigger görs av funktioner och procedurer som redan finns i databasen. Dra dem från trädet (Programmering ▸ Funktioner/procedurer) till canvasen: var och en blir en ruta med en parameter per ingång.

  1. Koppla en port på tabellen till parametern den matar — parametern visar sig sedan som kopplad.
  2. En parameter utan koppling behåller sitt standardvärde.
  3. Funktioner returnerar också värden: returporten kan mata en annan ruta, så att stegen kedjas ihop.
  4. Rutans egen meny har Ta bort från flödet.

För att göra en koppling ogjord klickar du på linjen: Ta bort den här kopplingen? Parametern slutar ta emot det här värdet.

Uttrycksnoderna

Mellan en port och en parameter duger värdet inte alltid som det är. Knappen Uttryck lägger till en nod som förfinar eller omvandlar värden: du deklarerar Inputs (med + input), kopplar portar till dem och skriver SQL-uttrycket med {a}, {b}… för de kopplade inputen — till exempel upper({a}) || '-' || {b}. Resultatet kommer ut i nodens port och går vidare dit du vill.

Dubbelklicka på noden för att konfigurera den (rutan säger själv dubbelklicka för att redigera… medan den är tom).

Se SQL:en innan du tillämpar

Visa SQL öppnar förhandsvisningen — Triggerns SQL (förhandsvisning) — med den varning som betyder något: Kompilerad med dina nuvarande ändringar — ingenting har körts. Granska och tillämpa när du vill.

Det är säkerhetssteget: du ser exakt vad som kommer att skapas i databasen, du kan kopiera det, visa det för den som administrerar motorn, och först därefter tillämpa. Samma dialog har knappen Spara och tillämpa i databasen nära till hands.

Tillämpa triggern

Spara och tillämpa i databasen gör två saker: sparar ritningen och skapar triggern i motorn. När det går bra bekräftar plattformen: Triggern har tillämpats i databasen.

Innan den tillämpas kontrolleras ritningen. Nekandena är tydliga:

Meddelande Vad som saknas
Ge triggern ett namn (Inställningar). Namnet.
Välj tabellen (Inställningar). Tabellen som bevakas.
Välj minst en händelse (Inställningar). Minst en av INSERT/UPDATE/DELETE.
Canvasen har ingen funktion eller procedur. Ett tomt flöde gör ingenting — dra dit minst en funktion.
Det finns en uttrycksnod utan definierat uttryck. En tom uttrycksnod.

Atenção

Att tillämpa en trigger är en skrivning i den anslutna databasen, med omedelbar verkan på alla skrivningar i den tabellen — inklusive de som redan pågick. I ett system i produktion: titta på SQL:en först och tillämpa på överenskommen tid.

Ta bort en trigger

Menyn på triggern i trädet har Ta bort, med bekräftelse — Ta bort triggern ”…”? — och den är slutgiltig: triggern försvinner ur databasen.

Se vad som finns i databasen

SQL-konsolen, under modelldiagrammet, är stället för att bekräfta en triggers effekt: skriv en fråga, Kör, och se de riktiga raderna. Det är också härifrån man inspekterar det som redan låg där innan du kom.

SQL-konsolen, under modellen: man skriver till vänster, Kör kör, och resultatet dyker upp till höger.
SQL-konsolen, under modellen: man skriver till vänster, Kör kör, och resultatet dyker upp till höger.

Trigger, skript eller arbetsflöde?

Alla tre automatiserar, och rätt val besparar dig månader av förvirring:

Verktyg Körs… Bra för
Trigger Inne i databasen, vid varje skrivning i tabellen. Regler som måste gälla för alla skrivningar: historik, härledda fält, summor.
Skript Utanför databasen, för hand, schemalagt eller som steg i ett API. Tungt arbete, integrationer, filer, utskick — allt som tar tid eller talar med omvärlden.
Arbetsflöde Som en process med steg, beslut och mänskliga uppgifter. Godkännanden, kretslopp med människor emellan, väntan.

Dica

Om logiken handlar om data och inte får fallera är det en trigger. Om logiken handlar om affären och någon måste se den hända är det inte det: ett skript eller ett arbetsflöde lämnar spår, körs med historik och förklarar sig själva i Radar.

Varför inte…?

  • Varför dyker Ny trigger inte upp i datakällans meny? Den anslutna motorn stöder inte triggers ritade på canvasen. Du kan fortfarande skapa dem i SQL, och de dyker upp i trädet som externa triggers.
  • Varför säger triggern fortfarande att den är ett utkast? Den skapades men har ännu inte tillämpats. Öppna den och använd Spara och tillämpa i databasen.
  • Varför ser jag inte Gamla värden (OLD)? Triggern lyssnar varken på UPDATE eller DELETE. I ett INSERT finns ingen gammal rad.
  • Varför går det inte att koppla en port till en parameter? Alla kopplingar är inte meningsfulla — kontrollera att du kopplar en utgång (till höger på rutan) till en ingång (till vänster på den andra).
  • Varför gör triggern ingenting? Ett flöde utan funktioner genererar inget arbete alls: kompileringen vägrar det. Och kontrollera Tidpunkt — ett BEFORE och ett AFTER ser inte samma sak.
  • Varför blev skrivningarna långsamma efter att jag skapat triggern? Triggern körs på varje skriven rad. Om den anropar tungt arbete har det arbetet börjat hända vid varje infogning — i de fallen hör det hemma i ett schemalagt skript.