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

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 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】事件触发器的更多相关文章

  1. MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器

    ———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 m ...

  2. js事件触发器 dispatchEvent()

    [其实就是自动触发事件,而非手动(交互)触发事件] dispatchEvent是作为高级浏览器(如chrome.Firfox等)的事件触发器来使用的,那么什么是事件触发器?就是触发事件的东西.可能有人 ...

  3. 事件触发器-----dispatchEvent

    不要被标题蒙蔽了,今天的重点不是论述事件触发器,而是说一下dispatchEvent这个东西.好了,先简单做个铺垫,dispatchEvent是作为高级浏览器(如chrome.Firfox等)的事件触 ...

  4. js事件触发器fireEvent和dispatchEvent

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

  5. WPF 精修篇 事件触发器

    原文:WPF 精修篇 事件触发器 事件触发器 一般使用的就是动画 <Grid> <TextBlock Text="事件触发器" Opacity="0.2 ...

  6. javascript事件触发器fireEvent和dispatchEvent

    javascript事件触发器fireEvent和dispatchEvent   事件触发器就是用来触发某个元素下的某个事件,IE下fireEvent方法,高级浏览器(chrome,firefox等) ...

  7. plsql 数据库事件触发器

    --4.数据库事件触发器 需要超管的权限 /* 数据库事件触发器有数据库级和模式级两种. 前者定义在整个数据库上,触发事件是数据库事件,如数据库的启动.关闭,对数据库的登录或退出. 后者定义在模式上, ...

  8. Node.js精进(4)——事件触发器

    Events 是 Node.js 中最重要的核心模块之一,很多模块都是依赖其创建的,例如上一节分析的流,文件.网络等模块. 比较知名的 Express.KOA 等框架在其内部也使用了 Events 模 ...

  9. JAVA GUI学习 - 窗口【x】按钮关闭事件触发器:重写processWindowEvent(WindowEvent e)方法

    public class WindowListenerKnow extends JFrame { public WindowListenerKnow() { this.setBounds(300, 1 ...

随机推荐

  1. J2EE 课件3 JSP标记

    •JSP标记包括指令标记.动作标记和自定义标记.其中自定义标记主要讲述与Tag文件有关的Tag标记    1.指令标记page page 指令用来定义整个JSP页面的一些属性和这些属性的值,属性值用单 ...

  2. [bzoj1507][Usaco2009 Hol]Transmission Delay 传输谍延时_动态规划

    Transmission Delay 传输谍延时 bzoj-1581 Usaco-2009 Hol 题目大意:题目链接. 注释:略. 想法: 动态规划. 首先我们考虑从后往前dp.(最近好多题都是从后 ...

  3. 玲珑杯 ACM Round #12

    A =w= B 占坑 C 题意:有长度为n的序列A和长度为n的序列W,以及一个G,对于Ui,1<=Ui<=Wi,求Σgcd(Ai,Ui)=G的方案数,n<=1e3,Ai<=1e ...

  4. js二叉树,前序/中序/后序(最大最小值,排序)

    function Node(data,left,right) { this.left=left this.right=right this.data=data } function Btr() { t ...

  5. 关于new和malloc以及delete和free能否够混用

    /* *1>当申请的空间是内置类型时,delete和free能够混用 *2>当申请的空间是自己定义类型时, *       1>若没有析构函数.delete和malloc能够混用.有 ...

  6. android 请求网络异步载入

    /** * 封装ProecssDialog对话框 * */ public class LoadDialog extends ProgressDialog { private String title ...

  7. C#之反射(PropertyInfo类)

    1.引入命名空间:System.Reflection:程序集:mscorlib(在mscorlib.dll中) 2.示例代码(主要是getType().setValue().getValue()方法) ...

  8. PowerDesigner中导入MYSQL数据库结构的步骤及问题解决

    今天在使用PowerDesigner,要导入MySql的表结构到PowerDesginer里, 记录下详细的操作步骤: 1.首先要确保机器安装了MySql的ODBC驱动,去http://dev.mys ...

  9. Android中关于横竖屏问题

    一.屏幕的方向可以在AndroidManifest.xml文件中通过设置screenOrientation属性来实现, screenOrientation用来指定Activity的在设备上显示的方向, ...

  10. Knowing When to Use Override and New Keywords (C# Programming Guide)

    https://msdn.microsoft.com/en-us/library/ms173153.aspx In C#, a method in a derived class can have t ...