1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Skript mit Trigger aufrufen

Dieses Thema im Forum "PostgreSQL" wurde erstellt von christofj, 10 März 2019.

  1. christofj

    christofj Fleissiger Benutzer

    Hallo zusammen,

    ich versuche mit einem Trigger ein Pythonsktipt aufzurufen. An das Pythonskript soll noch die ID aus der Tabelle als Argument übergeben werden. Bis jetzt habe ich diese Funktion erstellt:

    Code:
    =# CREATE OR REPLACE FUNCTION executeDataCheck()
       RETURNS TRIGGER
       AS $executeDataCheck$
       #!/bin/sh
       python3 /home/user/pythonskript.py sID
       $$
       LANGUAGE plsh;
    
    Dazu habe ich diesen Trigger erstellt:
    Code:
    =# CREATE TRIGGER executeDataCheck
       AFTER INSERT OR UPDATE ON
       module_related_references FOR
       EACH ROW EXECUTE PROCEDURE
       executedatacheck(s_id);
    Leider funktioniert das so nicht. Wie kann ich aus einer Tabelle die ID an das Pythonskript übergeben?
    In der Doku habe ich was von TG_ARGV[] gelesen. Mir ist aber nicht klar wie ich damit auf ein einzelnes Spaltenelement zugreifen soll.
    Danke vorab
     
  2. akretschmer

    akretschmer Datenbank-Guru

    einige Fragen/Dinge/Ideen:

    * plsh ist installiert und funktioniert?
    * das kann nur als DB-Superuser gehen, weil plsh untrusted ist
    * auf Elemente des alten/neuen Datensatzen kannst Du via OLD.* und NEW.* zugreifen, den * mit den Spaltennamen ersetzen
    * es ist nicht unbedingt eine gute Idee, externe Programme aufzurufen, nicht nur wegen der Sicherheit. Was exakt willst Du mit der Triggerfunktion denn machen? Wenn es nur ein Check der Daten sind, dann solltest Du eher plphyton nutzen, ohne dem 'u' hinten.
     
  3. christofj

    christofj Fleissiger Benutzer

    Es ist so, dass in einer weiteren (ersten) Tabelle immer wieder neue Daten eingetragen werden. In der Tabelle mit der sID wird "mitgezählt" das in der ersten Tabelle Daten eingetragen wurden. Das Skript ruft dann die Daten aus der ersten Tabelle ab und führt ein paar prüfende Berechnungen dieser neuen Werte aus. Je nach dem Was diese Prüfung ergibt wird eine Mail aus den Skript generiert. Die sID ist sozusagen ein Fremdschlüssel auf die erste Tabelle.
     
  4. christofj

    christofj Fleissiger Benutzer

    Ok das will ich schonmal nicht.
     
  5. christofj

    christofj Fleissiger Benutzer

    Wenn ich mir die Doku ansehe (das ist jetzt mit dem u hinten, eine andere habe ich auf die schnelle nicht gefunden):
    PostgreSQL: Documentation: 11: 46.2. PL/Python Functions

    verstehe ich trotzdem noch nicht so recht wie die Daten aus der Tabelle zu dem Skript kommen sollen.
    Wie ich da bis jetzt verstanden habe kann ich an den Trigger kein Parameter/Variablen übergeben richtig?
    Rufe ich dann in meinem Fall, in dem Skript, NEW.sID auf wenn durch die Erhöhung des Zählers der Trigger ausgelöst wird?
    Ich würde ungern alles ich die Funktion von postgers reinpacken. Das Skript ruft nämlich noch Funktionen auf anderen Skripten auf.
     
  6. christofj

    christofj Fleissiger Benutzer

    Hallo nochmal,

    ich will hier nur kurz mein Lösung mitteilen, da mir in diesem Forum schon viel geholfen wurde und vielleicht hat jemand eine ähnliche Aufgabenstellung.
    Ich weiß das ist noch nicht so effektiv aber für meine Sache reicht es erstmal.

    Code:
    CREATE OR REPLACE FUNCTION calldatacheck()
    RETURNS trigger LANGUAGE plpython3u AS
    $$import os
    os.system("/usr/bin/python3 /home/user/datacheck.py '" + str(TD["new"]["sensor_id"]) + "'") $$;
    
    
    CREATE TRIGGER executePython
    AFTER INSERT OR UPDATE ON module_related_references
    FOR EACH ROW EXECUTE PROCEDURE calldatacheck();
     
    Walter und akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden