语句级触发器与行为触发器

  1. //创建一个对student表的操作记录表
  2. create table log(
  3. update_time timestamp, //操作时间
  4. db_user varchar(40), //操作的数据库用户名
  5. opr_type varchar(6) //操作类型
  6. );
  7. //创建触发器函数
  8. create function log_trigger()
  9. returns trigger as
  10. $$
  11. begin
  12. insert into log values(now(), user, tg_op); //user即为当前用户名; to_op是触发器函数中的特殊变量,代表DML操作类型
  13. return null;
  14. end;
  15. $$
  16. language 'plpgsql';
  • 语句级触发器:执行每个SQL时,只执行一次;
  1. //创建一个语句级触发器
  2. create trigger log_trigger
  3. after insert or delete or update on student
  4. for statement execute procedure log_trigger(); //statement
  5. 之后一个SQL语句无论是插入多条数据,删除多条数据或者更新删除不存在的数据;只要执行成功一个SQL语句,就会触发一次;
  • 行级触发器: 以SQL语句操作后作用到的n行而触发n次;
  1. create trigger log_trigger2
  2. after insert or delete or update on student
  3. for row execute procedure log_trigger();

before触发器和after触发器

  • 语句级别的before触发器在语句开始做任何事情之前就触发;
  • 语句级别的after触发器在语句结束时触发;
  • 行级别的before触发器在特定进行操作之前触发;
  • 行级别的after触发器在语句结束时触发,但会在任何语句级别的after触发器触发之前触发;
  1. //before触发器可以直接修改new值以改变实际的更新值
  2. create function student_new_name_trigger()
  3. returns trigger as
  4. ' //$$
  5. begin
  6. new.student_name = new.student_name || new.student_no;
  7. return new;
  8. end;
  9. ' //$$
  10. language 'plpgsql';
  11. //
  12. create trigger new_name_trigger
  13. before insert or update on student
  14. for each row execute procedure student_new_name_trigger();
  15. //保存的数据student_name会变成要输入的值拼接上student_no

触发器的行为

  • 触发器函数都有返回值;
  • 语句级别的触发器总是返回null,即写为return null;如果没有写会导致出错;
  • 行级beforeinstead of这类行级触发器:

    * 如果返回null,则忽略对当前行的操作;

    * 如果返回非null的行,对insert,update操作来说,返回的行为将成为插入或更新的行;
  • 行级after触发器,其返回值会被忽略;
  • 如果同一事件上有多个触发器,按触发器的名字顺序来触发;
  • 对于行级beforeinstead of这类行级触发器:

    * 每个触发器返回的行将成为下一个触发器的输入;

    * 返回内容为空的话,该行上其他行触发器也不会被触发;

事件触发器

  • 用于弥补PostgreSQL以前版本不支持DDL触发器功能;目前,其支持三种DDL事件;

    * ddl_command_start: 一个DDL开始执行前被触发;

    * ddl_command_end: 一个DDL执行完之后被触发;

    * sql_drop: 删除一个数据库对象前被触发;
  • 由于事件触发器权限较大,所以只有超级用户才能创建修改事件触发器;

创建事件触发器

  • 事件触发器函数的返回类型是event_trigger与普通触发器函数返回类型(trigger)不同;
  1. //一个禁止所有DDL语句的例子
  2. create or replace function abort_any_command()
  3. returns event_trigger
  4. language plpgsql
  5. as
  6. $$
  7. begin
  8. raise exception 'command % is disabled', tg_tag;
  9. end;
  10. $$;
  11. //
  12. create event trigger abort_ddl on ddl_command_start
  13. execute procedure abort_any_command();
  14. //在postgresq中truncate事件是使用普通触发器触发的,事件触发器不会触发truncate table;
  15. //禁止上面定义的事件触发器
  16. alter event trigger abort_ddl disable;
  • 可以从表pg_evnet_trigger中查看已经定义的触发器;

变量

  • 事件触发器函数仅仅支持以下变量
  • tg_event:为ddl_command_start,ddl_command_end,sql_drop之一;
  • tg_tag: 具体的哪种DDL操作,如:create table, drop table等;

修改事件触发器

  1. alter event trigger name [disable | enable];
  2. alter event trigger name enable [replica | always];
  3. alter event trigger name owner to new_owner;
  4. alter event trigger name rename to new_name;

事件触发器记录数据库中对象删除的审计日志

  1. //记录信息表
  2. create table log_drop_objects (
  3. op_time timestamp,
  4. ddl_tag text,
  5. classid oid,
  6. objid oid,
  7. objectsubid oid,
  8. object_type text,
  9. schme_name text,
  10. object_name text,
  11. object_identity text
  12. );
  13. //
  14. create function event_trigger_log_drops()
  15. returns event_trigger
  16. language plpgsql as
  17. $$
  18. declare
  19. obj record;
  20. begin
  21. insert into log_drop_objects select now(), tg_tag, classid, objid, objsubid, object_type,
  22. schema_name, object_name, object_identity from pg_event_trigger_dropped_objects();
  23. end
  24. $$;
  25. //
  26. create event trigger event_trigger_log_drops
  27. on sql_drop
  28. execute procedure event_trigger_log_drops();
  29. //创建一张测试表
  30. create table test (id int primary key, note varchar(20));
  31. //修改字段或删除表再查看记录表中的记录
  32. alter table test drop column note;

表空间

  • 表空间实际上是为表指定一个存储的目录;
  • 创建数据库时可以为数据库指定默认的表空间;创建表和索引时可以指定表空间;

