Zum Inhalt springen

Datenbanktrigger

aus Wikipedia, der freien Enzyklopädie

Ein Datenbanktrigger, in der Informatik meist nur Trigger genannt ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}} für Auslöser), ist eine Funktion diverser Datenbankmanagementsysteme, insbesondere großer relationaler Datenbankmanagementsysteme.

Bei einer bestimmten Art der Änderungen (z. B. INSERT, UPDATE, DELETE bei SQL) von Daten in einer Tabelle wird ein gespeichertes Programm aufgerufen, das diese Änderung erlaubt, verhindert und/oder weitere Tätigkeiten vornimmt.

Eigenschaften

Trigger werden unter anderem zur Wahrung der Datenkonsistenz (Integritätsüberprüfungen) und zum Einfügen, Löschen oder Ändern von Referenzdaten eingesetzt. Der Trigger wird ausgeführt („gefeuert“), wahlweise bevor die Änderung an der referenzierten Tabelle vorgenommen wird oder danach. Einige relationale Datenbankmanagementsysteme (RDBMS) bieten auch einen „Instead-of-Insert“-Trigger an (englisch für „statt Einfügen“), der es erlaubt, anstelle der INSERT-Operation andere SQL-Anweisungen auszuführen.

Man muss festlegen, ob der Trigger pro verändertem Datensatz oder pro Anweisungsaufruf ausgelöst werden soll. Beispiel: Wenn eine Aktualisierungsanweisung (UPDATE) 100 Sätze verändert, dann wird im ersten Fall der Trigger 100 Mal aktiviert und im zweiten Fall nur einmal.

Da Trigger selber Datensätze einfügen, ändern und löschen können, kann ein Trigger durch seine Ausführung weitere Trigger auslösen. So kann eine ganze Kette von Verarbeitungen angestoßen werden.

Zur Erstellung von Triggern stellen die verschiedenen RDBMS eingebaute prozedurale Programmiersprachen wie PL/pgSQL von PostgreSQL, PL/SQL (von Oracle) oder SQL PL (von IBM DB2) zur Verfügung. Bei einigen RDBMS können innerhalb der Trigger-Verarbeitung auch Stored Procedures aufgerufen werden. Dadurch ist der Aufruf eines in einer anderen Programmiersprache (C, COBOL, Java) geschriebenen Programms möglich. Bei den hier genannten RDBMS sind Trigger sowohl auf Tabellen, als auch auf Sichten möglich.

