×
Мы обрабатываем cookies, чтобы сделать наш сайт удобнее и персонализированнее для вас. Подробнее: политика использования «cookies» и «политики конфиденциальности».

Для самостоятельной настройки ознакомьтесь с инструкцией

Дополнительные настройки cookies в браузерах

Файлы cookie автоматически загружаются в ваш браузер при посещении веб-сайта. У вас есть возможность управлять этими файлами. Если Вы не согласны с использованием файлов cookies, запретите их сохранение на своём устройстве, удалите уже имеющиеся файлы cookies через настройки браузера или прекратите использование сайта.

При отключении обработки cookie наш сайт продолжит функционировать, однако будут использоваться исключительно необходимые технические файлы, без которых работа ресурса невозможна.

Инструкция по отключению cookies
Принять
Настроить
Отклонить

ДОКУМЕНТАЦИЯ

Выберите версию, форк и язык для СУБД Digital Q.DataBase, чтобы прочитать или скачать всю документацию.
Техподдержка
Документация
Диасофт
Авторские права © 2016–2025 ООО "Диасофт Экосистема"
Скачать всю документацию:

5.3.4. Полный пример событийного триггера

Ниже приведен простейший пример функции событийного триггера, написанной на языке 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, применяемые к самим событийным триггерам, не подпадают под действие событийных триггеров.)

Наверх
свяжитесь
с нами
контакты
Для прямой связи с нами вы можете использовать контакты ниже, либо оставить заявку через форму обратной связи, и мы обязательно свяжемся с вами

*поля обязательные к заполнению