Meine Anforderung besteht darin, einen Systembefehl wie (ls) oder C-Programm auszuführen, wenn ein Trigger ausgeführt wird. Gibt es eine Möglichkeit, eine Triggerfunktion zu erstellen, um dieses Problem zu lösen?
postgresql
rdbms
unix
mrg
quelle
quelle
Antworten:
Sie können leicht tun, was @a_horse_with_no_name in seinem Kommentar vorschlägt. Es gibt aber auch eine interessante Möglichkeit, PL / pgSQL als Funktionssprache zu verwenden.
Dies verwendet eine Funktion des
COPY
Befehls, der in PostgreSQL 9.3 eingeführt wurde. Es kann jetzt einen Befehl als Ziel / Quelle annehmen, genau dort, wo Sie im Normalfall einen Dateinamen oder STDIN / STDOUT verwenden würden:Natürlich benötigen Sie eine Tabelle, um die Ausgabe zu platzieren, aber Sie können sie ignorieren, wenn Sie möchten.
Sehen Sie sich ein kleines Beispiel an:
Hinweis: Die Funktion muss mit Superuser-Rechten ausgeführt werden, dh entweder
INSERT
als Superuser ausführen oder die Funktion mit definierenSECURITY DEFINER
. In jedem anderen Fall erhalten Sie eine Fehlermeldung:quelle
TO PROGRAM
Teil ein Zeichenfolgenliteral erforderlich ist. Wenn Sie also einen dynamischen Befehl wünschen, müssen Sie das Ganze einschließenEXECUTE
. Siehe stackoverflow.com/a/42626659/5419599 .Wenn Sie sich nur etwas Relatives ansehen müssen, können
$PGDATA
Sie pg_ls_data verwendenAnsonsten eine einfache Funktion wie diese:
Gibt Ihnen folgende Ausgabe:
quelle
SECURITY DEFINER
) ausgeführt werden kann.