系统触发器(System Trigger)是PolarDB PostgreSQL版(兼容Oracle)提供的一种用于监听数据库事件的触发器,能够在发生系统事件时被触发,便于实现复杂的审计逻辑、规则校验或自动化运维操作。本文为您介绍系统触发器的语法、属性函数及其行为特点。
版本限制
仅支持Oracle语法兼容 2.0且内核小版本为2.0.14.15.31.0及以上。
基本语法
系统触发器的定义语法如下:
CREATE [OR REPLACE] TRIGGER [schema_name.]trigger_name
{ BEFORE | AFTER | INSTEAD OF }
{ CREATE | ALTER | DROP }
ON { [schema_name.]SCHEMA | DATABASE }
DECLARE
-- 可选的变量声明
BEGIN
-- 触发器逻辑
END;
语法 | 说明 |
| 自定义系统触发器名称。PolarDB的系统触发器是数据库级别的对象,不属于任何一个 Schema,此处的
|
{ BEFORE | AFTER | INSTEAD OF } | 定义系统触发器触发时机。支持3种类型:
|
{ CREATE | ALTER | DROP } | 触发事件类型。
|
ON { [schema_name.]SCHEMA | DATABASE } | 触发范围。
|
使用示例如下,该触发器在数据库中任意对象被创建或删除时打印日志。
CREATE OR REPLACE TRIGGER audit_ddl_trigger
AFTER CREATE OR DROP
ON DATABASE
BEGIN
DBMS_OUTPUT.PUT_LINE('DDL Trigger fired: ' || ORA_SYSEVENT || ' on ' || ORA_DICT_OBJ_NAME || ' of type ' || ORA_DICT_OBJ_TYPE);
END;
事件属性函数
PolarDB PostgreSQL版(兼容Oracle)的系统触发器提供了一系列事件属性函数(Event Attribute Functions),用于获取当前触发事件的上下文信息,通常用于审计和日志记录。
ora_sysevent
:DDL语句的类型,包括CREATE、ALTER和DROP。ora_dict_obj_type
:DDL语句操作的对象类型,包括TABLE、VIEW、INDEX等对象。ora_dict_obj_name
:DDL语句操作的对象名称。ora_dict_obj_owner
:DDL语句操作的对象的所有者,目前仅支持获取TABLE、VIEW、INDEX等对象类型的所有者。
使用示例如下,创建一个系统触发器,用于在DDL语句执行前打印日志。
CREATE OR REPLACE EDITIONABLE TRIGGER trigger_before_ddl before ddl on schema
BEGIN
dbms_output.put_line('before ddl ora_sysevent: ' || ora_sysevent);
dbms_output.put_line('before ddl ora_dict_obj_owner: ' || ora_dict_obj_OWNER);
dbms_output.put_line('before ddl ora_dict_obj_type: ' || ora_dict_obj_type);
dbms_output.put_line('before ddl ora_dict_obj_name: ' || ora_dict_obj_name);
END;
执行CREATE TABLE test_table (id int);
语句,触发器输出结果如下:
before ddl ora_sysevent: CREATE
before ddl ora_dict_obj_owner: test_user
before ddl ora_dict_obj_type: TABLE
before ddl ora_dict_obj_name: test_table
触发器管理
修改触发器定义
执行
CREATE OR REPLACE TRIGGER <trigger_name> ...
语句即可替换掉此前的同名触发器的定义,实现触发器定义修改。启用/禁用触发器
使用
CREATE TRIGGER
语句创建的触发器默认启用。禁用触发器:
ALTER TRIGGER <trigger_name> DISABLE;
。启用触发器:
ALTER TRIGGER <trigger_name> ENABLE;
。
删除触发器
执行
DROP EVENT TRIGGER <trigger_name>;
语句即可删除触发器。