在 PostgreSQL(简称 PG)中,Event Trigger 是一种特殊的触发器(Trigger),用于在某些数据库事件发生时自动执行指定的函数或操作。与传统的行级或语句级触发器不同,Event Trigger 并不作用于具体的表或行,而是针对数据库级别的操作事件,比如 CREATE TABLE
、ALTER TABLE
、DROP TABLE
等 DDL(数据定义语言)事件。
主要特点
- 触发时机:Event Trigger 监听数据库级别的 DDL 事件,而不是数据操作事件(如
INSERT
、UPDATE
、DELETE
)。例如,当执行CREATE TABLE
时,可以触发与此事件相关的 Event Trigger。 - 触发时刻:Event Trigger 可以在事件开始前、执行后、或事件失败时触发。
BEFORE
:事件执行前触发。AFTER
:事件执行成功后触发。INSTEAD OF
:替代原事件触发。
使用场景
- 安全性控制:可以拦截和检查某些 DDL 操作,并对不符合安全策略的操作进行阻止或记录。
- 审计:记录数据库中的结构性变更,比如新增表、修改表结构等操作。
- 自动化操作:自动执行某些自定义逻辑,比如在创建表时自动为其添加索引或设置权限。
示例
创建一个 Event Trigger,在每次执行 CREATE TABLE
时记录日志:
CREATE FUNCTION log_create_table() RETURNS event_trigger AS $$ BEGIN RAISE NOTICE 'A new table has been created: %', tg_tag; END; $$ LANGUAGE plpgsql; CREATE EVENT TRIGGER create_table_logger ON ddl_command_end WHEN TAG IN ('CREATE TABLE') EXECUTE FUNCTION log_create_table();
在这个例子中,log_create_table()
是一个函数,它在执行 CREATE TABLE
时输出一条日志。create_table_logger
是一个事件触发器,它被设置为在 CREATE TABLE
操作成功结束后(ddl_command_end
)执行。
常见的 DDL 事件
CREATE
ALTER
DROP
RENAME
TRUNCATE
注意事项
- Event Trigger 只能用于 DDL 事件,不能用于 DML(数据操作语言)事件,如
INSERT
、UPDATE
、DELETE
。 - 需要注意触发的频率和逻辑,过多的事件触发可能影响数据库性能。
Event Trigger 是 PostgreSQL 中一个强大的功能,特别适合用于监控和管理数据库的结构性变更。