Neben SQL-Standard-Triggern, die vor bzw. nach dem feuernden Ereignis ausgeführt werden, gibt es bei Oracle, IBM DB 2, Microsoft SQL Server und PostgreSQL<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:|{{{autor}}}: }}{{#if:|{{#if:PostgreSQL: Documentation: 10: CREATE TRIGGER|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=PostgreSQL: Documentation: 10: CREATE TRIGGER}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://www.postgresql.org/docs/current/static/sql-createtrigger.html%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=PostgreSQL: Documentation: 10: CREATE TRIGGER}}}}|[{{#invoke:URLutil|getNormalized|1=https://www.postgresql.org/docs/current/static/sql-createtrigger.html}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=PostgreSQL: Documentation: 10: CREATE TRIGGER}}}}]}}{{#if:| ({{{format}}}{{#if:{{#if: 2018-08-11 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}

          | )
          | {{#if:{{#ifeq:en|de||{{#if:en|1}}}}| ; 
              | )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://www.postgresql.org/docs/current/static/sql-createtrigger.html%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://www.postgresql.org/docs/current/static/sql-createtrigger.html}}%7C%7C}}}}{{#if:PostgreSQL: Documentation: 10: CREATE TRIGGER|{{#if:{{#invoke:WLink|isValidLinktext|1=PostgreSQL: Documentation: 10: CREATE TRIGGER|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: | {{{hrsg}}}{{#if: |,|{{#if: 2018-08-11 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: | {{#if:{{#invoke:DateTime|format|{{{datum}}}|noerror=1}}
            |{{#invoke:DateTime|format|{{{datum}}}|T._Monat JJJJ}}
            |{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum={{{datum}}}|class=Zitationswartung}} }}{{#if: |,|{{#if: 2018-08-11 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2018-08-11 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:35265||(?)}}}}}}{{#if: 2018-08-11|;}}}}{{#if: 2018-08-11| {{#if:{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2018-08-11 |ISO|noerror=1}} }}
       |4=im Jahr
       |7=im
       |10=am
       |#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2018-08-11|class=Zitationswartung}} }} {{#invoke:DateTime|format|2018-08-11|T._Monat JJJJ}}
    | {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:en|de||{{#if:en|1}}}}|{{#if:{{#if: 2018-08-11 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
       |  (
       | {{#if: | |  (}}
       }}{{#ifeq:{{#if:en|en|de}}|de||
          {{#invoke:Multilingual|format|en|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:en|en|de}}|de||, }}{{{kommentar}}}}})}}{{#if: {{#if: 2018-08-11 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}en|{{#if: |: {{
 #if: 
 | {{
     #ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | Vorlage:Str trim
     | {{#invoke:Vorlage:lang|flat}}
     }}
 | {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | „Vorlage:Str trim“
     | {{#invoke:Text|quote
         |1={{#if: 
              | {{#invoke:Vorlage:lang|flat}}
              | {{#invoke:Vorlage:lang|flat}} }}
         |2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
         |3=1}} }}

}}{{#if:

   |  (<templatestyles src="Person/styles.css" />{{#if:  | :  }}{{#if:  | , deutsch: „“ }})
   | {{#if: 
       |  ({{#if:  | , deutsch: „“ }})
       | {{#if:  |  (deutsch: „“) }}
 }}

}}{{#if: {{{zitat}}}

   | {{#if: 
       | {{#if: {{{zitat}}}
           | Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
   | Vorlage:": Text= fehlt }}{{#if:  | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
             | Vorlage:": Ungültiger Wert: ref=
             | {{{ref}}} }}

}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:

   |0|=Vorlage:Toter Link/Core{{#if: https://www.postgresql.org/docs/current/static/sql-createtrigger.html
       | {{#if:  | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 
           | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: https://www.postgresql.org/docs/current/static/sql-createtrigger.html
      | {{#if:{{#invoke:URLutil|isWebURL|https://www.postgresql.org/docs/current/static/sql-createtrigger.html}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.postgresql.org/docs/current/static/sql-createtrigger.html Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 
            | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: https://www.postgresql.org/docs/current/static/sql-createtrigger.html
       | {{#if:{{#invoke:URLutil|isWebURL|https://www.postgresql.org/docs/current/static/sql-createtrigger.html}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[https://www.postgresql.org/docs/current/static/sql-createtrigger.html }}|{{#switch: 
   |0|=Vorlage:Toter Link/Core{{#if: https://www.postgresql.org/docs/current/static/sql-createtrigger.html
       | {{#if:  | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 
           | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: https://www.postgresql.org/docs/current/static/sql-createtrigger.html
      | {{#if:{{#invoke:URLutil|isWebURL|https://www.postgresql.org/docs/current/static/sql-createtrigger.html}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.postgresql.org/docs/current/static/sql-createtrigger.html Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 
            | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: https://www.postgresql.org/docs/current/static/sql-createtrigger.html
       | {{#if:{{#invoke:URLutil|isWebURL|https://www.postgresql.org/docs/current/static/sql-createtrigger.html}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[https://www.postgresql.org/docs/current/static/sql-createtrigger.html }} }}}}}}}}}}{{#if:|
        {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}

}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref> – nicht beim SQL-Standard – noch die INSTEAD OF-Trigger, die anstelle des feuernden Ereignisses ausgeführt werden. INSTEAD OF-Trigger können auch auf einer View definiert werden.

{{#invoke:Vorlage:Siehe auch|f}}

Beispiele für Trigger

Trigger PL/SQL Syntax

<syntaxhighlight lang="psql">

  CREATE [OR REPLACE] TRIGGER <trigger_name>
   {BEFORE|AFTER|INSTEAD OF} {INSERT|DELETE|UPDATE [OF <feld_name>]}
    ON <table_name>
     [REFERENCING [NEW AS <new_row_name>] [OLD AS <old_row_name>]]
       [FOR EACH ROW [WHEN (<trigger_condition>)]]
       <trigger_body>

</syntaxhighlight>

PL/SQL Code Beispiel

<syntaxhighlight lang="psql">

CREATE TRIGGER mitarbeiter_trig_gehalt_biu
BEFORE INSERT OR UPDATE OF gehalt ON mitarbeiter
FOR EACH ROW
 -- Triggername mitarbeiter_trig_gehalt_biu
 -- (_biu steht für B-efore I-nsert U-pdate )
 -- Tabelle: MITARBEITER
 -- Trigger soll nur auslösen,
 -- wenn Gehalt kleiner oder gleich 5000 ist oder neues Gehalt kleiner altes Gehalt
 -- in der folgenden WHEN-Klausel erfolgt der Zugriff auf :old und :new OHNE das Zeichen :
WHEN (new.gehalt <= 5000 or new.gehalt < old.gehalt)
DECLARE
  v_mitarbeiter_name VARCHAR2(255):=null;
  -- Cursor holt "Name, Vorname" von Mitarbeitertabelle
  -- Explizite Definition des Cursors hat
  -- Performance-Vorteile gegen "select into <variable>" im Trigger-Body
  cursor c_name is select name||', '||vorname
                   from mitarbeiter
                   where mitarbeiternummer = :NEW.MITARBEITERNR;
BEGIN
  -- Mitarbeiter-Name ermitteln und in Variable v_mitarbeiter_name speichern
  open c_name;
  fetch c_name into v_mitarbeiter_name;
  close c_name;
  -- Bei Gehalt kleiner oder gleich 5000 Exception auslösen
     --> Fehler wird in der Regel bis zur Anwendung hochgereicht
  -- Exception-Nr -20000 - -29999 können selbst definiert werden
  IF :NEW.GEHALT <= 5000 THEN
    RAISE_APPLICATION_ERROR(
        -20901,
        'Managergehalt für Mitarbeiter '||v_mitarbeiter_name||' zu klein!'
    );
  END IF;
  IF :NEW.GEHALT < :OLD.GEHALT THEN
    RAISE_APPLICATION_ERROR(
        -20902,
        'Gehaltskürzung für Mitarbeiter '||v_mitarbeiter_name||' nicht erlaubt!'
    );
  END IF;
END;
/

</syntaxhighlight>

Literatur

  • H. Faeskorn-Woyke, B. Bertelsmeier, P. Riemer, E. Bauer: Datenbanksysteme, Theorie und Praxis mit SQL2003, Oracle und MySQL. Pearson-Studium, München/Boston 2007, ISBN 978-3-8273-7266-6.
  • Klaus R. Dittrich, Angelika M. Kotz, Jutta A. Mülle: An event/trigger mechanism to enforce complex consistency constraints in design databases. In: ACM SIGMOD. 15/3/1986, ACM Press, New York, S. 22–36, {{#invoke:URIutil|{{#ifeq:1|1|linkISSN|targetISSN}}|0163-5808|0}}{{#ifeq:1|0|[!]

}}{{#ifeq:0|1

        |{{#switch:00
                  |11= (print/online)
                  |10= (print)
                  |01= (online)
          }}

}}{{#ifeq:0|0

        |{{#ifeq:0|0
              |{{#if:{{#invoke:URIutil|isISSNvalid|1=0163-5808}}
                    |
                    |{{#invoke:TemplUtl|failure|ISSN ungültig}}}}}}

}}, doi:10.1145/15833.15836

Weblinks

[[wikt:{{#if:|{{{lang}}}:}}{{#if:|{{{1}}}|{{#invoke:WLink|getArticleBase}}}}|Wiktionary: {{#if:|{{{2}}}|{{#if:|{{{1}}}|{{#invoke:WLink|getArticleBase}}}}}}]]{{#switch: 1

|1|= – Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen |0|-= |X|x= |#default= –

}}{{#if:| {{#ifeq: {{{lang}}} | de | {{#ifeq: 0 | 0 | }} | ({{#invoke:Multilingual|format|{{{lang}}}|slang=!|shift=m}}) }}}}

{{#invoke:TemplatePar|check

  |opt= 1= 2= lang= suffix=
  |template=Vorlage:Wiktionary
  |cat=Wikipedia:Vorlagenfehler/Schwesterprojekt
  }}

Einzelnachweise

<references />