首页 > 数据库 > 数据库开发技术 > 事件触发器的几点变化
PostgreSQL 17事件触发器有如下几点变化:
新增event_triggers参数
新增login事件
DDL事件增加Reindex
新增事件触发器标记
本文将进行详细介绍。
用户如果想禁用事件触发器,之前的版本只能通过停库再进入单用户维护模式才起作用。
新版本可通过参数event_triggers,设置为false来临时禁用事件触发器,有超级用户以及set权限可设置该参数。
如下所示,超级用户给admin用户授予event_triggers参数的set权限后,使用\dconfig可以查看到该参数的权限设置。
postgres=# GRANT set ON PARAMETER event_triggers TO admin;
GRANT
postgres=# \x \dconfig+ event_triggers
Expanded display is on.
List of configuration parameters
-[ RECORD 1 ]-----+---------------------
Parameter | event_triggers
Value | on
Type | bool
Context | superuser
Access privileges | postgres=sA/postgres+
| admin=s/postgres
二、新增login事件
新增的login事件可在任何节点使用,用户建立连接时可做一些审计或干预操作。
演示如下:
先创建一个普通用户
CREATE USER bar with login password 'bar';
接着创建一个函数,用于事件触发器调用
CREATE OR REPLACE FUNCTION deny_session_bar()
RETURNS event_trigger security definer
AS
$$
declare
begin
if (session_user = 'bar')
then
raise exception 'user % is not allowed to login', 'bar';
end if;
end
$$ language plpgsql;
该函数检查连接会话的登录用户为bar时将抛出异常,不允许登录。
再把该函数绑定到新增的login事件上
CREATE EVENT TRIGGER login_event ON login
EXECUTE FUNCTION deny_session_bar();
最后测试bar用户登录
postgres=# \c postgres bar
connection to server on socket "/tmp/.s.PGSQL.1700" failed: FATAL: user bar is not allowed to login
CONTEXT: PL/pgSQL function deny_session_bar() line 6 at RAISE
Previous connection kept
可以看到login事件触发函数检测,函数里不允许bar用户登录。
新版本支持reindex操作前以及操作后产生DDL事件,下面进行演示:
先创建两个简单的事件触发器函数,用于后面Reindex事件触发器调用
CREATE OR REPLACE FUNCTION reindex_start_func()
RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE 'START REINDEX: % %', tg_event, tg_tag ;
END; $$ LANGUAGE plpgsql ;
CREATE OR REPLACE FUNCTION reindex_end_func()
RETURNS event_trigger AS $$
BEGIN
RAISE NOTICE 'END REINDEX: % %', tg_event, tg_tag ;
END; $$ LANGUAGE plpgsql ;
接着创建一个函数,用于事件触发器调用
将上面的两个函数分别绑定到Reindex操作的前后
CREATE EVENT TRIGGER trg_reindex_start ON ddl_command_start
WHEN TAG IN ('REINDEX')
EXECUTE PROCEDURE reindex_start_func();
CREATE EVENT TRIGGER trg_reindex_end ON ddl_command_end
WHEN TAG IN ('REINDEX')
EXECUTE PROCEDURE reindex_end_func();
最后测试Reindex操作,可以看到触发的提示信息
postgres=# reindex index t_a_idx;
NOTICE: START REINDEX: ddl_command_start REINDEX
NOTICE: END REINDEX: ddl_command_end REINDEX
REINDEX
最后是系统表pg_database增加了事件触发器的标记字段:
postgres=# SELECT dathasloginevt
FROM pg_database
WHERE datname=current_database();
dathasloginevt
----------------
t
(1 row)
对pg_database进行监控时可以关注这个新指标。
微信公众号:象楚之行
墨天轮:https://www.modb.pro/u/15675
微信:skypkmoon
勤耕细作,用心积微;静待花开,量变质成。
原文作者:象楚之行;如有侵权,请联系管理员删除。