Ниже приведен простейший пример функции событийного триггера, написанной на языке C. (Примеры триггеров на процедурных языках можно найти в документации по соответствующим процедурным языкам.)
Функция noddl генерирует исключение при каждом вызове. В определении событийного триггера данная функция связывается с событием ddl_command_start событием. В результате выполнение всех команд DDL
(за исключением случаев, указанных
в Раздел 5.3.1) предотвращается.
Исходный код функции триггера:
#include "postgres.h"
#include "commands/event_trigger.h"
#include "fmgr.h"
PG_MODULE_MAGIC;
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",
GetCommandTagName(trigdata->tag))));
PG_RETURN_NULL();
}
После того как исходный код будет скомпилирован (см. Раздел 5.1.10.5), необходимо объявить функцию и событийные триггеры:
CREATE FUNCTION noddl() RETURNS event_trigger
AS 'noddl' LANGUAGE C;
CREATE EVENT TRIGGER noddl ON ddl_command_start
EXECUTE FUNCTION noddl();
Теперь можно проверить работу событийного триггера:
=# \dy
Список событийных триггеров
Имя | Событие | Владелец | Состояние | Функция | Теги
-------+-------------------+-------+---------+----------+------
noddl | ddl_command_start | dim | enabled | noddl |
(1 строка)
=# CREATE TABLE foo(id serial);
ERROR: команда "CREATE TABLE" запрещена
В данной ситуации для обеспечения возможности выполнения необходимых команд DDL следует либо удалить событийный триггер, либо отключить его. Отключение триггера может быть выполнено только на время транзакции, что является удобным решением:
BEGIN; ALTER EVENT TRIGGER noddl DISABLE; CREATE TABLE foo (id serial); ALTER EVENT TRIGGER noddl ENABLE; COMMIT;
(Следует помнить, что команды DDL, применяемые к самим событийным триггерам, не подпадают под действие событийных триггеров.)