38.4. ÐолнÑй пÑÐ¸Ð¼ÐµÑ ÑÑиггеÑа ÑобÑÑиÑ
ÐÐ¾Ñ Ð¾ÑÐµÐ½Ñ Ð¿ÑоÑÑой пÑÐ¸Ð¼ÐµÑ ÑÑнкÑии Ð´Ð»Ñ ÑÑиггеÑа ÑобÑÑиÑ, напиÑанной на C. (ÐÑимеÑÑ ÑÑиггеÑов Ð´Ð»Ñ Ð¿ÑоÑедÑÑнÑÑ ÑзÑков могÑÑ Ð±ÑÑÑ Ð½Ð°Ð¹Ð´ÐµÐ½Ñ Ð² докÑменÑаÑии на пÑоÑедÑÑнÑе ÑзÑки.)
ФÑнкÑÐ¸Ñ noddl вÑдаÑÑ Ð¾ÑÐ¸Ð±ÐºÑ Ð¿Ñи каждом вÑзове. ТÑÐ¸Ð³Ð³ÐµÑ Ñ ÑÑой ÑÑнкÑией опÑеделÑеÑÑÑ Ð´Ð»Ñ ÑобÑÑÐ¸Ñ ddl_command_start. ÐÑо пÑедоÑвÑаÑÐ°ÐµÑ ÑабоÑÑ Ð»ÑбÑÑ
DDL-команд (за иÑклÑÑением ÑеÑ
, о коÑоÑÑÑ
говоÑилоÑÑ Ð² Разделе 38.1).
ТепеÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñй код ÑÑиггеÑной ÑÑнкÑии:
#include "postgres.h"
#include "commands/event_trigger.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", trigdata->tag)));
PG_RETURN_NULL();
}
ÐоÑле компилÑÑии иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода (Ñм. ÐодÑаздел 36.10.5) обÑÑвлÑем ÑÑнкÑÐ¸Ñ Ð¸ ÑÑиггеÑÑ:
CREATE FUNCTION noddl() RETURNS event_trigger
AS 'noddl' LANGUAGE C;
CREATE EVENT TRIGGER noddl ON ddl_command_start
EXECUTE FUNCTION noddl();ТепеÑÑ Ð¿ÑовеÑим ÑабоÑÑ ÑÑиггеÑа:
=# \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);
ÐШÐÐÐÐ: command "CREATE TABLE" denied
Ð ÑÑой ÑиÑÑаÑии, Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка DDL-команд, нÑжно либо ÑдалиÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ ÑобÑÑиÑ, либо оÑклÑÑиÑÑ ÐµÐ³Ð¾. ÐÐ¾Ð¶ÐµÑ Ð±ÑÑÑ ÑдобнÑм оÑклÑÑиÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ð° вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑÑанзакÑии:
BEGIN; ALTER EVENT TRIGGER noddl DISABLE; CREATE TABLE foo (id serial); ALTER EVENT TRIGGER noddl ENABLE; COMMIT;
(ÐÑпомним, ÑÑо ÑÑиггеÑÑ ÑобÑÑий не обÑабаÑÑваÑÑ DDL-ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð´Ð»Ñ ÑÐ°Ð¼Ð¸Ñ ÑÑиггеÑов ÑобÑÑий.)