HighGo Database触发器使用案例(APP)

Stella981
• 阅读 458

目录

环境

文档用途

详细信息

环境

系统平台:Microsoft Windows (64-bit) 10

版本:5.6.4

文档用途

本文介绍瀚高数据库中查询触发器信息的方法及触发器的使用案例。

详细信息

一、****触发器介绍

HighGo Database触发器是先创建触发器函数,再创建触发器。触发器必须结合触发器函数来使用。

1)pg_trigger表部分字段展示

Name

Type

References

Description

oid

oid

 

Row identifier (hidden attribute; must be explicitly selected)

tgrelid

oid

pg_class``.oid

The table this trigger is on

tgname

name

 

Trigger name (must be unique among triggers of same table)

tgfoid

oid

pg_proc``.oid

The function to be called

tgisinternal

bool

 

True if trigger is internally generated (usually, to enforce   the constraint identified by tgconstraint)

2)列出当前数据库所有触发器

highgo=# select * from pg_trigger;

3)列举出特定表的触发器

highgo=# select pt.* from pg_class pc join pg_trigger pt on pt.tgrelid=pc.oid where relname='table_name';

4) 查询指定模式下的触发器,及其作用的表,使用的触发器函数

highgo=# select pc.oid tableoid, pc.relname "表名",

pt.oid triggeroid, pt.tgname "触发器名",

pp.oid functionoid, pp.proname "触发器函数名"

from pg_trigger pt

join pg_class pc on pc.oid=pt.tgrelid

join pg_namespace pn on pc.relnamespace = pn.oid

left join pg_proc pp on pt.tgfoid=pp.oid

where tgisinternal=false -- 不是系统创建的

and pn.nspname ='schema_name';

二、****触发器使用案例

1)Mysql ON UPDATE CURRENT_TIMESTAMP在hgdb实现

mysql:

CREATE TABLE tab_hgdb_tri_update_yf (

tab_id int(11) NOT NULL AUTO_INCREMENT,

tab_name VARCHAR(10),

insert_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

PRIMARY KEY (tab_id)

);

mysql> insert into tab_hgdb_tri_update_yf(tab_name) VALUES ('12');

mysql> select * from tab_hgdb_tri_update_yf;

+--------+----------+---------------------+---------------------+

| tab_id | tab_name | insert_time    | update_time     |

+--------+----------+---------------------+---------------------+

|   1 | 12     | 2019-11-08 13:40:56 | 2019-11-08 13:40:56 |

+--------+----------+---------------------+---------------------+

mysql> update tab_hgdb_tri_update_yf set tab_name='34' where tab_id=1 ;

Query OK, 1 row affected (0.01 sec)

Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from tab_hgdb_tri_update_yf;

+--------+----------+---------------------+---------------------+

| tab_id | tab_name | insert_time      | update_time      |

+--------+----------+---------------------+---------------------+

|    1 | 34     | 2019-11-08 13:40:56 | 2019-11-08 13:43:02 |

+--------+----------+---------------------+---------------------+

hgdb:

highgo=# CREATE TABLE tab_hgdb_tri_update_yf (

tab_id bigserial NOT NULL,

tab_name varchar(10) NULL,

insert_time timestamp NULL DEFAULT CURRENT_TIMESTAMP::timestamp(0) without time zone,

update_time timestamp NULL,

CONSTRAINT tab_update_default_pkey PRIMARY KEY (tab_id)

);

highgo=# insert into tab_hgdb_tri_update_yf(tab_name) VALUES ('12');

highgo=# select * from tab_hgdb_tri_update_yf;

tab_id | tab_name |      insert_time       | update_time

--------+----------+------------------------+-------------

1 | 12       | 2019-11-08 14:07:02 |

highgo=# CREATE FUNCTION update_timestamp() RETURNS trigger AS $update_timestamp$

BEGIN

NEW.update_time := current_timestamp::timestamp(0) without time zone;

RETURN NEW;

END;

$update_timestamp$ LANGUAGE plpgsql;

highgo=# CREATE TRIGGER update_timestamp

BEFORE INSERT OR UPDATE ON tab_hgdb_tri_update_yf

FOR EACH ROW EXECUTE PROCEDURE update_timestamp();

highgo=# insert into tab_hgdb_tri_update_yf(tab_name) VALUES ('56');

highgo=# select * from tab_hgdb_tri_update_yf;

tab_id | tab_name |  insert_time   |  update_time

--------+----------+------------------------+------------------------

1 | 12    | 2019-11-08 14:07:02 |

2 | 56    | 2019-11-08 14:08:00 | 2019-11-08 14:08:00

highgo=# update tab_hgdb_tri_update_yf set tab_name='01' where tab_id=2;

highgo=# select * from tab_hgdb_tri_update_yf;

tab_id | tab_name |      insert_time       |      update_time

--------+----------+------------------------+------------------------

1 | 12       | 2019-11-08 14:07:02 |

2 | 01       | 2019-11-08 14:08:00 | 2019-11-08 14:08:27

2)触发器实现主键自增id及exception处理

CREATE TABLE tab_emp_seq_yf (

emp_id int,

emp_name varchar(50)

);

create sequence seq_tab_emp_seq_yf_emp_id

minvalue 1

start with 1

increment by 1;

create or replace FUNCTION fun_tri_tab_emp_seq_yf_before_insert() RETURNS trigger AS $tri_fun$

BEGIN

new.emp_id := nextval('seq_tab_emp_seq_yf_emp_id');

RETURN NEW;

exception

when others then

raise notice '%', '异常号:' || substr(to_char(SQLSTATE), 1, 200) || '; 异常信息:' || coalesce(sqlerrm::text,'');

return null; --此处一定要注意,根据自己的业务逻辑选择;如果是return null,则数据不会插入到表;return new,则emp_id列不会插入,其他列的数据会插入到表。

END;

$tri_fun$ LANGUAGE plpgsql;

模拟异常:

drop sequence seq_tab_emp_seq_yf_emp_id;

异常输出信息:

异常号:42P01; 异常信息:relation "seq_tab_emp_seq_yf_emp_id" does not exist

3)before/after insert/update/delete操作

更多详细信息请登录【瀚高技术支持平台】查看https://support.highgo.com/#/index/docContentHighgo/529c561c03b6a1d2

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
SQL Server递归查询在Highgo DB中实现 (APP)
目录环境文档用途详细信息环境系统平台:MicrosoftWindows(64bit)10版本:5.6.4文档用途在HighgoDB中实现和SQLServer一样效果的递归查询详细信息1、SQLServer表创建以及测试数据添加CreatetableGroupInfo(\Id\int,\
Stella981 Stella981
2年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
2年前
SQL Server递归查询在Highgo DB中实现 (APP)
目录环境文档用途详细信息环境系统平台:MicrosoftWindows(64bit)10版本:5.6.4文档用途在HighgoDB中实现和SQLServer一样效果的递归查询详细信息1、SQLServer表创建以及测试数据添加CreatetableGroupInfo(\Id\int,\
Wesley13 Wesley13
2年前
Mysql迁移到highgoDB如何实现ID自增长
目录环境文档用途详细信息环境系统平台:MicrosoftWindows(64bit)2012版本:5.6.4文档用途Mysql数据库迁移到HighGo数据库后,原Mysql表中自增长的ID如何保持自增长?详细信息分两种情况进行处理,具体如下:(1)数据库中已经存在表(tab1),而且已经有数据,而且
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这