当预定的事件发生时,事件触发器就会被触发。由于事件触发器设计的权限比较大,所以只有超级用户才能创建和修改触发器。

1. 事件触发器支持的事件分三类:ddl_command_startddl_command_end 和 sql_drop。

(1)ddl_command_start:在DDL开始前触发;

(2)ddl_command_end:在DDl结束后触发;

(3)sql_drop:删除一个数据库对象前被触发,其中删除的数据库对象详细信息,可以通过pg_event_trigger_dropped_objects()函数记录下来。

pg_event_trigger_dropped_objects()函数返回的结果集
列名称 列类型 列描述
classid Oid 对象所在目录的Oid
objjd Oid 数据库对象的Oid
objsubid int32 数据库对象的子对象 (如:列)
object_type text 数据库对象的类型
schema_name text 数据库对象的模式名
object_name text 数据库对象的名称
object_identify text 数据库对象的标识符

2. 各种DDL操作会触发的事件列表:

命令标记 ddl_command_start ddl_command_end sql_drop
ALTER AGGREGATE X X -
ALTER COLLATION X X -
ALTER CONVERSION X X -
ALTER DOMAIN X X -
ALTER EXTENSION X X -
ALTER FOREIGN DATA WRAPPER X X -
ALTER FOREIGN TABLE X X X
ALTER FUNCTION X X -
ALTER LANGUAGE X X -
ALTER OPERATOR X X -
ALTER OPERATOR CLASS X X -
ALTER OPERATOR FAMILY X X -
ALTER SCHEMA X X -
ALTER SEQUENCE X X -
ALTER SERVER X X -
ALTER TABLE X X X
ALTER TEXT SEARCH CONFIGURATION X X -
ALTER TEXT SEARCH DICTIONARY X X -
ALTER TEXT SEARCH PARSER X X -
ALTER TEXT SEARCH TEMPLATE X X -
ALTER TRIGGER X X -
ALTER TYPE X X -
ALTER USER MAPPING X X -
ALTER VIEW X X -
CREATE AGGREGATE X X -
CREATE CAST X X -
CREATE COLLATION X X -
CREATE CONVERSION X X -
CREATE DOMAIN X X -
CREATE EXTENSION X X -
CREATE FOREIGN DATA WRAPPER X X -
CREATE FOREIGN TABLE X X -
CREATE FUNCTION X X -
CREATE INDEX X X -
CREATE LANGUAGE X X -
CREATE OPERATOR X X -
CREATE OPERATOR CLASS X X -
CREATE OPERATOR FAMILY X X -
CREATE RULE X X -
CREATE SCHEMA X X -
CREATE SEQUENCE X X -
CREATE SERVER X X -
CREATE TABLE X X -
CREATE TABLE AS X X -
CREATE TEXT SEARCH CONFIGURATION X X -
CREATE TEXT SEARCH DICTIONARY X X -
CREATE TEXT SEARCH PARSER X X -
CREATE TEXT SEARCH TEMPLATE X X -
CREATE TRIGGER X X -
CREATE TYPE X X -
CREATE USER MAPPING X X -
CREATE VIEW X X -
DROP AGGREGATE X X X
DROP CAST X X X
DROP COLLATION X X X
DROP CONVERSION X X X
DROP DOMAIN X X X
DROP EXTENSION X X X
DROP FOREIGN DATA WRAPPER X X X
DROP FOREIGN TABLE X X X
DROP FUNCTION X X X
DROP INDEX X X X
DROP LANGUAGE X X X
DROP OPERATOR X X X
DROP OPERATOR CLASS X X X
DROP OPERATOR FAMILY X X X
DROP OWNED X X X
DROP RULE X X X
DROP SCHEMA X X X
DROP SEQUENCE X X X
DROP SERVER X X X
DROP TABLE X X X
DROP TEXT SEARCH CONFIGURATION X X X
DROP TEXT SEARCH DICTIONARY X X X
DROP TEXT SEARCH PARSER X X X
DROP TEXT SEARCH TEMPLATE X X X
DROP TRIGGER X X X
DROP TYPE X X X
DROP USER MAPPING X X X
DROP VIEW X X X
SELECT INTO X X -

3.  创建事件触发器的语法

CREATE EVENT TRIGGER name

ON EVENT

[ WHEN filter_variable IN ( filter_value [ , ... ]) [ AND ... ] ]

EXECUTE PROCEDURE function_name ()

4. 事件触发器示例

(1)禁止所有DDL操作

--创建触发器函数
create or replace function abort_any_command()
returns event_trigger
language plpgsql
as $$
begin
raise exception 'command % is disabled ',tg_tag;
end;
$$;

--创建触发器
create event trigger abort_ddl on ddl_command_start
execute procedure abort_any_command();

--测试触发器
test=# drop table emp;
ERROR:  command DROP TABLE is disabled
CONTEXT:  PL/pgSQL function abort_any_command() line 3 at RAISE
test=# create table emp01 (x int);
ERROR:  command CREATE TABLE is disabled
CONTEXT:  PL/pgSQL function abort_any_command() line 3 at RAISEtest=# truncate table emp;  --注意:truncate是在普通触发器中触发,在事件触发器中不会触发。
TRUNCATE TABLE--恢复DDL正常操作

test=# alter event trigger abort_ddl disable;
ALTER EVENT TRIGGER

(2)审计记录所有drop操作

