【PostgreSQL-9.6.3】事件触发器
当预定的事件发生时,事件触发器就会被触发。由于事件触发器设计的权限比较大,所以只有超级用户才能创建和修改触发器。
1. 事件触发器支持的事件分三类:ddl_command_start, ddl_command_end 和 sql_drop。
(1)ddl_command_start:在DDL开始前触发;
(2)ddl_command_end:在DDl结束后触发;
(3)sql_drop:删除一个数据库对象前被触发,其中删除的数据库对象详细信息,可以通过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】事件触发器相关推荐
- js事件触发器fireEvent和dispatchEvent
转自:https://www.cnblogs.com/tiger95/p/6962059.html 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome, ...
- 二十五、Node中的Buffer缓冲器和EventEmitter事件触发器
@Author:Runsen @Date:2020/6/5 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- Oracle入门(十四.22)之创建DDL和数据库事件触发器
一.什么是DDL和数据库事件触发器? DDL语句触发DDL触发器:CREATE,ALTER或DROP. 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接. • ...
- Oracle触发器4-数据库事件触发器
创建数据库事件触发器语法 1 CREATE [OR REPLACE] TRIGGER trigger_name 2 {BEFORE | AFTER} {database_event} ON {DATA ...
- javascript事件触发器
概述 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等)有dispatchEvent方法. 一般我们在元素上绑定事件后,是靠用户在这 ...
- EventTrigger 事件触发器
1.EventTrigger 事件触发器是什么 一个EventTrigger组件,是一个集成了所有UI事件监听接口的脚本,可以让我们更方便地为控件添加事件监听 2.如何使用事件触发器 在对象的Inpe ...
- 【Azure 架构师学习笔记】-Azure Data Factory (4)-触发器详解-事件触发器
本文属于[Azure 架构师学习笔记]系列. 本文属于[Azure Data Factory]系列. 接上文[Azure 架构师学习笔记]-Azure Data Factory (3)-触发器详解-翻 ...
- WPF系列教程(二十九):触发器Triggers、MultiTrggers、EventTrigger——属性触发器、多触发器、事件触发器
使用触发器可以自动完成简单的样式改变. 项目源码 触发器 在Style定义时使用Style.Triggers属性来实现: <!--设置触发器--> <Style.Triggers&g ...
- ifttt_如何使用智能手机和IFTTT创建地理事件触发器
ifttt Wouldn't it be great if the mere movement of your smartphone from one location to another coul ...
最新文章
- NLPML_总结_20210208
- 自定义View 实现软键盘实现搜索
- Codeforces Round #715 (Div. 1) C. Complete the MST 补图 + 思维 + 最小生成树
- html5移动web开发黑马掌上商城_这套web前端与移动开发教程,帮助了众多小白转行就业...
- coreldraw x4怎么会蓝屏_CorelDRAW广告条幅批量制作插件
- oracle all_policies,Oracle数据库权限管理学习笔记
- 笨办法学 Python · 续 练习 35:解释器
- 拖拽之路(原生之初一):自定义QListWidget实现美观的拖拽样式
- 微软警告:Office 已遭IE RCE 新0day 攻击
- Attempt to invoke virtual method 'void android.widget.CompoundButton.setChecked(boolean)' on a null
- (最新)Win7安装配置IIS7.5详细图文教程 (一)
- vs2019使用方法
- php显示服务器ipv6,php获取用户IPv4或IPv6地址的代码
- 优启通如何写入linux启动盘,U盘启动盘制作工具|优启通图文详细使用教程,优启通使用教程_东坡下载手机版...
- mac 文档 只读修改
- 风险加权资产(RWA)分析管理系统
- Excel如何从混合数据中提取出手机号码
- 学习编程该如何记笔记(摘自简书、博客)
- 通过电脑远程链接termux
- YTU OJ Problem 2013