ITPub博客

首页 > 数据库 > 数据库开发技术 > 事件触发器的几点变化

事件触发器的几点变化

原创 数据库开发技术 作者:象楚之行 时间:2024-06-19 08:00:00 0 删除 编辑

PostgreSQL 17事件触发器有如下几点变化:

  • 新增event_triggers参数

  • 新增login事件

  • DDL事件增加Reindex

  • 新增事件触发器标记

本文将进行详细介绍。

一、新增event_triggers参数

用户如果想禁用事件触发器,之前的版本只能通过停库再进入单用户维护模式才起作用。

新版本可通过参数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用户登录。

三、DDL事件增加Reindex

新版本支持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

勤耕细作,用心积微;静待花开,量变质成。

原文作者:象楚之行;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-06-12

  • 博文量
    102
  • 访问量
    50360