Voici un exemple très simple d'une fonction trigger sur événement écrite en C. (Les exemples de triggers écrits en langage procédural peuvent être trouvés dans la documentation de ces langages procédurals.)
La fonction noddl
lève une exception à chaque fois
qu'elle est appelée. La définition du trigger événement associe la fonction
à l'événement ddl_command_start
. L'effet est qu'aucune
commande DDL (à l'exception de celles mentionnées dans Section 40.1) ne peut être exécutée.
Voici le code source de la fonction trigger :
#include "postgres.h" #include "commands/event_trigger.h" PG_MODULE_MAGIC; Datum noddl(PG_FUNCTION_ARGS); PG_FUNCTION_INFO_V1(noddl); Datum noddl(PG_FUNCTION_ARGS) { EventTriggerData *trigdata; if (!CALLED_AS_EVENT_TRIGGER(fcinfo)) /* internal error */ elog(ERROR, "not fired by event trigger manager"); trigdata = (EventTriggerData *) fcinfo->context; ereport(ERROR, (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), errmsg("command \"%s\" denied", trigdata->tag))); PG_RETURN_NULL(); }
Après avoir compilé le code source (voir Section 38.10.5), déclarez la fonction et les triggers :
CREATE FUNCTION noddl() RETURNS event_trigger AS 'noddl' LANGUAGE C; CREATE EVENT TRIGGER noddl ON ddl_command_start EXECUTE FUNCTION noddl();
Maintenant vous pouvez tester le bon fonctionnement du trigger :
=# \dy List of event triggers Name | Event | Owner | Enabled | Function | Tags -------+-------------------+-------+---------+----------+------ noddl | ddl_command_start | dim | enabled | noddl | (1 row) =# CREATE TABLE foo(id serial); ERROR: command "CREATE TABLE" denied
Dans ce cas, pour pouvoir activier l'exécution de certaines commandes DDL, vous pouvez soit supprimer le trigger sur événement soit le désactiver. Il est généralement plus simple de désactiver le trigger pendant la durée de la transaction :
BEGIN; ALTER EVENT TRIGGER noddl DISABLE; CREATE TABLE foo (id serial); ALTER EVENT TRIGGER noddl ENABLE; COMMIT;
(Pour rappel, les commandes DDL sur les triggers sur événement ne sont pas affectées par les triggers sur événement.)