--创建审计记录表
create table log_drop_objects(
op_time         timestamp, --操作执行时间
ddl_tag         text,  --执行的ddl操作
classid         Oid,
objid           Oid,
objsubid        OID,
object_type     text,
schema_name     text,
object_name     text,
object_identify text
);--创建触发器函数
create function event_trigger_log_drops()
returns event_trigger language plpgsql as $$
declare
obj record;
begin
insert into log_drop_objects select now(),tg_tag,classid,objid,objsubid,
object_type,schema_name,object_name,
object_identity from pg_event_trigger_dropped_objects();
end
$$;--创建触发器
create event trigger event_trigger_log_drops
on sql_drop
execute procedure event_trigger_log_drops();--测试触发器
test=# alter table emp drop column salary;
ALTER TABLE
test=#
test=# select ddl_tag,object_type,object_name,object_identity from log_drop_objects;ddl_tag   | object_type  | object_name |  object_identity
-------------+--------------+-------------+-------------------ALTER TABLE | table column |             | public.emp.salary
(1 row)test=#
test=# drop table emp;
DROP TABLE
test=#
test=# select ddl_tag,object_type,object_name,object_identity from log_drop_objects;ddl_tag   | object_type  |     object_name      |        object_identity
-------------+--------------+----------------------+-------------------------------ALTER TABLE | table column |                      | public.emp.salaryDROP TABLE  | table        | emp                  | public.empDROP TABLE  | type         | emp                  | public.empDROP TABLE  | type         | _emp                 | public.emp[]DROP TABLE  | toast table  | pg_toast_16461       | pg_toast.pg_toast_16461DROP TABLE  | index        | pg_toast_16461_index | pg_toast.pg_toast_16461_indexDROP TABLE  | type         | pg_toast_16461       | pg_toast.pg_toast_16461DROP TABLE  | trigger      |                      | emp_audit on public.emp
(8 rows)

5. 修改事件触发器

ALTER EVENT TRIGGER name DISABLE
ALTER EVENT TRIGGER name ENABLE [ REPLICA | ALWAYS ]
ALTER EVENT TRIGGER name OWNER TO new_owner
ALTER EVENT TRIGGER name RENAME TO new_name

The End!

2017-08-20

【PostgreSQL-9.6.3】事件触发器相关推荐

  1. js事件触发器fireEvent和dispatchEvent

    转自:https://www.cnblogs.com/tiger95/p/6962059.html 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome, ...

  2. 二十五、Node中的Buffer缓冲器和EventEmitter事件触发器

    @Author:Runsen @Date:2020/6/5 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  3. Oracle入门(十四.22)之创建DDL和数据库事件触发器

    一.什么是DDL和数据库事件触发器? DDL语句触发DDL触发器:CREATE,ALTER或DROP. 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接. • ...

  4. Oracle触发器4-数据库事件触发器

    创建数据库事件触发器语法 1 CREATE [OR REPLACE] TRIGGER trigger_name 2 {BEFORE | AFTER} {database_event} ON {DATA ...

  5. javascript事件触发器

    概述 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等)有dispatchEvent方法. 一般我们在元素上绑定事件后,是靠用户在这 ...

  6. EventTrigger 事件触发器

    1.EventTrigger 事件触发器是什么 一个EventTrigger组件,是一个集成了所有UI事件监听接口的脚本,可以让我们更方便地为控件添加事件监听 2.如何使用事件触发器 在对象的Inpe ...

  7. 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器

    本文属于[Azure 架构师学习笔记]系列. 本文属于[Azure Data Factory]系列. 接上文[Azure 架构师学习笔记]-Azure Data Factory (3)-触发器详解-翻 ...

  8. WPF系列教程(二十九):触发器Triggers、MultiTrggers、EventTrigger——属性触发器、多触发器、事件触发器

    使用触发器可以自动完成简单的样式改变. 项目源码 触发器 在Style定义时使用Style.Triggers属性来实现: <!--设置触发器--> <Style.Triggers&g ...

  9. ifttt_如何使用智能手机和IFTTT创建地理事件触发器

    ifttt Wouldn't it be great if the mere movement of your smartphone from one location to another coul ...

最新文章

  1. NLPML_总结_20210208
  2. 自定义View 实现软键盘实现搜索
  3. Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树
  4. html5移动web开发黑马掌上商城_这套web前端与移动开发教程,帮助了众多小白转行就业...
  5. coreldraw x4怎么会蓝屏_CorelDRAW广告条幅批量制作插件
  6. oracle all_policies,Oracle数据库权限管理学习笔记
  7. 笨办法学 Python · 续 练习 35:解释器
  8. 拖拽之路(原生之初一):自定义QListWidget实现美观的拖拽样式
  9. 微软警告:Office 已遭IE RCE 新0day 攻击
  10. Attempt to invoke virtual method 'void android.widget.CompoundButton.setChecked(boolean)' on a null
  11. (最新)Win7安装配置IIS7.5详细图文教程 (一)
  12. vs2019使用方法
  13. php显示服务器ipv6,php获取用户IPv4或IPv6地址的代码
  14. 优启通如何写入linux启动盘,U盘启动盘制作工具|优启通图文详细使用教程,优启通使用教程_东坡下载手机版...
  15. mac 文档 只读修改
  16. 风险加权资产(RWA)分析管理系统
  17. Excel如何从混合数据中提取出手机号码
  18. 学习编程该如何记笔记(摘自简书、博客)
  19. 通过电脑远程链接termux
  20. YTU OJ Problem 2013

热门文章

  1. factorybean 代理类不能按照类型注入_彻底搞懂依赖注入(一)Bean实例创建过程
  2. 在Android平台上发现新的恶意程序伪装成杀毒软件挟持设备
  3. Eclipse用法和技巧十七:覆盖父类方法
  4. 设计模式原则之六:依赖倒置原则
  5. 联想童夫尧:细分市场将是PC未来新增长点
  6. SpringBoot加载静态资源
  7. CLOSE_WAIT状态的原因与解决方法(2)
  8. 怎么理解Condition
  9. OSChina 周二乱弹 —— 做人呐,最重要的就是开森
  10. Lombok的注解简单介绍