【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 RAISE
test=# 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.salary
DROP TABLE | table | emp | public.emp
DROP TABLE | type | emp | public.emp
DROP TABLE | type | _emp | public.emp[]
DROP TABLE | toast table | pg_toast_16461 | pg_toast.pg_toast_16461
DROP TABLE | index | pg_toast_16461_index | pg_toast.pg_toast_16461_index
DROP TABLE | type | pg_toast_16461 | pg_toast.pg_toast_16461
DROP 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】事件触发器的更多相关文章
- MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器
———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...
- js事件触发器 dispatchEvent()
[其实就是自动触发事件,而非手动(交互)触发事件] dispatchEvent是作为高级浏览器(如chrome.Firfox等)的事件触发器来使用的,那么什么是事件触发器?就是触发事件的东西.可能有人 ...
- 事件触发器-----dispatchEvent
不要被标题蒙蔽了,今天的重点不是论述事件触发器,而是说一下dispatchEvent这个东西.好了,先简单做个铺垫,dispatchEvent是作为高级浏览器(如chrome.Firfox等)的事件触 ...
- js事件触发器fireEvent和dispatchEvent
转自:https://www.cnblogs.com/tiger95/p/6962059.html 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome, ...
- WPF 精修篇 事件触发器
原文:WPF 精修篇 事件触发器 事件触发器 一般使用的就是动画 <Grid> <TextBlock Text="事件触发器" Opacity="0.2 ...
- javascript事件触发器fireEvent和dispatchEvent
javascript事件触发器fireEvent和dispatchEvent 事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等) ...
- plsql 数据库事件触发器
--4.数据库事件触发器 需要超管的权限 /* 数据库事件触发器有数据库级和模式级两种. 前者定义在整个数据库上,触发事件是数据库事件,如数据库的启动.关闭,对数据库的登录或退出. 后者定义在模式上, ...
- Node.js精进(4)——事件触发器
Events 是 Node.js 中最重要的核心模块之一,很多模块都是依赖其创建的,例如上一节分析的流,文件.网络等模块. 比较知名的 Express.KOA 等框架在其内部也使用了 Events 模 ...
- JAVA GUI学习 - 窗口【x】按钮关闭事件触发器:重写processWindowEvent(WindowEvent e)方法
public class WindowListenerKnow extends JFrame { public WindowListenerKnow() { this.setBounds(300, 1 ...
随机推荐
- Sliding Window(滑动窗口)
Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 58002 Accepted: 16616 Case Time Limi ...
- Win32编程API 基础篇 -- 6.菜单和图标
菜单和按钮 例子:菜单1 本小节仅仅向你展示如果向你的窗口中加入一个基本的菜单,通常你会用到一个提前制作好的菜单资源,这会是一份.rc文件并且会被编译链接进你的.exe可执行程序中.这是具体的流程做法 ...
- Codeforces Round #245 (Div. 1)——Guess the Tree
题目链接 题意: n个节点,给定每一个节点的子树(包含自己)的节点个数.每一个节点假设有子节点必定大于等于2.求这种数是否存在 n (1 ≤ n ≤ 24). 分析: 用类似DP的思路,从已知開始.这 ...
- STM8S PWM 应用 呼吸灯
//主功能接受:使用MCU STM8S105C6 的PWM通道2 PC2 来做呼吸灯 已经验证OK,呵 //呵,这个PWM设置刚開始用还是有点麻烦,由于是自己摸索.花点时间.还是解决了 . //所用子 ...
- Cocos Code IDE + Lua初次使用FastTiledMap的坑
近期想玩玩Lua.又想玩玩Cocos Code IDE.更加想写一个即时战斗的.防守的.会动的.有迷雾的.要探索的(旁白:给我停!)跑地图游戏. 于是我就用Cocos Code IDE来写游戏了.挑战 ...
- npm/bower/brew
npm: npm(node package manager)node包管理器,用来下载发布第三方工具包,例如:代码的压缩.合并.编译的插件包.主要功能:安装.卸载.更新.查看.搜索.发布等 npm的具 ...
- POJ 2007 Scrambled Polygon(简单极角排序)
水题,根本不用凸包,就是一简单的极角排序. 叉乘<0,逆时针. #include <iostream> #include <cstdio> #include <cs ...
- 异步POST请求解析JSON
异步POST请求解析JSON 一.创建URL NSURL *url = [NSURL URLWithString:@"http://localhost:8080/MJServer/order ...
- C# LIstbox 解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题
解决WinForm下ListBox控件“设置DataSource属性后无法修改项集合”的问题 分类: winform2008-05-24 02:33 2592人阅读 评论(11) 收藏 举报 winf ...
- 【POJ 3974】 Palindrome
[题目链接] http://poj.org/problem?id=3974 [算法] 解法1 : 字符串哈希 我们可以分别考虑奇回文子串和偶回文子串,从前往后扫描字符串,然后二分答案,检验可以用哈希 ...