使用

  • 创建:
  1. create tablespace tablespace_name [owner user_name] location 'directory';
  2. //
  3. create tablespace tbs_data location '/data/pgdata';
  • 创建数据库时指定
  1. create database db01 set tablespace tbs_data;
  • 改变数据库默认空间
  1. //在此操作时保证没有其他人连接此数据库,否则会报错;
  2. alter database db01 set tablespace tbs_data;
  3. //数据中已经有的表的表空间不会改变;
  • 建表的时候指定表空间
  1. create table test01 (id int, note text) tablespace tbs_data;
  • 创建索引时指定表空间
  1. create index idx_test01_id on test01(id) tablespace tbs_data;
  • 建唯一约束时可以指定约束索引的表空间
  1. alter table test01 add constraint unique_test01_id unique(id) using index tablespace tbs_data;
  • 增加主键时也可以指定主键索引的表空间
  1. alter table test01 add constraint pk_test01_id primary key(id) using index tablespace tbs_data;
  • 把表从一个空间移动到另一个表空间
  1. //注意在移动表时候会锁表,此时所有对表的操作都会被阻塞;
  2. alter table test01 set tablespace pg_default;

psql-08表:触发器的更多相关文章

  1. 数据库级别DML操作监控审计、表触发器/对象触发器

    使用触发器记录DML,使用触发器记录表的DML 数据库级别DML操作监控审计.表触发器/对象触发器 --创建记录表 CREATE TABLE T_SHALL_LOG ( ID , ) , EVTIME ...

  2. [SQL]insert、update 表触发器应用的demo

    --创建测试表 create table student ( stu_id int ,libraryCardNo varchar() ) create table borrowbook ( b_id ...

  3. TRIGGERS_监测系统_原始数据表触发器—调用告警信息存储过程

    //每次向originaldata表中插入数据就会触发该触发器 create or replace trigger originaldata_to_alarm  after insert on ori ...

  4. Sqlserver数据库 通过表触发器 实时通知应用程序

    /* Sqlserver数据库开始相关服务 以下示例显示了如何查看 OLE Automation Procedures 的当前设置.0未启用 */ EXEC sp_configure 'show ad ...

  5. postgresql 表触发器

    1.先建一个函数,用来执行触发器启动后要执行的脚本 CREATE OR REPLACE FUNCTION "public"."trigger_day_aqi"( ...

  6. Oracle生成多表触发器sql

    --将所有HY开头的表都生成一个更新触发器的脚本('/'是为了连续创建多个触发器而不报错)select 'CREATE OR REPLACE TRIGGER '||table_name||' BEFO ...

  7. Oracle中根据表明获取对应表触发器名称

    Select object_name From user_objects a left join all_triggers b on a.object_Name = b.trigger_name wh ...

  8. SQLSEVER 同台服务器下不同表 触发器实现数据实时同步

    触发器的使用: 1.首先建立两个相同结构的表,两个表明的列的名称不同. student_01   字段  name  ;  字段 age  ; 字段  class ; student_02   字段  ...

  9. JS 08表单操作_表单域

    一.表单的获取方式 document.getElementById() document.forms[index]; document.forms[form_name] document.form_n ...

随机推荐

  1. 【CityHunter】通过Unity3D来制作游戏中AR部分的内容

    嗯,最近再考虑,CityHunter中,玩家攻略藏宝图时,为了增加可玩性,应该增强在AR部分的游戏性.最近特别火的游戏<Pokemon Go>在打开摄像头以后,可以看到小精灵,实际上,如果 ...

  2. 英文写作——冠词的使用(Use 0f Articles)

    1.使用'a','an','the'和不使用冠词的基本规则: <1>泛指,不可数名词不能有任何冠词 <2>泛指,可数,复数名词前不能有冠词 <3>泛指,可数,单数名 ...

  3. 如何扩大LVM 逻辑分区的大小?

    参考: (http://blog.csdn.net/t0nsha/article/details/7296851) LVM (Logical volume management) 执行 df 指令查看 ...

  4. 通过ipv6访问 g o o g l e

    Google.Youtube.Facebook等均支持IPv6访问,IPv4网络的用户大部分都无法访问,比如Gmail,Google Docs等等各种相关服务.而该类网站大部分均已接入IPv6网络,因 ...

  5. [Unity] Shader - CG语言 流程控制语句

    CG语言中: 不支持 switch 语句(可以写,但不能很好的执行.) 循环语句中, 循环次数不能大于 1024 ,否则会报错. If...ELSE 条件判断语句: if (true) { } els ...

  6. redis3.2 最新版本启动配置文件redis.conf详细说明

    Redis.conf文件内容详细说明: # 默认redis不是以后台进程的方式启动,如果需要在后台运行,需要将这个值设置成yes # 以后台方式启动的时候,redis会写入默认的进程文件/var/ru ...

  7. Mongodb启动命令mongod参数说明

    Mongodb启动命令mongod参数说明 mongod的主要参数有: 基本配置 ----------------------------------------------------------- ...

  8. Test Regular Expressions Online with RegExr免费的正则表达式检验网站

    免费的正则表达式检验网站: http://www.regexr.com

  9. PHP图片裁剪与缩放 / 无损裁剪图片

    图片太大且规格不统一,显示的控制需要靠JavaScript来完成,用在移动设备上时显示效果不好且流量巨大,需要对现有图片库的图片进行一次处理,生成符合移动设备用的缩略图,将原来客户端JS做的工作转移到 ...

  10. Linux下提示 bash: xxx command not found

    今天在虚拟机上安装了CentOS5.5,发现运行一些很正常的诸如:init,shutdown,fdisk 等命令时,悍然提示: bash: xxx command not found. 那么,首先就要 ...